2013-02-27 1 views
-2

Je veux obtenir le nombre d'entrées pour chaque groupe, mais il semble me donner la mauvaise réponse. Il y a des éléments dans chaque groupe qui pourraient être répétés. Les résultats que je reçois n'ont pas de sens. Qu'est-ce que je fais mal?Comment obtenir le nombre de clés dans un hachage perl de hachages?

my %hash; 
while(<>) 
{ 
    chomp($_); 
    if(/(\d+)\t(\d+)/) 
    { 
     my $group = $1; 
     my $element = $2; 
     $hash{$group}{$element}=1; 
    } 
} 

foreach my $curr(keys %hash) 
{ 
    my $numElementsInCurr = keys %{$hash{$curr}}; 
    print "$curr\t$numElementsInCurr\n"; 
} 
+1

Êtes-vous sûr que votre entrée est bien formé? Vous pouvez utiliser 'Data :: Dumper' pour examiner'% hash' pour voir qu'il ressemble à ce que vous attendez. – zigdon

+1

Vous devriez mentionner pourquoi vous pensez qu'il vous donne une mauvaise réponse. Juste afficher un code qui fait ce qu'il est censé ne va pas aider du tout. Telles que l'impression de la sortie Dumper pour '% hachage» et montrant la sortie de votre boucle. – TLP

+1

Vous n'avez pas encore démontré le problème. Votre code n'était pas tout à fait exécutable (ce que j'ai corrigé), mais vous n'avez pas donné de données qui provoquent l'erreur. Il serait également agréable d'obtenir la sortie que vous obtenez pour ces données et la sortie que vous attendez. – ikegami

Répondre

0

Si les éléments d'un groupe peut être répété, et vous avez besoin de votre nombre d'inclure ces doublons, vous aurez besoin de faire quelque chose comme:

my %hash; 
while(<>) 
{ 
    chomp($_); 
    if(/(\d+)\t(\d+)/) 
    { 
     my $group = $1; 
     my $element = $2; 
     ++$hash{$group}{$element}; 
    } 
} 

use List::Util 'sum'; 

foreach my $curr(keys %hash) 
{ 
    my $numElementsInCurr = sum values %{$hash{$curr}}; 
    print "$curr\t$numElementsInCurr\n"; 
} 
Questions connexes