2011-07-15 11 views
3

je dois comparer deux hachages, mais je ne peux pas obtenir le jeu intérieur de clés ...Comment construire un hachage de hachages

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30}, 
      'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9}); 
foreach my $key (keys(%HASH)) 
{ 
    my %innerhash = $options{$key}; 
    foreach my $inner (keys(%innerhash)) 
    { 
     print "Match: ".$otherhash{$key}->{$inner}." ".$HASH{$key}->{$inner}; 
    } 
} 

Répondre

4

$options{$key} est un scalaire (vous pouvez dire être le premier $ sigil). Vous voulez « déréférencement » pour l'utiliser comme un hachage:

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30}, 
      'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9}); 
foreach my $key (keys(%HASH)) 
{ 
    my %innerhash = %{ $options{$key} }; # <---- note %{} cast 
    foreach my $inner (keys(%innerhash)) 
    { 
     print "Match: ".$otherhash{$key}->{$inner}." ".$HASH{$key}->{$inner}; 
    } 
} 

Lorsque vous êtes prêt à plonger vraiment dans ces choses, voir perllol, perldsc et perlref.

+0

Je ne savais pas que vous pourriez lancer une variable en PERL, merci tellement de! –

+1

@ mob's answer est une application de "Use Rule 1" dans "perldoc perlreftut" donc vous devriez commencer par ce doc. – tadmc

1

Je suppose que vous dites "options" là où vous voulez dire "HASH"?

Les hachages ne stockent que les scalaires, pas les autres hachages; chaque valeur de% HASH est une référence de hachage qui doit être déréférencé, de sorte que votre boucle intérieure doit être:

foreach my $inner (keys(%{ $HASH{$key} }) 

Ou:

my %HASH = ('first'=>{'A'=>50, 'B'=>40, 'C'=>30}, 
      'second'=>{'A'=>-30, 'B'=>-15, 'C'=>9}); 
foreach my $key (keys(%HASH)) 
{ 
    my $innerhash = $HASH{$key}; 
    foreach my $inner (keys(%$innerhash)) 
    { 
     print "Match: ".$otherhash{$key}->{$inner}." ".$innerhash->{$inner}; 
    } 
} 
Questions connexes