2011-02-17 1 views
0

Salut à tous J'ai eu le problème que je ne peux pas retourner la valeur et la clé dans le hachage du tableauproblème Hash d'Array

sub nextWords{ 
    for my $language(0 .. $#language) 
    { 
     my $eng = $db->selectall_arrayref("select word from words 
      left outer join language 
      on words.languageId = language.languageId 
      where words.languageId = $language 
      order by word asc 
     ;"); # @language[$id] limit 10 offset $currentOffset 

     #%returnArray2d = (@language[$language] =>[@$eng]); 
     $returnArray2d{@language[$language]} = [@$eng]; 
    } 
    return %returnArray2d; 
} 

Je ne peux pas vraiment revenir toute la liste des mots

my %newwordsList =NextWords(); 
    foreach my $key(keys %newwordsList) 
    { 
     print "here you are 2 : " . $key . "\n"; 
     for my $ind(0 .. @{$newwordsList{$key}}){ 
     print "dzo" . $newwordsList{$key}[$ind] . "\n"; 
    } 
} 

output: $key ==> 132 not 123 

et le mot ne peut pas être imprimé .. il imprime juste quelques

ARRAY(0x320d514) 
ARRAY(0x320d544) 
ARRAY(0x320d574) 
ARRAY(0x320d5a4) 
ARRAY(0x320d5d4) 
ARRAY(0x320d604) 

S'il vous plaît aider .. merci

Répondre

1

Il semble que vous ne configuriez pas% returnArray2d correctement.

En supposant que @language contient les ids de langue que vous voulez, au lieu de:

$returnArray2d{ @language[$language] } = [@$eng]; 

Vous voulez ceci:

$returnArray2d{ $language[$language] } = [@$eng]; 

En outre, vous devriez éviter d'utiliser le même nom pour un tableau et une valeur scalaire (ça marche, mais c'est confus) (voir @language/$ language dans votre code).

Enfin, vous itérez correctement par chaque touche% newwordsList, cependant, vous voulez soustraire 1 de l'itération, de sorte que vous ne dépassez pas la fin du tableau:

for my $ind (0 .. @{ $newwordsList{$key} }) { 

devrait être:

for my $ind (0 .. @{ $newwordsList{$key} } - 1) { 

Or (comme David a fait remarquer dans les commentaires), vous pouvez le faire:

for my $ind (0 .. $#{ $newwordsList{$key} }) { 
+0

en outre, dans vos instructions d'impression, cela pourrait fonctionner mieux pour vous: 'while (mon ($ language_id, $ words) = chaque% newwordsList) { print" $ language_id @ $ words \ n "; } ' – l8nite

+1

Remplacez' pour mon $ ind (0 .. @ {$ newwordsList {$ key}}) {'avec' pour mon $ ind (0 .. $ # {$ newwordsList {$ key}}) {' éviter l'erreur de fencepost. –

+0

Merci David, j'ai mis à jour ma réponse pour ajouter votre suggestion. – l8nite