什么版本的Perl支持$#$ sigil?

时间:2013-08-20 18:23:07

标签: perl range

我发现这是你使用带有arrayref的范围的方式:

@$aref[2..$#$aref]

因此,情况是我无法访问所有这些不同的perl环境(以测试它),但如果代码最终会在所有这些环境中进行编译,将失败为了编译,我遇到了麻烦。

Perl版本:5.16.25.10.15.8.8

有人知道吗?

在没有聪明的情况下,在物理上不可能使用perl语法复杂的谷歌。我不够聪明,不能这样做。

P.S。你知道吗? @$arr_ref[-3..$#$arr_ref]为您提供最后三个元素,然后将整个数组附加到它上面。这显然是[-3..5]的意思:将元素-3(= 3)提供给5,然后追加05

这是因为perl不以合理的方式处理它,除非两个范围索引都是相同的符号:要获得包含从最后到结尾的第5个的切片,只需使用@arr[-5..-1]

3 个答案:

答案 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文档。