Делает Perl foreach
оператор цикла требует, чтобы элементы списка были представлены в порядке?
Например,
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
будет всегда печатать 1 2 3?
Я подозреваю так, но я не могу найти, что это зарегистрировало.
Да. Он выполняет итерацию в порядке списка. что касается его документированности, посмотрите perldoc perlsyn:
Цикл foreach выполняет итерацию по обычному списку значений и устанавливает переменную VAR в каждый элемент списка по очереди.
"По очереди" здесь означает по порядку.
Да.
Некоторая очевидная сложность (массивы в порядке, а хеши - нет - WTF?) Проистекает из того факта, что в большинстве ответов игнорируется важность контекста .
Переменные, функции, операторы и подпрограммы Perl могут принимать различные значения в зависимости от контекста. Контекст может быть либо скалярным , либо списком .
В скалярном контексте нам нужно только одно значение. Например, my $ count = @array;
присваивает количество элементов в @array
$ count
, потому что присвоение скаляру обеспечивает скалярный контекст.
В контексте списка мы ищем несколько значений. Например, my @merged = @left, @right;
. Присваивание массиву обеспечивает контекст списка, поэтому @left
и @right
раскрываются в списки своих элементов. Поскольку списки представляют собой плоские структуры, у нас есть один длинный список, который объединяет элементы из обоих массивов. Наконец, список значений присваивается @merged
.
Причина, по которой в большинстве ответов это не учитывается, заключается в том, что, хотя контекст сначала кажется странным, 99% времени контекст работает прозрачно и делает то, что вы ожидаете.
Цикл for
предоставляет контекст списка. Это означает, что все, что находится внутри круглых скобок, интерпретируется в контексте списка. Полученный список затем перебирается по порядку.
Это означает следующее:
for (@array) {}
расширяет массив в список элементов, сохраняя порядок массива. for (% hash) {}
расширяет хэш в случайный упорядоченный список пар ключ / значение. for () {}
считывает все строки, доступные из дескриптора файла, и представляет их по порядку. for (some_subroutine ()) {}
оценивает some_subroutine ()
в контексте списка и перебирает результаты.