【问题标题】:perl, removing elements from array in for loopperl,在for循环中从数组中删除元素
【发布时间】:2013-05-29 12:01:53
【问题描述】:

以下代码在 perl 中是否始终有效?

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

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

【问题讨论】:

    标签: arrays perl iteration data-manipulation


    【解决方案1】:

    嗯,doc里说的:

    如果 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;
    

    【讨论】:

    • 对,文档说不要在 foreach 循环中删除/添加元素,但是 C 风格的 for 循环呢: for (my $i=0; $i
    • 啊,那是另一个故事了。这应该是安全的,因为您基本上只是在每次for 检查退出条件时计算数组的长度。
    • 快速注释...grep 示例最后一行应更改为删除return。 inline sub 的最后一行用作条件来确定是否应包含它。 (return 给出语法错误)
    猜你喜欢
    • 2013-05-04
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    • 2012-02-15
    • 2013-07-29
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多