2010-11-24 8 views
1

J'ai ceci:Perl: Obtenir la valeur parallèle dans le tableau de hachage

my(%arr) = (
monsters => ["Test","Test2"], 
kills => [-1, -2  ]); 

Puis, plus tard je recherche Test2:

if (grep { $_ eq "Test2"} @{ $arr{monsters} }) 
{ 
    #Get parallel value of Test2 (-2) 
    next; 
} 

Comment puis-je obtenir la valeur parallèle sans connaître l'indice (un réel variable est utilisée lors de la recherche et pas une chaîne littérale)? Cependant,

for my $idx(0 .. $#{ $arr{monsters} }) { 
    if ($arr{monsters}[$idx] eq 'Test2') { 
     print "Kills = $arr{kills}[$idx]\n"; 
     last; 
    } 
} 

Une meilleure façon de gérer cela,:

Répondre

4

Essayez un hachage hash:

my %arr = (
    'Test' => { 
    'kills' => -1, 
    }, 
    'Test2' => { 
    'kills' => -2, 
    }, 
); 

print $arr{'Test2'}{'kills'}, "\n"; 
+1

Comment est-ce que je passerais en revue cela pour l'imprimer? Peu importe, pense que je l'ai eu: while (($ k, $ v) = chaque% arr) { imprime "$ k =>", $ arr {"$ k"} {"tue"}, "\ n" ; } – Zeno

+1

Bien sûr ou quelque chose comme: foreach (trier les touches% arr) {print "$ _ = $ arr {$ _} {'tue'} \ n"; } – dmah

+0

Qu'en est-il du tri par kill? – Zeno

5

Plutôt que d'utiliser une grep, boucle un peu plus le tableau et maintenir une variable de comptage pourrait être de repenser votre structure de données. Au lieu de réseaux parallèles, envisager un tableau de hash:

my @monsters = ({ name => 'Test', kills => -1 }, { name => 'Test2', kills => -2 }); 

Maintenant, pour trouver un monstre spécifique:

my ($monst) = grep { $_->{name} eq 'Test2' } @monsters; 
print $monst->{kills}; 

Cela vous permettra de rechercher le nom et tue aussi facilement. Si vous allez toujours chercher par nom, alors faire un hachage sur le nom et pointer sur le nombre de kills (comme suggère @dmah) pourrait être mieux.

Une meilleure façon de gérer cela serait d'envelopper vos monstres dans une classe, et de faire en sorte que chaque objet garde la trace de ses propres ennemis, mais je laisserai cela comme exercice pour l'OP.

Questions connexes