En Perl antes de la 5.10, se puede decir
#!/usr/bin/perl
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";
}
#or
for my $index (0 .. $#a) {
print "At index $index I saw $a[$elem]\n";
}
En Perl 5.10, se utiliza state para declarar una variable que nunca se reinicializa (a diferencia de los que se crean con my). Esto le permite mantener la variable $index
en un ámbito más pequeño, pero puede dar lugar a errores (si introduce el bucle por segunda vez todavía tendrá el último valor):
#!/usr/bin/perl
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";
}
En Perl 5.12 se puede decir
#!/usr/bin/perl
use 5.012; #this enables strict
use warnings;
my @a = qw/a b c d e/;
while (my ($index, $elem) = each @a) {
say "At index $index I saw $elem";
}
Pero cuidado: hay que restrictions a lo que se le permite ver con @a
al iterar sobre ella con each
.
No te va a ayudar ahora, pero en Perl 6 que va a ser capaz de decir
#!/usr/bin/perl6
my @a = <a b c d e>;
for @a Z 0 .. Inf -> $elem, $index {
say "at index $index, I saw $elem"
}
El operador Z
cremalleras las dos listas (es decir que se necesita un elemento de la primera lista, entonces uno elemento del segundo, luego un elemento del primero, y así sucesivamente). La segunda lista es una lista lazy que contiene todos los números enteros desde 0 hasta infinito (al menos teóricamente). El -> $elem, $index
dice que estamos tomando dos valores a la vez del resultado del zip. El resto debería parecerle normal (a menos que aún no esté familiarizado con la función say
de 5.10).
+1 por no usar el feo C-style for-loop. – fengshaun
Esto no es lo que desea si la secuencia de índice de matriz es 2, 5, 8, 19 con huecos en secuencia. Creo que la pregunta era sobre el índice del elemento actual. – Andy