2

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

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

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

}

4

3 回答 3

3

在使用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;
}
于 2013-07-10T13:24:29.597 回答
2

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

于 2013-07-10T13:24:18.160 回答
0

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

如果您在迭代哈希时添加或删除元素,您可能会跳过或重复条目,所以不要这样做。

于 2013-07-11T09:53:18.920 回答