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

Да, массивы сохраняют порядок, а хэши - нет.