2

为什么第三个print失败?

my @a = (0,1,2,3); 
print @a[-@a..-2];  # works
print @a[0..2];     # works
print @a[0..-2];    # prints nothing 

我不清楚-@a这个@a[-@a..-2]陈述中使用的含义。这是一种特殊的语法吗?除了$#a例如,这种特殊语法还提供了什么(如果有的话)?是否是某种糖(这很奇怪,因为它只短了一个字符),其中子索引中使用的数组的符号表示“该数组的长度”?

4

2 回答 2

5

第 3 次print不打印任何内容,因为根据perldoc perlop

如果左值大于右值,则返回空列表。

另见perldoc B::Deparse

$ perl -MO=Deparse code.pl
my(@a) = (0, 1, 2, 3);
print @a[-@a .. -2];
print @a[0..2];
print @a[()];

我相信print @a[-@a..-2];“有效”,因为它真的很像@a[-4 .. -2]. 根据perldoc perldata

负下标从末尾检索其值。

因此,3 位于索引 -1,2 位于索引 -2,1 位于索引 -3,0 位于索引 -4。

于 2013-04-19T20:26:43.033 回答
4

没什么特别的-@a。在标量上下文中,@a返回数组中元素的数量,因此-@a返回该数字的负数。例如,如果@a包含元素、@ais4-@ais -4

因此,对于具有四个元素的数组,
@a[-@a..-2]表示@a[-4..-2]
表示@a[-4,-3,-2]
表示“从末尾开始的第 4 个元素,从末尾开始的第 3 个元素,从末尾开始的第 2 个元素”,
表示“元素 0、1 和 2” .

于 2013-04-19T20:30:52.903 回答