Perl数组拼接语法

时间:2013-04-19 20:22:18

标签: arrays perl

为什么第三次打印失败?

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之外,这个特殊语法提供了什么(如果有的话)?它是某种糖(由于它只有一个字符而变得很奇怪),其中子索引中使用的数组符号意味着“该数组的长度”吗?

2 个答案:

答案 0 :(得分:5)

根据print

,第3 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包含元素,则@a4-@a-4

因此,对于包含四个元素的数组,
@a[-@a..-2]表示@a[-4..-2]
这意味着@a[-4,-3,-2]
意思是“从结尾开始的第4个元素,从结尾开始的第3个元素,从结尾开始的第2个元素”,
表示“元素0,1和2”。

相关问题