在遍历数组时,允许对数组进行哪些操作?是否可以在不混淆迭代器的情况下移动/取消移动、弹出/推送、删除元素?
从哈希中添加/删除键值对有什么不同吗?
谢谢您的帮助。
您可以分配给现有元素,但不应添加或删除它们。所以没有移位、取消移位、弹出、推送或拼接。 perlsyn:
如果 LIST 的任何部分是一个数组,如果你在循环体中添加或删除元素,foreach 将变得非常混乱,例如使用 splice。所以不要那样做。
如果您使用 迭代哈希each
,则还应避免添加或删除元素,除非明确允许您删除当前元素。 每个:
如果在迭代时添加或删除散列的元素,对迭代器的影响是未指定的;例如,条目可能会被跳过或重复——所以不要那样做。例外:删除 each() 最近返回的项目总是安全的,因此以下代码可以正常工作:
但正如它所说,可能发生的最坏情况是条目被跳过或重复;另一方面,修改您正在循环的数组可能会导致段错误。
正如 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;