【发布时间】:2019-04-18 02:07:49
【问题描述】:
我正在处理 Perl 中的哈希。
我使用以下语句来检查变量是否与哈希表中的键匹配。该语句已经评估为真。所以 grep 工作。但是我现在如何检索匹配的哈希键和值?
if ( grep {/.*$var1*/} keys %my_hash ) {
#print the key and value that results from the grep?
}
【问题讨论】:
我正在处理 Perl 中的哈希。
我使用以下语句来检查变量是否与哈希表中的键匹配。该语句已经评估为真。所以 grep 工作。但是我现在如何检索匹配的哈希键和值?
if ( grep {/.*$var1*/} keys %my_hash ) {
#print the key and value that results from the grep?
}
【问题讨论】:
您可以在条件中提取所有匹配的键:
if (my @matches = grep /.*$var1*/, keys %my_hash) {
my @values = @my_hash{@matches};
}
另外,/.*$var1*/ 很奇怪。您想将最后的星号应用于变量中最后出现的任何内容吗?此外,如果没有 /g,则在开头使用 .* 不会有任何效果:/$var1*/ 会同样工作(而且可能更快)。
【讨论】:
if (@captarr= grep {/.*$var1*/} keys %my_hash ) {
}
@captarr = grep (/.*$var1*/, keys %my_hash) 是一个 2 参数函数;
第一个是正则表达式,第二个是应用正则表达式的数组,
返回匹配的数组,就像第二个参数一样。 array 是由数组组成的一个字符串,在全局中搜索,它会
如果没有匹配,则返回 nul。
它类似于 @captarr = $my_str ~= /.*$var1*/ 交换参数位置的 LHS ~= RHS
【讨论】:
$_ 设置为列表中当前条目的值,即第二个参数。如果块评估为真值,则将$_ 的当前值添加到“匹配”项列表中;如果它是假的,我们继续第二个参数中的下一项。 map 类似,但它在块执行后返回$_ 的每个值。