循环遍历从哈希表中检索的数组

时间:2012-03-28 10:08:01

标签: arrays perl hashtable

我有一个包含以下内容的哈希表:

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,所以我想我对如何创建嵌套数组感到有点困惑。

解决:

引用数组:

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

4 个答案:

答案 0 :(得分:2)

sub getVar返回对数组的引用,只是取消引用int:

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

或更改sub:

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

答案 1 :(得分:1)

[3, 4, 5]是一个arrayref,而不是一个数组。相应地修改您的代码:

my $c_arrayref = getVar('c');

foreach (@{ $c_arrayref }) {

阅读perlreftutperlref

答案 2 :(得分:1)

只需使用数组引用作为参考:

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

或取消引用存储在散列中的数组引用,在getVar:

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

或其来电者:

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

答案 3 :(得分:0)

getVar

的多用途退货
return wantarray ? map { ref() eq 'ARRAY' ? @$_ : $_ } $hash{ $id }
     :             $hash{ $id }
     ;