如何取消引用数组数组?

时间:2015-11-20 17:07:13

标签: arrays perl reference

我正在研究一个Perl Dancer2 webapp,偶然发现我有一个数组,其中包含一个包含位置2的数组的数组。我将对该数组的引用传递给sub,然后遍历数组(包含数组)。

当我尝试使用foreach()@$$_[2]循环内部获取最里面的数组时,出现错误:

  

不是SCALAR参考

我可以通过以下方式轻松解决此问题:

my $ref = $$_[2];
print "@$ref\n";

但我想知道为什么第一种方法不起作用。

看看我的最小例子:

my @x = (["a", "b", [1, 2], "c"],
         ["x", "y", [8, 9], "z"]);
my $y = \@x;

foreach (@$y) {
#   print "@$$_[2]\n"; #produces error

    my $z = $$_[2];
    print "@$z\n"; #works
}

这里有什么想法?

2 个答案:

答案 0 :(得分:5)

你需要花括号:

@{$$_[2]}

或更可读

@{ $_->[2] }

原始@$$_[2]被解释为

@{ $$_ }[2]

比照

use feature qw{ say postderef };

$_ = [['a'], ['b'], ['c', 'd']];
say for @{ $_->[2] };
say for $_->[2]->@*;

$_ = \[ @$_ ];
say @$_ for @{ $$_ }[2];
say @$_ for $_->$*->[2];

答案 1 :(得分:0)

查看->运算符。可能问题是括号。毕竟,当您说$$_[2]时,您的意思是:${$_}[2]{$$_}[2]

这样的事情可能更清楚(假设你想要1,2和8,9)

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;

my @x = ( [ "a", "b", [ 1, 2 ], "c" ], 
          [ "x", "y", [ 8, 9 ], "z" ] );
my $y = \@x;

print Dumper $y;

foreach my $array_ref (@$y) {
    print Dumper $array_ref;
    my $z = $array_ref->[2];
    print "@$z\n";
}