2015-04-29 5 views
0

я назначен хэш в Perl следующим образом:Как получить доступ к хеш-значению perl (который является массивом) из 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; 

Когда я получить доступ к хэш в шаблоне HTML на код ниже:

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

ключ содержит ключи и ключевые $ содержит количество элементов в массиве для каждой назначенной выше клавиши.

Я не могу получить доступ к значениям элементов массива. Как я могу это сделать ?

ответ

5

Проблема в том, что вы не храните элементы, вы сохраняете только размер.

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

Присвоение значения хэша заставляет скалярный контекст, так @mypatches возвращает размер массива. Вы должны хранить ссылку на массив вместо:

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

Это, вероятно, более распространенным, чтобы объявить массив внутри внешнего контура и использовать ссылку. На самом деле, вы можете пропустить толкая элементы один за другим, как вы можете нажать на весь массив: push @mypatches, @patches, но тогда вам не нужны два массива вообще:

my %myvers; 

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

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

или, если вы действительно хотите быть лаконичным:

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

Большое спасибо за помощь. Он работал, следуя вашим указаниям. Спасибо также за ваш быстрый ответ. Это облегчило мою жизнь. –

+0

Мне было достаточно возможности выставить элементы массива хэшей. –

+0

Но это не сработало, если я не нажимаю элементы один за другим. Он отображает ** Array (0x ...) ** вместо элементов. Это связано с любой проблемой со ссылкой? У меня такая же проблема, когда я нажимаю весь массив. Еще раз спасибо за то, что вы щадили свое время и делились своими знаниями. –