加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:06:24 所属栏目:大数据 来源:网络整理
导读:我需要根据正则表达式过滤哈希值,如果正则表达式匹配则从哈希中删除键. 这是我到目前为止,不幸的是它没有做任何事情,我不知道为什么. 所以,我正在构建一个字符串数组的正则表达式,我也需要匹配子字符串,所以如果哈希键是someprefix_somestring我需要匹配some
我需要根据正则表达式过滤哈希值,如果正则表达式匹配则从哈希中删除键.

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

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

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 =>因为someprefix_somekey和otherprefix_somekey会匹配$regex,因此会从哈希中删除

我不知道为什么这不起作用,请赐教

感谢hobbs回答我能够使它工作,这就是我现在拥有的:

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

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

解决方法

您的删除操作不正确,因为您使用符号来访问单个键,因此grep在标量上下文中运行.这意味着如果有三个键与你的正则表达式不匹配,最终你会尝试删除$hashref-> {‘3’}.

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

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

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

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

这可能会更自然地阅读.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读