4

在遍历数组时,允许对数组进行哪些操作?是否可以在不混淆迭代器的情况下移动/取消移动、弹出/推送、删除元素?

从哈希中添加/删除键值对有什么不同吗?

谢谢您的帮助。

4

2 回答 2

5

您可以分配给现有元素,但不应添加或删除它们。所以没有移位、取消移位、弹出、推送或拼接。 perlsyn

如果 LIST 的任何部分是一个数组,如果你在循环体中添加或删除元素,foreach 将变得非常混乱,例如使用 splice。所以不要那样做。

如果您使用 迭代哈希each,则还应避免添加或删除元素,除非明确允许您删除当前元素。 每个

如果在迭代时添加或删除散列的元素,对迭代器的影响是未指定的;例如,条目可能会被跳过或重复——所以不要那样做。例外:删除 each() 最近返回的项目总是安全的,因此以下代码可以正常工作:

但正如它所说,可能发生的最坏情况是条目被跳过或重复;另一方面,修改您正在循环的数组可能会导致段错误。

于 2014-10-23T07:55:13.417 回答
2

正如 ysth 已经指出的那样,在直接迭代其元素时尝试修改数组是不明智的。

但是,如果确实想根据元素值修改数组,则诀窍是以反向索引顺序进行。

例如,假设我有一个数字数组。我想修改数组,以便每个 4 的倍数在其后插入一个字符串,并删除每个 5 的倍数。我将使用以下方法完成此操作:

use strict;
use warnings;

my @array = ( 1 .. 20 );

for my $i ( reverse 0 .. $#array ) {
    # Insert after multiples of 4
    if ( ( $array[$i] % 4 ) == 0 ) {
        splice @array, $i + 1, 0, "insert";
    }

    # Remove multiples of 5
    if ( ( $array[$i] % 5 ) == 0 ) {
        splice @array, $i, 1;
    }
}

use Data::Dump;
dd @array;

输出:

(
  1 .. 4,
  "insert",
  6,
  7,
  8,
  "insert",
  9,
  11,
  12,
  "insert",
  13,
  14,
  16,
  "insert",
  17,
  18,
  19,
  "insert",
)

或者,如果要转换数组,也可以map像这样使用:

my @newarray = map {
    (   ( ($_) x !!( $_ % 5 ) ),         # Remove multiples of 5
        ( ('insert') x !( $_ % 4 ) ),    # Insert After multiples of 4
        )
} ( 1 .. 20 );

use Data::Dump;
dd @newarray;
于 2014-10-23T22:32:44.273 回答