如何忽略列表中的值?
How to ignore a value in list?
我有一个字符串列表,我想忽略该列表中的某些元素。例如我的列表
variable domain_names = {
type = list(string)
}
domain_names = ["foo.com","*.foo.com","*.foo2.com","bar.co.in"]
output = [ "foo.com","bar.co.in"]
我想忽略任何以 * 开头的内容并从中创建一个新列表。我怎样才能做到这一点?
我试图让这个模块更健壮以处理多个域名
locals {
distinct_domain_name = distinct(var.domain_names)
}
resource "aws_acm_certificate" "main" {
count = length(local.distinct_domain_name)
domain_name = local.distinct_domain_name[count.index]
subject_alternative_names = [slice(var.domain_names, 1, length(var.domain_names))]
validation_method = var.validation_method
tags {
Name = local.distinct_domain_name[count.index]
owner = "xxx"
terraform = "true"
}
}
当我们的目标是过滤列表时,通常从 for
expression 和 if
子句开始。这允许我们为每个元素做出决定,但提出了使用什么表达式来做出决定的问题。
对于“我们如何检测字符串是否具有特定前缀?”的问题。我认为至少有几种不同的方法可以完成这项工作,但最简洁的方法可能是使用正则表达式,通过 regexall
,如果至少有一个匹配项,则 return 为真:
length(regexall("^\*\.", domain_name)) > 0
我这里用的是regexall
而不是regex
是因为regex
定义为return如果没有就报错匹配——它至少需要一个——而 regexall
让我们自己处理零匹配情况。
将其与 for
表达式相结合将得到以下结果:
[ for domain_name in var.domain_names : domain_name if length(regexall("^\*\.", domain_name)) > 0 ]
上面生成了一个 do 以 *.
作为前缀的列表。我们可以否定该表达式以产生相反的子集:
[ for domain_name in var.domain_names : domain_name if length(regexall("^\*\.", domain_name)) == 0 ]
我有一个字符串列表,我想忽略该列表中的某些元素。例如我的列表
variable domain_names = {
type = list(string)
}
domain_names = ["foo.com","*.foo.com","*.foo2.com","bar.co.in"]
output = [ "foo.com","bar.co.in"]
我想忽略任何以 * 开头的内容并从中创建一个新列表。我怎样才能做到这一点?
我试图让这个模块更健壮以处理多个域名
locals {
distinct_domain_name = distinct(var.domain_names)
}
resource "aws_acm_certificate" "main" {
count = length(local.distinct_domain_name)
domain_name = local.distinct_domain_name[count.index]
subject_alternative_names = [slice(var.domain_names, 1, length(var.domain_names))]
validation_method = var.validation_method
tags {
Name = local.distinct_domain_name[count.index]
owner = "xxx"
terraform = "true"
}
}
当我们的目标是过滤列表时,通常从 for
expression 和 if
子句开始。这允许我们为每个元素做出决定,但提出了使用什么表达式来做出决定的问题。
对于“我们如何检测字符串是否具有特定前缀?”的问题。我认为至少有几种不同的方法可以完成这项工作,但最简洁的方法可能是使用正则表达式,通过 regexall
,如果至少有一个匹配项,则 return 为真:
length(regexall("^\*\.", domain_name)) > 0
我这里用的是regexall
而不是regex
是因为regex
定义为return如果没有就报错匹配——它至少需要一个——而 regexall
让我们自己处理零匹配情况。
将其与 for
表达式相结合将得到以下结果:
[ for domain_name in var.domain_names : domain_name if length(regexall("^\*\.", domain_name)) > 0 ]
上面生成了一个 do 以 *.
作为前缀的列表。我们可以否定该表达式以产生相反的子集:
[ for domain_name in var.domain_names : domain_name if length(regexall("^\*\.", domain_name)) == 0 ]