perl - 使用匹配正则表达式的密钥过滤哈希而不使用smartmatch

时间:2013-07-07 20:02:23

标签: regex perl hash grep

我需要根据正则表达式过滤哈希值,如果正则表达式匹配,则从哈希中删除键。

这是我到目前为止所得到的,不幸的是它没有做任何事情,我不知道为什么。

所以,我正在构建一个字符串数组的正则表达式,我也需要匹配子字符串,所以如果哈希键是someprefix_somestring我需要匹配somestring或{{ 1}}

string

我希望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的回答,我能够让它发挥作用,这就是我现在所拥有的:

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

1 个答案:

答案 0 :(得分:7)

您的delete不太正确,因为您使用符号来访问单个密钥,因此grep在标量上下文中运行。这意味着,如果有三个键与您的正则表达式不匹配,最终您会尝试执行delete $hashref->{'3'}之类的操作。

如果您将最后一行更改为此,则应该有效:

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

使用哈希切片。如果您认为语法太难看,您也可以

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

可能会更自然地阅读。