为什么这个参考的 deref 不能作为单行工作?

Art*_*rez 0 perl

鉴于:

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)

我不明白为什么。我错过了什么?

zdi*_*dim 5

有一个简单的取消引用规则涵盖了这一点。粗略地说:

印记后面的内容需要是它的正确参考,或者是一个评估它的块。

来自 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)

切片 在perldata后缀参考切片 在perlref