1

我想使用 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,
           )
4

1 回答 1

4

简单的:

  1. 对于数组中的每个元素,选择匹配的哈希键

    for my $elem (@array) {
      my @matching_keys = grep { 0 <= index $_, $elem } keys %hash;
    
  2. 然后,删除具有匹配键的哈希条目:

      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};

这应该更有效率。

于 2013-07-22T21:48:34.383 回答