Да.
Некоторая очевидная сложность (массивы в порядке, а хэши - не в WTF?) Обусловлены тем фактом, что большинство ответов игнорируют важность context .
Переменные, функции, операторы и подпрограммы Perl могут принимать разные значения в зависимости от контекста. Контекст может быть либо скаляр , либо список .
В скалярном контексте нам нужно только одно значение. Например, my $count = @array;
назначает количество элементов в @array
для $count
, потому что назначение скаляру обеспечивает скалярный контекст.
В контексте списка мы ищем несколько значений. Например, my @merged = @left, @right;
. Присвоение массиву обеспечивает контекст списка, поэтому @left
и @right
расширяются в списки их элементов. Поскольку списки являются плоскими структурами, у нас есть один длинный список, который объединяет элементы из обоих массивов. Наконец, список значений присваивается @merged
.
Причина, по которой большинство ответов затмевают это, заключается в том, что, хотя контекст кажется поначалу странным, 99% контекста времени работает прозрачно и выполняет то, что вы ожидаете.
Цикл for
предоставляет контекст списка. Это означает, что все, что находится внутри скобки, интерпретируется в контексте списка. Полученный список затем итерируется по порядку.
Что это означает, что:
for (@array) {}
расширяет массив в список элементов, сохраняя порядок массива.
for (%hash) {}
расширяет хеш в случайный упорядоченный список пар ключ / значение.
for ( <FILEHANDLE> ) {}
читает все строки, доступные в дескрипторе файла, и представляет их в порядке.
for ( some_subroutine() ) {}
оценивает some_subroutine()
в контексте списка и перебирает результаты.