Коварство each + for — ответы (но не объяснения)

| 1 комментарий

В первой части были приведены три программы, работающие под Perl 5.12, и предлагалось определить, что они выведут.

А выведут они следующее.

Программа А.

use v5.12;
my @letters = 'a'..'z';
for (my ($number, $char) = each @letters) {
    say "$number $char";
}

0 a
0 a

Программа Б.

use v5.12;
my @letters = 'a'..'z';
say $_ for each @letters;

0
a

Программа В.

use v5.12;
my @letters = 'a'..'z';
say $_ foreach @letters;

a
b
c
. . .
x
y
z

1 комментарий

Мда, чего объяснять-то?

1. для for вычисляется список my ($number, $char) = each @letters,
т.е. перебирается список из 2 элементов (индекс первого элемента + его значение). Сначала в for $_ равно 0, потом 'a', но так как для вывода используются переменные назначенные при инициализации всё выводится как мы видим.
2. Во втором примере выводится $_, собственно процесс я описал выше
3. В третьем случае each не используется, а foreach - равносильно for, поэтому выводятся элементы массива @letters

Когда я первую часть увидел сначала на 1й пример неправильный дал ответ, но прочитав второй сам же и исправился.

P.S. в примерах можно ещё "отгольфить", $_ убрать и всё такое

Спасибо за указание интересных моментов each для массивов!

Комментировать

Страницы

  • img

Об этой записи

Сообщение опубликовано 23.06.2010 23:09. Автор — ash.

Предыдущая запись — Презентации на YAPC::Europe 2010

Следующая запись — Belgian Perl Workshop 2010

Смотрите новые записи на главной странице или загляните в архив, где есть ссылки на все сообщения.