Подтвердить что ты не робот

Поведение нового "каждого @array" в скалярном контексте

Perl 5.14 дает нам расширенную функцию each, которая работает как с массивами, так и с хэшами:

При вызове в контексте списка возвращает список из 2 элементов, состоящий из ключа и значения для следующего элемента хэша, или индекса и значения для следующего элемента массива, чтобы вы могли перебирать его. При вызове в скалярном контексте возвращает только ключ (не значение) в хэш или индекс в массиве.

Пример использования контекста списка:

perl -E 'say $^V'

v5.14.0

perl -E '@a = (1..10); while (my ($i, $elem) = each @a) {say "\$a[$i] = $elem"}'

$a[0] = 1
$a[1] = 2
$a[2] = 3
$a[3] = 4
$a[4] = 5
$a[5] = 6
$a[6] = 7
$a[7] = 8
$a[8] = 9
$a[9] = 10

однако в скалярном контексте я ничего не получаю:

perl -E '@a = (1..10); while (my $i = each @a) {say $i}'

Может ли кто-нибудь дать представление? У меня такое чувство, что это будет голова, когда кто-то указывает мою ошибку, но, возможно, нет.

Изменить: на самом деле цикл while не имеет к этому отношения:

perl -E '@a = (1..10); $i = each @array; say $i'

не выводит результат. s'@array'@a' oops.

Изменить 2:

Согласно даксиму комментария:

perl -MDevel::Peek -E'@a = (1..10); Dump each @a'

SV = IV(0x161ce58) at 0x161ce68
  REFCNT = 1
  FLAGS = (TEMP,IOK,pIOK)
  IV = 0

однако я понятия не имею, что это говорит мне.

Изменить 3:

Кажется, что цикл выходит из-за того, что первый индекс равен 0 или false. Я подал ошибку (http://rt.perl.org/rt3/Ticket/Display.html?id=90888), так как это не похоже на желаемое поведение.

4b9b3361

Ответ 1

Вам нужно сделать while (defined( my $i = each @array )) { say $i }, иначе он остановится при первом индексе (0), поскольку он является ложным.

Ответ 2

[Содержимое этого сообщения неверно. Должно быть, в моем тесте была ошибка. Я не удаляю его из-за наличия хороших комментариев. ]

scalar each %hash работает благодаря каждому хешу, имеющему связанный с ним итератор. Я подозреваю, что такой итератор не был добавлен в массивы.

Это ошибка, поскольку each говорит:

При вызове в скалярном контексте возвращает только ключ (не значение) в хэш или индекс в массиве.

Пожалуйста, напишите отчет, используя perlbug.