Язык программирования Perl | страница 43




> $first = shift @array; # извлечь первый элемент в $first # синоним: ($first, @array) = @array;


С помощью этой функции можно организовать цикл обработки массива, который закончится после извлечения из него последнего элемента, например:


> while (my $first = shift @array) { # пока @array не опустеет print "Обработан элемент $first."; print "Осталось ", scalar @array, " элементов\n"; }


Обратите внимание, что для вывода текущего размера массива нужно использовать scalar @array потому, что иначе print воспримет @array как список для печати и выведет значения массива. Существует противоположная shift функция unshift, которая вставляет свои аргументы в массив перед первым элементом, сдвигая существующие элементы вправо.


> unshift @array, $e1,$e2,$e3; # вставить значения в начало # синоним: @array = ($e1,$e2,$e3, @array);


С помощью массива можно организовать стек, данные в котором обрабатываются по алгоритму LIFO ("last in, first out", "последним пришел - первым ушел"). Для добавления данных в стек применяется операция push, которая добавляет элементы в конец массива:


> push @stack, $new; # добавить элемент в конец массива # синоним: @stack = (@stack, $new);


Для извлечения одного значения из стека служит встроенная функция pop, которая удаляет последний элемент массива, возвращая его значение:


> $last = pop @stack; # изъять последний элемент массива


При помощи комбинации функций push и shift можно организовать список, реализующий очередь данных, у которой элементы добавляются в конец, а извлекаются из начала (в соответствии с алгоритмом FIFO, "first in, first out", "первым пришел - первым ушел").

Для удаления или замены подсписка в массиве можно использовать функцию splice, которая удаляет идущие подряд элементы массива, заданные индексом первого элемента и количеством удаляемых элементов, и заменяет их новым списком (если он указан), возвращая список удаленных элементов.


> @array = (1..7); # исходный массив $offset = 2; $size = 4; # смещение и размер удаляемого списка @deleted = splice @array, $offset, $size, qw(новый список); # в @array теперь (1, 2, 'новый', 'список', 7) # в @deleted попали 4 удаленных элемента (3, 4, 5, 6)


Если список для вставки не указан, то подсписок от элемента с индексом $offset в количестве $size элементов просто удаляется.

Операция сортировки списка выполняется встроенной функцией sort, которая, не изменяя своего аргумента, возвращает список, отсортированный по возрастанию строковых значений элементов исходного списка. Поясним на примере: