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 に答える