2015-04-29 31 views
0

我已經在Perl分配的哈希如下:如何從模板工具包訪問perl哈希值(這是一個數組)?

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 ...)**,而不是元素。這是由於參考的任何問題嗎?當我推動整個數組時,我遇到同樣的問題。 再次感謝您節省時間和分享您的知識。 –