Regex 带子字符串的密钥存在性测试
我有一个多维散列/数组,它使用datadumper看起来像这样Regex 带子字符串的密钥存在性测试,regex,perl,hash,Regex,Perl,Hash,我有一个多维散列/数组,它使用datadumper看起来像这样 { 'Customer' => {'123abc' => {'status' => {'New' => {'email'=>['user@xxx.com' ],
{
'Customer' => {'123abc' =>
{'status' =>
{'New' =>
{'email'=>['user@xxx.com' ],
'template' => 'XYZ' }
}
},
'234' =>
{'status' =>
{'New' =>
{'email' => ['user@xxx.com' ],
'template' => 'XYZ' }
}
}
$customers = ("123abc", "234abc", "adb234");
我需要根据数组值的完全或部分匹配来测试是否存在客户
我用于完全匹配的代码运行良好
foreach (@customers) {
if ($config->{Customer}->{$customers[0]}) {
do something
} }
这将返回“123abc”上的匹配项
但是,如果$customers[0]中有字符串234,或者在没有数组$customers的情况下仅使用字符串进行测试,则无法使其匹配
我试过了
if (/.234*$/ ~~ %config->{Customer})
基于此网站“打印”上的智能匹配示例,我们有一些青少年\n“if/*teen$/~~%h;”
及
以及在正则表达式的开头使用m。{m/234/}
乔恩
这是用perl编写的。看起来您希望对所有键进行grep
my @keys = grep { /234/ } keys %{$config->{Customer}};
if (@keys) {
# do something, but check for multiple matches...
}
Grep返回块计算结果为true的所有元素,每个元素用$表示。正则表达式匹配(//)默认为与$匹配。上述声明可以改写为
my @keys = grep { $_ =~ /234/ } keys %{$config->{Customer}};
if (@keys) {
# do something, but check for multiple matches...
}
但只要您熟悉perl,这是多余的。234 in$customers[0]应该与什么匹配?“234abc”、“adb234”这两个词??如果你用传统的
“value”=~/regex/
语法替换智能匹配/regex/~~“value”
语法会怎么样?另外,regex/.234*$/
看起来有点过时;您可能指的是/.*234$/
,它更优雅地写为/234$/
。引用$config->{Customer}
引用的哈希的正确方法是%{$config->{Customer}
。您当然不能使用正则表达式作为散列键;它将被简单地解释为一个文本字符串$config->{m/234/'}
。如果你使用strict,很多事情都会变得清晰;使用警告正如每一个Perl教程所告诉你的,我没有使用正则表达式作为散列键。它们的键将只包含我想要匹配的子字符串,即“234”。问题是使用该值来确定包含该字符串的另一个哈希中是否存在键,即adc234、234adb。如您所建议的,使用常规正则表达式意味着在配置散列中循环我正在循环的数组中的每个元素的键。至于234对234,我遵循的例子是在结尾查找青少年,我在开始查找字符串,因此在结尾查找*号,假设*是一个通配符。当我在星期二回来时,当我面前有脚本时,我必须考虑一下这一点。脚本的整个流程是将xml配置文件读入哈希/数组。然后将文件读入具有订单号和状态的散列。然后执行SQL查询并将结果写入数组。然后它循环遍历数组,并使用状态散列测试状态差异。如果发现更改,则匹配配置哈希中的客户和状态,如果发现匹配,则执行附加处理。在精确匹配上效果很好,但我需要使用配置数组中的一个条目匹配sql结果数组中的多个客户。
my @keys = grep { $_ =~ /234/ } keys %{$config->{Customer}};
if (@keys) {
# do something, but check for multiple matches...
}