鉴于:
my @list1 = ('a');
my @list2 = ('b');
my @list0 = ( \@list1, \@list2 );
Run Code Online (Sandbox Code Playgroud)
然后
my @listRef = $list0[1];
my @list = @$listRef; # works
Run Code Online (Sandbox Code Playgroud)
但
my @list = @$($list0[1]); # gives an error message
Run Code Online (Sandbox Code Playgroud)
我不明白为什么。我错过了什么?
有一个简单的取消引用规则涵盖了这一点。粗略地说:
印记后面的内容需要是它的正确参考,或者是一个评估它的块。
来自 perlreftut 的一个具体案例
您始终可以使用花括号中的数组引用来代替数组的名称。[...]
在你的情况下,它应该是
my @list = @{ $list0[1] };
Run Code Online (Sandbox Code Playgroud)
(不是索引,[2]因为你@list0有两个元素)空格只是为了便于阅读。
所尝试的@$($list0[2])是一个语法错误,首先是因为((以下所述$)中不允许的标识符(变量名),什么推测得出$。
{}尽管在$and之后允许块被评估,并且在这种情况下应该产生一个标量引用,被它$前面的引用取消引用;但是第一个@会出错。如果推动,这会变得混乱。虽然确切的规则(仍然)有点模糊,但请参阅perldata 中的标识符解析 。
@$listRef一般来说,较早的是正确的语法。但它指的是一个标量变量$listRef(它最好是一个数组引用,因为它在那里被取消引用到一个数组中),并且示例中没有这样的东西——你有一个数组变量@listRef。
因此,use strict;实际上这也将无法编译。
请注意,取消引用 arrayref 以分配新数组的开销很大,因为它必须复制所有元素(并构造新的数组变量),而很少需要它(除非您确实想要一个副本)。有了手头的数组引用 ( $ar),您可能需要的一切都可以轻松获得,
@$ar; # list of elements
$ar->[$index]; # specific element
@$ar[@indices]; # slice -- list of some elements, like @$ar[0,2..5,-1]
$ar->@[0,-1]; # slice, with new "postfix dereferencing" (stable at v5.24)
$#$ar; # last index in the anonymous array referred by $ar
Run Code Online (Sandbox Code Playgroud)