2009-08-27 20 views
16

tengo una matriz que es miembro de una estructura:¿Cómo puedo iterar sobre una referencia de matriz Perl?

$self->{myArray} = ["value1", "value2"]; 

Y yo estoy tratando de iterar sobre ella usando el siguiente código:

my @myArray = $self->{myArray}; 
foreach my $foo (@myArray){ 
    #Do something with the using $foo 
    ... 
} 

El problema es que el 'foreach' loop se ejecuta solo una vez (cuando esperaría que se ejecute dos veces, ya que @myArray tiene dos elementos: "value1" y "value2").

Cuando compruebo el tamaño del array @myArray, entiendo que su tamaño es 1. ¿Qué estoy haciendo mal en este código?

+0

Gracias por la respuesta, funcionó. He aceptado la primera respuesta ... –

+6

Le recomendamos que lea el Cookbook de Data Structures: http://perldoc.perl.org/perldsc.html. Tiene ejemplos que muestran cómo crear y acceder a muchas estructuras de datos diferentes. – daotoad

Respuesta

28

creo que:

$self->{myArray} returns a reference. 

que desea devolver la matriz:

@{$self->{myArray}} 
+0

Ahh golpeado al golpe por FM :) – chollida

+1

Y en caso de que quiera saber cómo hacer esto para un hash ref: % {$ self -> {myHash}} – Kevin

10

$self->{myArray} es una matriz de referencia. Debes desreferenciarlo.

my @myArray = @{ $self->{myArray} }; 

En situaciones como ésta, el módulo Data::Dumper es muy útil. Por ejemplo, si @myArray no se comportaban como se esperaba, podría ejecutar este código para revelar el problema.

use Data::Dumper; 
print Dumper(\@myArray); 
6

$ self -> {} miMatriz es una referencia a un array, no una serie - no se puede almacenar matrices reales dentro de un hash, sólo referencias. Prueba esto:

my $myArray = $self->{myArray}; 
for my $foo (@$myArray){ 
    # do something with $foo 
} 

También es posible que desee echar un vistazo a perldoc perlref.

Cuestiones relacionadas