Perl, foreach порядок

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

Например,

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

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

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

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

11
задан Mike 15 June 2010 в 16:10
поделиться

4 ответа

Да. Он выполняет итерацию в порядке списка. что касается его документированности, посмотрите perldoc perlsyn:

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

"По очереди" здесь означает по порядку.

14
ответ дан 3 December 2019 в 03:34
поделиться

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

3
ответ дан 3 December 2019 в 03:34
поделиться

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

3
ответ дан 3 December 2019 в 03:34
поделиться

Да.

Некоторая очевидная сложность (массивы в порядке, а хеши - нет - 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 () в контексте списка и перебирает результаты.
7
ответ дан 3 December 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: