2011-06-10 4 views
2

J'ai vu des questions similaires posées ici sur la nausée mais aucun d'entre eux ne pouvait répondre à ma propre question en particulier. J'essaie de créer par programme un hachage de hachages. Mon code de problème est le suivant:Perl Hash of Hashes Question

my %this_hash =(); 
if ($user_hash{$uuid}) 
{ 
    %this_hash = $user_hash{$uuid}; 
} 

$this_hash{$action} = 1; 

$user_hash{$uuid} = %this_hash; 
my %test_hash = $user_hash{$uuid}; 
my $hello_dumper = Dumper \%this_hash; 

Selon ma sortie, this_hash $ est attribuée correctement, mais

$user_hash{$uuid} = %this_hash 

est montrant une valeur de 1/8 dans le débogueur; pas sûr de ce que ses moyens. Je reçois également un avertissement: "nombre impair d'éléments dans l'affectation de hachage ..."

+1

Voir aussi http://perldoc.perl.org/perldiag.html pour le message d'erreur, et http://perldoc.perl.org/index-tutorials.html pour plusieurs tutoriels sur les structures de données. – FMc

Répondre

12

Chaque fois que vous écrivez

%anything = $anything 

que vous faites quelque chose de mal. Presque n'importe quand vous écrivez

$anything = %anything 

vous faites quelque chose de mal. Cela inclut lorsque $anything est un tableau ou un accès de hachage (c'est-à-dire $array[$index] ou $hash{$key}). Les valeurs stockées dans les tableaux et les hachages sont toujours des scalaires, et les tableaux et les hachages eux-mêmes ne sont pas des scalaires. Donc, quand vous voulez stocker un hachage dans un hachage, vous enregistrez une référence à celui-ci: $hash{$key} = \%another_hash. Et quand vous voulez accéder à un hash qui a été référencé dans un hash, vous déréférencez: %another_hash = %{ $hash{$key} } ou $hashref = $hash{$key}; $value = $hashref->{ $another_key } ou $value = $hash{$key}{$another_key}.

Pour vous familiariser avec les références, je vous recommande fortement de lire le Perl References Tutorial et le Perl Data Structures Cookbook.

+1

Beaucoup d'apprentissage a eu lieu. Merci pour la réponse. – SemperFly

5

Ce n'est pas vraiment un "hachage de hachages"; c'est un "hachage de références aux hachages".

Essayez:

$user_hash{$uuid} = \%this_hash; 
+0

Merci pour la réponse Nemo. – SemperFly