Perl:根据值删除哈希中的元素

gio*_*ano 1 perl hash

我有一个哈希并想删除一些元素(元素=键+值)。通过键删除元素很容易,但我不知道如果删除条件基于值该怎么办。

my %h = (  'a' => 1
         , 'b' => 1
         , 'c' => 2
       );

# delete by key
delete $h{'c'};

print map { "$_ $h{$_}\n" } keys %h;
# a 1
# b 1
Run Code Online (Sandbox Code Playgroud)

我想使用以下值删除:

delete %h value >1
Run Code Online (Sandbox Code Playgroud)

Sha*_*awn 5

您可以有效地循环使用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);
Run Code Online (Sandbox Code Playgroud)

文档each(添加强调)

任何对散列的插入都可能会改变顺序,任何删除也可能会改变顺序,但每个或多个键返回的最新键可能会被删除而不改变顺序。

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


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

delete @h{grep { $h{$_} > 1 } keys %h};
Run Code Online (Sandbox Code Playgroud)