Perl, заказ foreach
Требуется ли, чтобы оператор цикла Perl foreach
отображал элементы списка в порядке?
Например
my @a=(1,2,3);
foreach my $item (@a) {
print $item;
}
всегда будет печатать 1 2 3?
Я подозреваю, что так, но я не могу найти его документированным.
Ответы
Ответ 1
Да. Он повторяется в списке. насколько это документировано, посмотрите perldoc perlsyn:
Цикл foreach выполняет итерацию над нормальным значением списка и устанавливает переменную VAR быть каждым элементом списка в свою очередь.
"В свою очередь" здесь означает порядок.
Ответ 2
Да.
Некоторая кажущаяся сложность (массивы в порядке, но хеши не являются - WTF?) происходит из-за того, что большинство ответов игнорируют важность контекста.
Переменные, функции, операторы и подпрограммы 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()
в контексте списка и выполняет итерацию по результатам.
Ответ 3
Да, будет. Массивы и списки упорядочены.
Ответ 4
Да, массивы сохраняют порядок, а хэши - нет.