在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 ]};
}
}
}
}
答案 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()
对此很清楚。
如果在迭代时添加或删除哈希的元素 它,你可能会跳过或复制条目,所以不要。