我发现这是你使用带有arrayref的范围的方式:
@$aref[2..$#$aref]
因此,情况是我无法访问所有这些不同的perl环境(以测试它),但如果代码最终会在所有这些环境中进行编译,将失败为了编译,我遇到了麻烦。
Perl版本:5.16.2
,5.10.1
和5.8.8
有人知道吗?
在没有聪明的情况下,在物理上不可能使用perl语法复杂的谷歌。我不够聪明,不能这样做。
P.S。你知道吗? @$arr_ref[-3..$#$arr_ref]
为您提供最后三个元素,然后将整个数组附加到它上面。这显然是[-3..5]
的意思:将元素-3
(= 3)提供给5
,然后追加0
至5
。
这是因为perl不以合理的方式处理它,除非两个范围索引都是相同的符号:要获得包含从最后到结尾的第5个的切片,只需使用@arr[-5..-1]
。
答案 0 :(得分:6)
这种表示法实际上并不特别;它只是数组切片,arrayref,..
和$#
符号的工作方式,而且您可以直接将它们放在一起。但回答你的问题,是的,它适用于Perl 5.8.8:
$ perl -v | grep . | head -1
This is perl, v5.8.8 built for Linux-2.6c2.5-x86_64-64int
$ perl -e '$aref = [1 .. 5]; print "<$_>\n" foreach @$aref[2..$#$aref]'
<3>
<4>
<5>
(甚至在更早的版本中)。
答案 1 :(得分:4)
$#array
返回数组@array
的最后一个索引。同样,$#{ $aref }
返回$aref
引用的数组的最后一个索引。这可以缩短为$#$aref
。
$x .. $y
是范围运算符。它会将$x
的数字返回到$y
。 (它也适用于某些字符串。)例如,-3 .. 5
表示-3, -2, -1, 0, 1, 2, 3, 4, 5
。
@array[...]
是一个数组切片。它返回索引表达式指定的数组@array
的元素。同样,@{ $aref }[...]
返回$aref
引用的数组元素。这可以缩短为@$aref[...]
。
所有这些功能都早于5.8.8。它们甚至早于5.6.0。
$ perl -v | grep 'This is'
This is perl, v5.8.8 built for i386-linux-thread-multi
$ perl -le'@array = qw( a b c d e ); print @array[2..$#array]'
cde
$ perl -le'$aref = [qw( a b c d e )]; print @{ $aref }[2..$#{ $aref }]'
cde
$ perl -le'$aref = [qw( a b c d e )]; print @$aref[2..$#$aref]'
cde
请注意,Perl的开发人员目前正在讨论更强大的切片表达式。
现在,如果不使用该临时数组,就没有简单的方法来执行以下操作。
sub f { ... }
my @a = f();
my @b = @a[2..$#a];
答案 2 :(得分:3)
自5.x行开始以来,$#
语法(用于获取数组中最后一个元素的索引)已成为Perl语法的一部分。实际上,$#array
语法至少存在于Perl 4之后,但引用(因此$#$aref
语法)在Perl 5之前不存在。
虽然它不是简单的可搜索,但如果您想知道Perl中何时出现更改,您需要查看每个版本的perldelta文档。