2009-08-27 9 views
16

J'ai un tableau qui est membre d'une structure:Comment puis-je itérer sur une référence de tableau Perl?

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

Et je suis en train de parcourir en utilisant le code suivant:

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

Le problème est que le « foreach » loop est exécuté une seule fois (quand je m'attendrais à ce qu'il s'exécute deux fois, car @myArray a deux éléments: "value1" et "value2").

Lorsque je vérifie la taille du tableau @myArray, je constate que sa taille est 1. Que fais-je de mal dans ce code?

+0

Merci pour la réponse, cela a fonctionné. J'ai accepté la première réponse ... –

+6

Vous pouvez lire le livre de recettes Data Structures: http://perldoc.perl.org/perldsc.html Il contient des exemples montrant comment créer et accéder à de nombreuses structures de données différentes. – daotoad

Répondre

28

Je crois que:

$self->{myArray} returns a reference. 

Vous voulez retourner le tableau:

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

Ahh battu au coup de poing par FM :) – chollida

+1

Et juste au cas où vous voulez savoir comment faire cela pour une référence de hachage: % {$ self -> {myHash}} – Kevin

10

$self->{myArray} est une référence de tableau. Vous devez le déréférencer.

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

Dans des situations comme celle-ci, le module Data::Dumper est très utile. Par exemple, si @myArray ne se comportait pas comme prévu, vous pouvez exécuter ce code pour révéler le problème.

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

$ self -> {} monTableau est une référence de tableau, pas un tableau - vous ne pouvez pas stocker des tableaux réels à l'intérieur d'un hachage, seules les références. Essayez ceci:

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

Vous pouvez également jeter un oeil à perldoc perlref.

Questions connexes