我想使用Perl从哈希映射中删除与给定数组中的值匹配的键。
示例:
输入:
@array = ("apple", "banana" , "cherry")
%hash = ( '/abc/apple/somestring' => val1,
'/banana/somestring/somesting' => val2,
'/xyz/apple/somestring' => val3,
'/somestring/somestring/' => val4,
'/xyz/somestring/random' => val2,
)
输出:
%hash = ( '/somestring/somestring/' => val4,
'/xyz/somesting/random' => val2,
)
答案 0 :(得分:3)
简单:
对于数组中的每个元素,选择匹配的哈希键
for my $elem (@array) {
my @matching_keys = grep { 0 <= index $_, $elem } keys %hash;
然后,使用匹配的键删除哈希条目:
delete @hash{@matching_keys};
}
如果您要优化可读性而不是速度,0 <= index $_, $elem
也可以写为/\Q$elem/
。
或者:构建一个匹配数组中所有元素的正则表达式:
my $rx = join '|', map quotemeta, @array;
然后,选择并删除与此正则表达式匹配的所有键:
my @matching_keys = grep /$rx/, keys %hash;
delete @hash{@matching_keys};
这应该更有效率。