在使用"each"迭代哈希时添加新成员



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

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

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 ]};
                        }
                }
        }

}

在使用each迭代哈希时,添加或删除哈希的条目通常是不安全的。如果您想这样做,最好保存一个要迭代到数组的键的显式列表,然后循环。

代替

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

进行

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

它不安全。如果你这样做,你会得到一个警告:"在插入后对hash使用each()而不重置hash迭代器会导致未定义的行为。"

each()的文档对此非常清楚。

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

最新更新