为什么第三次打印失败?
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
之外,这个特殊语法提供了什么(如果有的话)?它是某种糖(由于它只有一个字符而变得很奇怪),其中子索引中使用的数组符号意味着“该数组的长度”吗?
答案 0 :(得分:5)
根据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]
。根据{{1}}:
负下标从末尾检索其值。
所以,3是索引-1,2是索引-2,1是索引-3而0是索引-4。
答案 1 :(得分:4)
-@a
没有什么特别之处。在标量上下文中,@a
返回数组中元素的数量,因此-@a
返回该数字的负数。例如如果@a
包含元素,则@a
为4
,-@a
为-4
。
因此,对于包含四个元素的数组,
@a[-@a..-2]
表示@a[-4..-2]
,
这意味着@a[-4,-3,-2]
,
意思是“从结尾开始的第4个元素,从结尾开始的第3个元素,从结尾开始的第2个元素”,
表示“元素0,1和2”。