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