2012-03-28 136 views
1

我有包含以下內容的哈希表中檢索:循環通過陣列從哈希表

my %hash = (
    'a' => 1, 
    'b' => 2, 
    'c' => [3, 4, 5], 
); 

,稍後我拉$hash{'c'}@array_c作爲獲取等功能的一部分:

sub getVar { 
    my $id = shift; 
    return $hash{$id}; 
} 

my @array_c = getVar('c'); 

然後後來我通過@array_c試圖循環並打印每行:

foreach (@array_c){ 
    print "$_"; 
} 

但是代替的345所需的輸出,我得到ARRAY(0x100804ed0)

請幫助:d

編輯:

如果我做print @array_c[0]->[0]然後我得到3,所以我想我有點困惑至於我如何設法創建一個嵌套數組。

解決:

去與deferencing陣列:

my @array_c = @{getVar('c')}; 

回答

2

sub getVar返回一個refrence到陣列,只是取消對它的引用:

my @array_c = @{getVar('c')}; 

或改變子:

sub getVar { 
    my $id = shift; 
    return @{$hash{$id}}; 
} 
+0

首先回答及1行更改:D謝謝! – DanH 2012-03-28 10:21:31

+0

@丹:不客氣。 – Toto 2012-03-28 10:33:30

1

[3, 4, 5]是一個arrayref,而不是一個數組。相應地修改代碼:

my $c_arrayref = getVar('c'); 

foreach (@{ $c_arrayref }) { 

閱讀perlreftutperlref

1

只需使用數組引用作爲參考:

my $array_c = getVar('c'); 
... 
foreach (@$array_c){ 
    print "$_"; 
} 

或者解除引用存儲在哈希數組引用,無論是在getVar:

sub getVar { 
    my $id = shift; 
    return @{ $hash{$id} }; 
} 

或它的調用者:

my @array_c = @{ getVar('c') }; 
0

您的多功能退貨getVar

return wantarray ? map { ref() eq 'ARRAY' ? @$_ : $_ } $hash{ $id } 
    :    $hash{ $id } 
    ;