Perl, порядок foreach - PullRequest
       9

Perl, порядок foreach

11 голосов
/ 15 июня 2010

Требует ли оператор цикла Perl foreach, чтобы элементы списка были представлены в порядке?

Например,

my @a=(1,2,3);

foreach my $item (@a) {
 print $item;
}

всегда будет печатать 1 2 3?

Я подозреваю, что так, но я не могу найти это документально.

Ответы [ 4 ]

14 голосов
/ 15 июня 2010

Да.Итерирует в порядке списка.насколько это задокументировано, посмотрите на perldoc perlsyn :

Цикл foreach выполняет итерацию по обычному значению списка и устанавливает переменную VAR в качестве каждого элемента списка по очереди..

«В свою очередь» здесь означает по порядку.

7 голосов
/ 16 июня 2010

Да.

Некоторая очевидная сложность (массивы в порядке, а хэши - не в 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() в контексте списка и перебирает результаты.
3 голосов
/ 15 июня 2010

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

3 голосов
/ 15 июня 2010

Да, будет.Массивы и списки упорядочены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...