2010-11-12 48 views
2

J'essaye de créer un Hash qui a comme valeur un tableau.Perl Comment accéder à un hachage qui est l'élément d'un tableau qui est la valeur d'un autre hachage?

Le premier élément de la valeur (qui est un tableau) est un scalaire. Le deuxième élément de la valeur (qui est un tableau) est un autre hachage.

J'ai mis des valeurs dans la clé et la valeur de ce hachage comme suit:

${${$senseInformationHash{$sense}[1]}{$word}}++; 

Ici,

Mon hachage principale -> senseInformationHash

Ma valeur -> Est-ce un tableau

Ainsi, ${$senseInformationHash{$sense}[1]} me donne la référence à mon hachage

et je mis en clé et la valeur comme suit:

${${$senseInformationHash{$sense}[1]}{$word}}++; 

Je ne sais pas si cela est une bonne façon de le faire. Depuis que je suis coincé et je ne sais pas comment je peux imprimer cette chose complexe. Je veux l'imprimer afin de vérifier si je le fais correctement.

Toute aide sera grandement appréciée. Merci d'avance!

+3

Le FM pertinent à R est le livre de recettes Perl Data Structures. Vous pouvez l'obtenir en exécutant perldoc perldsc dans un terminal ou allez sur http://perldoc.perl.org/perldsc.html dans votre navigateur.L'article présente des exemples de travail avec différents types de structures de données mixtes. – daotoad

Répondre

4

écrire juste

$sense_information_hash{$sense}[1]{$word}++; 

et être fait avec elle.

Perl devient jaloux de CamelCase, vous savez, vous devez donc utiliser des traits de soulignement appropriés. Sinon, il peut cracher et se renifler et se comporte généralement mal.

+0

Pouvez-vous s'il vous plaît me dire comment y accéder après l'avoir stocké de cette façon? – Radz

+0

@Radz: la valeur 'printf 'de% s est% d \ n", $ mot, $ sens_information_hash {$ sense} [1] {$ mot}; ' – tchrist

+0

@Radz: c'est * le moyen d'y accéder. Vous lui donnez un chemin vers les données et vous dites: «Quoi qu'il en soit, augmentez le nombre». – Axeman

0

Merci Axeman et TChrist.

Le code que je dois y accéder est la suivante:

foreach my $outerKey (keys(%sense_information_hash)) 
{ 
    print "\nKey => $outerKey\n"; 
    print " Count(sense) => $sense_information_hash{$outerKey}[0]\n"; 

     foreach(keys (%{$sense_information_hash{$outerKey}[1]})) 
    { 
     print " Word wt sense => $_\n"; 
     print " Count => $sense_information_hash{$outerKey}[1]{$_}\n"; 
    } 
} 

Cela fonctionne maintenant. Merci beaucoup!

+0

L'utilisation de 'each' rend les choses moins sinueuses: https://gist.github.com/673683 – hobbs

2

Une valeur de hachage n'est jamais un tableau, c'est une référence de tableau.

Pour voir si vous faites correctement, vous pouvez vider toute la structure:

my %senseInformationHash; 
my $sense = 'abc'; 
my $word = '123'; 
${${$senseInformationHash{$sense}[1]}{$word}}++; 
use Data::Dumper; 
print Dumper(\%senseInformationHash); 

qui vous obtient:

$VAR1 = { 
     'abc' => [ 
       undef, 
       { 
        '123' => \1 
       } 
       ] 
    }; 

Notez le \1: Je suppose que vous voulez que la valeur soit 1, pas une référence au scalaire 1. Vous obtenez ce dernier parce que votre ${ ... }++; dit traiter ce qui est dans les accolades comme une référence scalaire et incrémenter le scalaire visé.

${$senseInformationHash{$sense}[1]}{$word}++; fait ce que vous voulez, comme le fait $senseInformationHash{$sense}[1]{$word}++. Vous pouvez trouver http://perlmonks.org/?node=References+quick+reference utile pour voir pourquoi.