Perl:根据它们的值删除hash中的元素



我有一个散列,想要删除一些元素(element=key+value(。按键删除元素很容易,但如果删除的条件是基于值的,我不知道该怎么办。

my %h = (  'a' => 1
, 'b' => 1
, 'c' => 2
);
# delete by key
delete $h{'c'};
print map { "$_ $h{$_}n" } keys %h;
# a 1
# b 1

我想删除使用值:

delete %h value >1

您可以有效地循环使用eachdelete匹配的条目:

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my %h = (
'a' => 1,
'b' => 1,
'c' => 2
);
while (my ($k, $v) = each %h) {
delete $h{$k} if $v > 1;
}
print Dumper(%h);

来自each文档(添加重点(:

任何对哈希的插入都可能改变顺序,任何删除都可能改变,除了每个键返回的最新键可以在不改变顺序的情况下删除

这意味着上面的循环可以安全地查看哈希的每个元素,并删除所有符合条件的元素。


您还可以使用切片一次删除多个条目。只需构建一个要删除的密钥列表,例如通过过滤keys:的结果

delete @h{grep { $h{$_} > 1 } keys %h};

最新更新