我需要根据正则表达式过滤哈希值,如果正则表达式匹配,则从哈希中删除键。
这是我到目前为止所得到的,不幸的是它没有做任何事情,我不知道为什么。
所以,我正在构建一个字符串数组的正则表达式,我也需要匹配子字符串,所以如果哈希键是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_somekey
和otherprefix_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 };
答案 0 :(得分:7)
您的delete
不太正确,因为您使用符号来访问单个密钥,因此grep
在标量上下文中运行。这意味着,如果有三个键与您的正则表达式不匹配,最终您会尝试执行delete $hashref->{'3'}
之类的操作。
如果您将最后一行更改为此,则应该有效:
delete @{$hashref}{grep /$regex/, keys %$hashref };
使用哈希切片。如果您认为语法太难看,您也可以
delete $hashref->{$_} for grep /$regex/, keys %$hashref;
可能会更自然地阅读。