从perl中的哈希映射中删除与数组中的值匹配的键

时间:2013-07-22 21:42:57

标签: arrays perl hash key

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

1 个答案:

答案 0 :(得分:3)

简单:

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

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

      delete @hash{@matching_keys};
    }
    
  3. 如果您要优化可读性而不是速度,0 <= index $_, $elem也可以写为/\Q$elem/


    或者:构建一个匹配数组中所有元素的正则表达式:

    my $rx = join '|', map quotemeta, @array;
    

    然后,选择并删除与此正则表达式匹配的所有键:

    my @matching_keys = grep /$rx/, keys %hash;
    delete @hash{@matching_keys};
    

    这应该更有效率。