2012-03-28 142 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 } 
    ;