2015-11-20 85 views
1

我正在一個Perl Dancer2 web應用和跨過我有一個包含含有一個陣列的陣列在位置2我傳遞給數組的引用到子,然後迭代這個數組的數組的情況絆倒(即包含數組)。如何取消引用數組數組?

當我試圖得到一個foreach()循環與@$$_[2]內最裏面的陣列,我得到一個錯誤:

Not a SCALAR reference

我可以很容易地解決這個具有:

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 
} 

任何想法是怎麼回事?

+0

[Perl中,引用取消引用數組(http://stackoverflow.com/questions/2969567/perl-dereference-array-of-references) –

+0

的可能重複你有一個答案。但是我很想知道你在哪裏找到了可怕的引用語法。大多數地方只是在提供可讀性更強(而且更容易混淆)的'$ _-> [2]'語法時才提及它。 –

+0

@DaveCross我認爲這是我第一次看到perldoc關於引用的語法:[link](http://perldoc.perl.org/perlref.html#Using-References),我發現它很直觀......個人而言,我並沒有發現'$$ _ [2]'或多或少會比'$ _-> [2]'混淆,而是習慣問題 – mable

回答

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]; 
+0

好吧,明白了!謝謝 :) – mable

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"; 
}