perl,从for循环中的数组中删除元素

com*_*ose 5 arrays iteration perl data-manipulation

以下代码是否始终在perl中运行?

for loop iterating over @array {
  # do something
  if ($condition) {
     remove current element from @array
  }
}
Run Code Online (Sandbox Code Playgroud)

因为我在Java中知道这导致了一些异常,上面的代码现在对我有用,但我想确保它适用于perl中的所有情况.谢谢

rai*_*7ow 12

好吧,它在文档中说:

如果LIST的任何部分是一个数组,如果在循环体内添加或删除元素,foreach将会非常困惑,例如使用splice.所以不要这样做.

每个都好一点:

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

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

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

@some_array = grep {
  # do something with $_
  some_condition($_);
} @some_array;
Run Code Online (Sandbox Code Playgroud)

  • 快速注意......应该更改`grep`示例最后一行以删除`return`.内联子的最后一行用作条件,以确定是否应该包含它.(`return`给出语法错误) (3认同)
  • 是的,文档说不要在 foreach 循环中删除/添加元素,但是 C 风格的 for 循环呢: for (my $i=0; $i<@array; $i++) ? (2认同)