У Perl до 5.10, можна сказати
use strict;
use warnings;
my @a = qw/a b c d e/;
my $index;
for my $elem (@a) {
print "At index ", $index++, ", I saw $elem\n";
}
for my $index (0 .. $#a) {
print "At index $index I saw $a[$elem]\n";
}
У Perl 5.10 ви використовуєте state, щоб оголосити змінну, яка ніколи не переініціалізується (на відміну від створених за допомогою my ). Це дозволяє зберегти $index
змінну в меншій області, але це може призвести до помилок (якщо ви введете цикл вдруге, він все одно матиме останнє значення):
use 5.010;
use strict;
use warnings;
my @a = qw/a b c d e/;
for my $elem (@a) {
state $index;
say "At index ", $index++, ", I saw $elem";
}
У Perl 5.12 можна сказати
use 5.012;
use warnings;
my @a = qw/a b c d e/;
while (my ($index, $elem) = each @a) {
say "At index $index I saw $elem";
}
Але будьте застережені: у вас є обмеження щодо того, що вам дозволено робити @a
, переглядаючи це each
.
Зараз це вам не допоможе, але в Perl 6 ви зможете сказати
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
Z
Оператор застібає два списки разом (тобто він приймає один елемент з першого списку, то один елемент з другого, то один елемент з першого, і так далі). Другий список - це лінивий список, який містить кожне ціле число від 0 до нескінченності (принаймні теоретично). Це -> $elem, $index
говорить про те, що ми беремо два значення одночасно з результату zip. Решта повинна виглядати нормально для вас (якщо ви ще не знайомі з say
функцією з 5.10).