3

正規表現に基づいてハッシュをフィルタリングし、正規表現が一致する場合はハッシュからキーを削除する必要があります。

これは私がこれまでに得たものですが、残念ながら何もしません。理由はわかりません。

したがって、文字列の配列から正規表現を構築しています。部分文字列も一致させる必要があるため、ハッシュsomeprefix_somestringキーsomestringstring

my $hashref = {someprefix_somekey => 'somevalue', otherprefix_otherkey => 23, otherprefix_somekey => 'someothervalue'};
my @array_of_strings = ('somekey', 'strings', 'bits', 'bobs');

my $regex = join( '|', sort { length( $b ) <=> length( $a ) or $a cmp $b } @array_of_strings );
$regex    = qr{($regex)};

delete $hashref->{ grep { !m/$regex/ } keys %$hashref };

その後、$hashref次のようになると予想されます。{otherprefix_otherkey => 23}someprefix_somekeyotherprefix_somekey$regex

これが機能しない理由がわかりません。教えてください

Hobbs answer のおかげで、私はそれを機能させることができました。これが私が今持っているものです:

my $hashref = {someprefix_somekey => 'somevalue', otherprefix_otherkey => 23, otherprefix_somekey => 'someothervalue'};
my @array_of_strings = ('somekey', 'strings', 'bits', 'bobs');

my $regex = join( '|', sort { length( $b ) <=> length( $a ) or $a cmp $b } @array_of_strings );
$regex    = qr{($regex)};

delete @{$hashref}{grep { m/$regex/ } keys %$hashref };
4

1 に答える 1

7

表記法を使用して単一のキーにアクセスしているため、これは正しくありませdeleteん。したがって、grepはスカラー コンテキストで実行されます。delete $hashref->{'3'}つまり、最終的には、正規表現に一致しないキーが 3 つある場合のようなことをしようとしています。

最後の行をこれに変更すると、動作するはずです:

delete @{$hashref}{grep /$regex/, keys %$hashref };

ハッシュスライスを使用します。構文が醜すぎると思われる場合は、次のこともできます

delete $hashref->{$_} for grep /$regex/, keys %$hashref;

もう少し自然に読めるかもしれません。

于 2013-07-07T20:07:45.597 に答える