Perl:数组引用的负范围索引

Perl: Negative range indexing of array reference

我有一个数组引用,我想将数组的最后两个元素切片。我发现使用 -2..-1 会起作用。我使用的是以下语法:

subroutine($var->[-2..-1]);

这给了我以下错误:

Use of uninitialized value $. in range (or flip)
Argument "" isn't numeric in array element

我将线路更改为这个并且有效:

subroutine(@$var[-2..-1]);

我不明白为什么第二种方法有效而第一种方法无效。我认为使用数组运算符与使用 @ 取消引用是一样的。箭头运算符的上下文是否有歧义?

-> 是取消引用运算符。 $aref->[$i] 之于 $aref 就像 $arr[$i] 之于 @arr。要从数组中获取切片,您需要更改印记:@arr[$i, $j]。它与解引用类似,但不是更改印记,而是首先解引用引用,然后对其进行切片:

@{ $aref }[$i, $j]

可以缩短为@$aref[$i, $j]

因此 -> 运算符只能用于数组和散列引用的单个值。切片需要 @{}