使用“each”迭代哈希时添加新成员

时间:2013-07-10 13:19:12

标签: perl hash perl5 perl5.10

在perl 5.10.1中,使用each运算符迭代它时,是否可以向哈希添加新成员?

不便。就像在这段代码中(为Google图表准备数据),我有一个哈希的数组哈希,我试图移动每个数组的最后一个元素:

sub split_aclr($) {
        my $csvData = shift;

        while (my ($csv, $href) = each %$csvData) {
                next unless $csv =~ /_ACLR_/i;
                my $len = scalar @{$href->{MEASUREMENT}};

                if ($len > 1 && $href->{MEASUREMENT}->[$len - 1] eq 'CARRIER_CHANNEL') {
                        while (my ($key, $arr) = each %$href) {
                                my $moved = pop @$arr;
                                $csvData{$csv . '_CARRIER_CHANNEL'} = {$key => [ $moved ]};
                        }
                }
        }

}

3 个答案:

答案 0 :(得分:3)

使用each进行迭代时,添加或删除哈希条目通常是不安全的。如果你想这样做,最好保存你想要迭代到数组的明确的键列表,然后循环它。

而不是

while (my $k, $v) = each %hash) {
  $hash{"foo_$k"} = $v;
}

DO

my @keys = keys %hash;
for my $k (@keys) {
  my $v = $hash{$k};
  $hash{"foo_$k"} = $v;
}

答案 1 :(得分:2)

这不安全。如果你这样做,你会收到一个警告:“插入后在散列上使用each()而不重置散列迭代器会导致未定义的行为。”

答案 2 :(得分:0)

documentation for each()对此很清楚。

  

如果在迭代时添加或删除哈希的元素   它,你可能会跳过或复制条目,所以不要。