首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Terraform嵌套条件以模仿mimic if

Terraform嵌套条件以模仿mimic if
EN

Stack Overflow用户
提问于 2022-11-13 16:27:43
回答 2查看 30关注 0票数 0

我需要帮助检查下面嵌套的条件,在我的生活中,我无法找到导致逻辑被破坏的语法错误。问题不在于逻辑本身,尽管我承认它有点混乱,但在语法中,我是如何将一个条件分支连接到另一个条件分支的

代码语言:javascript
复制
"(${length(regexall("(?i)READ$", "${trimspace(each.value.access_type)}" )) > 0 ? 
 "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__R" : (
 ${length(regexall("(?i)READ_WRITE", "${trimspace(each.value.access_type)}" )) > 0
 "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RW" : (
 ${length(regexall("(?i)READ_WRITE_CTRL", "${trimspace(each.value.access_type)}" )) > 0
 "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RWC" : null))})"

水流在地形洞期间立即停止,有以下错误:

此字符不在语言中使用。

引用的字符串不可能分割成多行。要生成多行字符串,可以使用\n转义来表示换行符,也可以使用"heredoc“多行模板语法。

期望表达式的开始,但发现一个无效的表达式令牌。

下面是一个不使用嵌套条件的功能版本:

代码语言:javascript
复制
"${length(regexall("(?i)READ$", "${trimspace(each.value.access_type)}" )) > 0 ? 
"_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__R" : 
"TEST"}"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-13 16:52:09

语法非常不正确,我在下面通过插入缺失的元素对其进行了更正,为此,我对缩进进行了改进,因为您可以看到,查找缺少的内容要简单得多:

代码语言:javascript
复制
"(${
length(regexall("(?i)READ$", "${trimspace(each.value.access_type)}" )) > 0 
  ? "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__R" 
  : "(${
    length(regexall("(?i)READ_WRITE", "${trimspace(each.value.access_type)}" )) > 0 
      ? "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RW" 
      : "(${
          length(regexall("(?i)READ_WRITE_CTRL", "${trimspace(each.value.access_type)}" )) > 0 
            ? "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__RWC" 
            : null
        })"
    })"
})"

正如你所看到的,这是一件令我好奇的事情,我想知道它是否仍然不起作用。

票数 2
EN

Stack Overflow用户

发布于 2022-11-14 20:16:27

我意识到这并不是直接回答您的问题,但下面是使用查找表和单个正则表达式查找来表示此映射规则的另一种可能的方法,您可能会发现维护起来更容易:

代码语言:javascript
复制
locals {
  access_type_suffixes = tomap({
    "READ"            = "R"
    "READ_WRITE"      = "RW"
    "READ_WRITE_CTRL" = "RWC"
  })

  access_rule_types = tomap({
    for k, v in WHATEVER_YOUR_FOR_EACH_CURRENTLY_REFERS_TO :
    k => regex("(?i)(?:READ(?:_WRITE(?:_CTRL)?)?)?", v.access_type)
  })
}

resource "example" "example" {
  for_each = WHATEVER_YOUR_FOR_EACH_CURRENTLY_REFERS_TO

  this_thing = "_AR_${substr("${split(",", trimspace(each.value.parameter_names))[0]}", 9, -1)}__${substr("${split(",", trimspace(each.value.parameter_names))[1]}", 7, -1)}__${local.access_rule_suffixes[local.access_rule_types[each.key]]}"
}

这里的想法是使用一个regex模式来匹配每个访问类型中READ_WRITE_CTRL字符串最长的有效前缀,并将它们收集到local.access_rule_types中的一个映射中。然后,另一个本地值local.access_type_suffixes充当从长名称到短后缀的映射表,因此您只需要写出这个复杂的字符串模板表达式一次,并引用这两个映射的适当元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74422737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档