una print matriz lenguaje funcion ejemplos definir crear arreglo array perl foreach

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.