2

我有一些代码如下。我正在尝试搜索哈希,如果遇到一个为零的值,我想删除整个键/值元素。

my %hashy = (
    a => my $a,
    b => my $b,
    c => my $c,
    d => my $d,
    e => my $e
);

$hashy{'a'} = 0;
$hashy{'b'} = 1;
$hashy{'c'} = 0;
$hashy{'d'} = 2;
$hashy{'e'} = 1;
my @keys = keys %hashy;
my @values = values %hashy;
my $ind = 0;
foreach my $v (@values) {
   delete $hashy{$keys[$ind]} if ($v == 0);
}

所以打印的预期输出%hashy将是:(b1d2e1忽略元素的顺序)

目前我得到:c0a0b1d2这甚至不接近......任何帮助将不胜感激:)

4

2 回答 2

6

迭代值无济于事,因为您失去了值和键之间的关联,尽管我猜这$ind应该可以帮助您跟踪。

只需遍历键即可:

foreach my $k (keys %hashy) {
    delete $hashy{$k} if ($hashy{$k} == 0);
}
于 2012-09-07T08:28:05.637 回答
3

另一种方法:

delete @hash{ grep $hash{$_} == 0, keys %hash };
于 2012-09-07T11:33:28.077 回答