2010-09-01 4 views
2

Comment faire un programme Perl qui contient un tableau et ce tableau pointe un hachage?En Perl, comment créer et utiliser un tableau de hachages?

Il est comme ça picturalement,

(M1)  (M2)  ...it goes on 
|--k1=>v1 |--K1=>v1 
|--k2=>v2 |--k2=>v2 

je devrais accéder à ce tableau M1, le hachage contient à l'intérieur. (et ainsi de suite) ...

+3

voir http://perldoc.perl.org/perldsc.html – heferav

+3

Vous avez souligné les [perldocs] (http://perldoc.perl.org) avant - vous s'il vous plaît les lire? – Ether

Répondre

4

Cela devrait le faire - mais il est pas tout à fait clair pour moi que vous vouliez « M1 » et « M2 » à jouer dans le scénario:

my(@array) = ({ k1 => "v1", k2 => "v2" }, { K1 => "V1", K2 => "V2" }); 

print "$array[0]->{k1}\n"; 
print "$array[1]->{K2}\n"; 

Vous faites votre vie plus intéressant lorsque vous utilisez différents ensembles de clés dans les différents éléments du tableau (k1 et k2 par rapport à K1 et K2). C'est loin d'être interdit, mais cela rend le traitement plus difficile.

+0

Jonathan Leffler .. merci pour votre réponse –

+0

si une clé contient un autre hachage (clés et valeurs) alors comment l'extrait de code ci-dessus va ressembler ??? –

+1

@Senthil kumar Une clé ne peut pas contenir de hachage; une clé est une chaîne. Seules les valeurs peuvent être des références à des hachages ou des tableaux. Si vous essayez de stocker une référence dans une clé, elle sera convertie en une chaîne (comme '" HASH (0x8d4bc28) "') qui ne peut pas être reconvertie en référence. –

0

Vous avez besoin d'une référence de hachage, comme indiqué par {} ci-dessous.

my @array = ({ k1 => "v1", k2 => 'v2' }, { K1 => 'V1', }); 
+0

si une clé contient un autre hachage (clés et valeurs) alors comment l'extrait de code ci-dessus va ressembler ??? pls dire répondre .. –

4

Vous devez utiliser hachage references:

my @array;  
push @array, { k1=>"v1", k2=>"v2" }, { k1=>"v1", k2=>"v2" }; 

Ensuite, accédez aux hash comme ceci:

my $val = $array[0]{k1}; 
+0

Intéressant: Perl DWIM est à la fois votre notation sans la flèche et ma notation avec la flèche (au moins, le Perl 5.13.4 que j'utilise fait). –

+2

@Jonathan Leffler: C'est juste parce que lorsque vous indexez déjà dans un tableau ou un hash (ou une référence tableau/hash), Perl sait que l'opérateur que vous essayez d'indexer sur HAS est un scalaire, et donc une référence, seuls les scalaires peuvent être insérés dans des tableaux ou des hachages. Il n'y aurait donc pas d'index de liste directe ou de recherche de hachage - il doit s'agir d'une référence. TOUTEFOIS, si dans l'exemple ci-dessus vous avez un '$ array_ref' au lieu de' @ array', alors pour y accéder vous avez BESOIN de la première flèche, mais pas de la seconde: 'my $ val = $ array_ref -> [0] {k1 }; '. –

+1

@Jonathan: oui, comme le déclare le perldoc: "La flèche est facultative * entre * les indices des parenthèses." –

1

Quelque chose comme:

%h1 = ('a'=>'abc','b'=>'bcd'); # hash 1 
%h2 = ('A'=>'Abc','B'=>'Bcd'); # hash 2 
@arr = (\%h1,\%h2); # array of hash references. 
foreach $hash_ref (@arr) { # iterate through the array. 
     foreach $key(keys %$hash_ref) { # iterate through the hash. 
       print $key.' '.$$hash_ref{$key}."\n"; #print key => value 
     } 
} 
Questions connexes