Perl中在for循环中删除数组元素

5
以下代码在 Perl 中是否总是有效?
for loop iterating over @array {
  # do something
  if ($condition) {
     remove current element from @array
  }
}

因为我知道在Java中这会导致一些异常,但是上面的代码目前对我有用,但我想要确保它在perl的所有情况下都可以正常工作。谢谢。

1个回答

12

好的,在文档中有这样一句话:

如果LIST的任意部分是一个数组,在循环体内添加或删除元素将使foreach混乱,例如使用splice。所以不要这样做。

each稍微好一点:

如果在迭代哈希表时添加或删除哈希表的元素,则可能会跳过或重复条目 - 所以不要这样做。例外情况:在当前实现中,始终删除由each()最近返回的项目是安全的,因此以下代码可以正常工作:

 while (($key, $value) = each %hash) {
    print $key, "\n";
    delete $hash{$key}; # This is safe
  }

但我想这里最好的选择就是只使用grep

@some_array = grep {
  # do something with $_
  some_condition($_);
} @some_array;

2
对的,文档说在 foreach 循环中不要添加或删除元素,但是对于 C 风格的 for 循环:for (my $i=0; $i<@array; $i++) 呢? - comatose
1
啊,那是另一回事了。这应该是安全的,因为在for检查退出条件时,您基本上只需计算数组的长度。 - raina77ow
3
快速记录... grep 示例的最后一行应该被更改以删除 return。内联子程序的最后一行用作条件来确定是否应包含它(return 会导致语法错误)。 - jkerian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接