Как уже указывалось 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;
Sure , Я пытаюсь упростить сравнение нескольких массивов, не воссоздавая еще одну структуру данных. Я думаю, однако, то, что полезно для меня, может оказаться не полезным для вас и наоборот. – mjp
Вы можете использовать grep/map для фильтрации/преобразования/добавления элементов в список и присвоить его массиву. –