2014-10-23 5 views
3

Какие операции разрешены для массива, итерации через него? Можно ли сдвинуть/не сдвинуть, поп/толчок, удалить элементы, не запутывая итератор?perl - операции, разрешенные для массива при повторении через него

Это что-то другое для добавления/удаления пары ключ-значение из хэша?

Благодарим за помощь.

+0

Sure , Я пытаюсь упростить сравнение нескольких массивов, не воссоздавая еще одну структуру данных. Я думаю, однако, то, что полезно для меня, может оказаться не полезным для вас и наоборот. – mjp

+1

Вы можете использовать grep/map для фильтрации/преобразования/добавления элементов в список и присвоить его массиву. –

ответ

4

Вы можете назначить существующим элементам, но не должны их добавлять или удалять. Так что никаких сдвигов, смещений, поп, толчок или сращивание не происходит. perlsyn:

Если какая-либо часть LIST является массивом, Еогеасп получите очень смущен, если добавить или удалить элементы в теле цикла, например, с сращивания. Так что не делай этого.

Если вы итерация хэша с each, вы должны также избегать добавления или удаления элементов, за исключением того, что вы явно разрешено удалить текущий элемент. each:

Если вы добавляете или удаляете элементы хэша во время итерации по нему, влияние на итератор не указывается; например, записи могут быть пропущены или дублированы - так что не делайте этого. Исключение: всегда можно удалить элемент, который был недавно возвращен каждым(), поэтому следующий код работает должным образом:

Но, как говорится, самое худшее, что может случиться, - это пропуски или дубликаты; с другой стороны, изменение массива, с которым вы перебираете, может привести к segfaults.

+0

Я думал об изменении элемента массива в начале, будучи не самым логичным, но игра с последним элементом звучит несколько более естественным - он даже работает. Я понимаю вашу точку зрения. Благодарю. – mjp

+0

Я не могу найти никакой информации об операциях с массивом с только скалярами как элементами LIST. Считаете ли вы, что действуют те же правила? – mjp

+0

нет, те же правила не применяются; не уверен, что вы подразумеваете под «игрой». – ysth

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; 
Смежные вопросы