matriz - print array perl
obtener automáticamente el índice de bucle en el bucle foreach en perl (12)
Bueno, hay esta manera:
use List::Rubyish;
$list = List::Rubyish->new( [ qw<a b c> ] );
$list->each_index( sub { say "/$_=$_" } );
ver List::Rubyish
Si tengo la siguiente matriz en Perl:
@x = qw(a b c);
y lo repito con foreach
, luego $_
se referirá al elemento actual en la matriz:
foreach (@x) {
print;
}
se imprimirá:
abc
¿Hay alguna manera similar de obtener el índice del elemento actual, sin actualizar manualmente un contador? Algo como:
foreach (@x) {
print $index;
}
donde $index
se actualiza como $_
para generar el resultado:
012
Como decía el cabezal de código, tendrías que iterar sobre los índices de matriz en lugar de sus elementos. Prefiero esta variante sobre el C-style for loop:
for my $i (0 .. $#x) {
print "$i: $x[$i]/n";
}
En Perl anterior a 5.10, puedes 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, utilizas el state para declarar una variable que nunca se reinicializa (a diferencia de los que crean con my ). Esto le permite mantener la variable $index
en un ámbito más pequeño, pero puede provocar errores (si ingresa el ciclo una segunda vez, aún 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 puedes 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 ten cuidado: hay restrictions a lo que se te permite hacer con @a
mientras lo iteras con each
.
No te ayudará ahora, pero en Perl 6 podrás 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
comprime las dos listas juntas (es decir, toma un elemento de la primera lista, luego un 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
indica 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).
Lo he intentado como ...
@array = qw /tomato banana papaya potato/; # example array
my $count; # local variable initial value will be 0
print "/nBefore For loop value of counter is $count"; # just printing value before entering in loop
for (@array) { print "/n",$count++," $_" ; } # string and variable seperated by comma to
# execute the value and print
undef $count; # undefining so that later parts again it will
# be reset to 0
print "/nAfter for loop value of counter is $count"; # checking the counter value after for loop.
en breve..
@array = qw /a b c d/;
my $count;
for (@array) { print "/n",$count++," $_"; }
undef $count;
No con Foreach. Si definitivamente necesita la cardinalidad del elemento en la matriz, use un iterador ''for''.
for($i=0;$i<@x;++$i) {
print "Element at index $i is ",$x[$i],"/n";
}
No debería necesitar conocer el índice en la mayoría de las circunstancias, puede hacerlo
my @arr = (1, 2, 3);
foreach (@arr) {
$_++;
}
print join(", ", @arr);
En este caso, la salida sería 2, 3, 4 ya que foreach establece un alias para el elemento real, no solo una copia.
No, debes hacer tu propio contador. Otro ejemplo más:
my $index;
foreach (@x) {
print $index++;
}
cuando se usa para indexar
my $index;
foreach (@x) {
print $x[$index]+$y[$index];
$index++;
}
Y, por supuesto, puede usar local $index;
en cambio my $index;
y tal y tal
EDITAR : Actualizado según el comentario del primer ysth.
Perl versión 5.14.4
Se puede hacer con while
loop ( foreach
no es compatible con esto)
my @arr = (1111, 2222, 3333);
while (my ($index, $element) = each(@arr))
{
# You may need to "use feature ''say'';"
say "Index: $index, Element: $element";
}
Salida:
Index: 0, Element: 1111
Index: 1, Element: 2222
Index: 2, Element: 3333
Por favor considera:
print "Element at index $_ is $x[$_]/n" for keys @x;
Sí. He revisado tantos libros y otros blogs ... la conclusión es que no existe una variable de sistema para el contador de bucles. tenemos que hacer nuestro propio contador. Corrígeme si estoy equivocado.
autobox::Core
proporciona entre muchas otras cosas un método útil for
:
use autobox::Core;
[''a''..''z'']->for( sub{
my ($index, $value) = @_;
say "$index => $value";
});
Alternativamente, eche un vistazo a un módulo iterador, por ejemplo: Array::Iterator
use Array::Iterator;
my $iter = Array::Iterator->new( [''a''..''z''] );
while ($iter->hasNext) {
$iter->getNext;
say $iter->currentIndex . '' => '' . $iter->current;
}
Ver también:
/ I3az /
perldoc perlvar
no parece sugerir tal variable.