2015-04-29 6 views
0

J'ai attribué un hachage en Perl comme suit:Comment accéder à la valeur de hachage perl (qui est un tableau) à partir de Template Toolkit?

my %myvers; 
my @patches =(); 
my @mypatches =(); 

foreach my $myv (@{$product->versions}){ 

@patches = set_patches($myv->id); #get the array of patches for the version 
foreach(@patches) { 
    push @mypatches,@{$_}; 
    } 
$myvers{$myv->name} = @mypatches; 
} 

$vars->{'myvers'} = \%myvers; 

Lorsque j'accéder à la table de hachage dans le modèle html avec le code ci-dessous:

[% FOREACH key IN myvers.keys %] 
alert('[% key %] is [% myvers.$key %]; '); 
[% END %] 

clé contient les clés et $ key contient le nombre d'éléments dans le tableau pour chaque touche assignée ci-dessus.

Je ne peux pas accéder aux valeurs des éléments de la matrice. Comment puis je faire ça ?

Répondre

5

Le problème est que vous ne stockez pas les éléments, vous stockez uniquement la taille.

$myvers{ $myv->name } = @mypatches; 

Affectation d'une valeur de hachage force un contexte scalaire, de sorte @mypatches renvoie la taille du tableau. Vous devez stocker une référence au tableau à la place:

$myvers{ $myv->name } = [ @mypatches ]; 

Il est probablement plus fréquent de déclarer le tableau dans la boucle extérieure et utiliser une référence. En fait, vous pouvez sauter pousser les éléments un par un, comme vous pouvez pousser tout le tableau: push @mypatches, @patches, mais, vous n'avez pas besoin de deux tableaux du tout:

my %myvers; 

for my $myv (@{ $product->versions }) { 
    my @patches = set_patches($myv->id); 
    $myvers{ $myv->name } = \@patches; 
} 

$vars->{myvers} = \%myvers; 

ou, si vous voulez vraiment être laconique:

$myvers{ $_->name } = [ set_patches($_->id) ] for @{ $product->versions }; 
+0

Merci beaucoup pour votre aide. Cela a fonctionné comme j'ai suivi vos instructions. Merci également pour votre réponse rapide. Cela m'a facilité la vie. –

+0

Etre capable d'exposer les éléments du tableau de hachage était suffisant pour moi. –

+0

Mais cela n'a pas fonctionné si je ne pousse pas les éléments un par un. Il montre ** Array (0x ...) **, au lieu des éléments. Est-ce dû à un problème avec la référence? J'ai le même problème quand je pousse tout le tableau. Merci encore d'avoir ménagé votre temps et de partager vos connaissances. –