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 に答える