0

我发现这就是你如何将范围与 arrayref 一起使用:

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

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

Perl 版本:5.16.25.10.15.8.8

有人知道吗?

在不聪明的情况下,用谷歌搜索 perl 语法的复杂性是不可能的。我不够聪明,无法做到这一点。

PS你知道吗?@$arr_ref[-3..$#$arr_ref]给你最后三个元素,然后将整个数组附加到它上面。这显然是什么[-3..5]意思:给元素-3(= 3)到5,然后追加0通过5

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

4

3 回答 3

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>

(甚至在更早的版本中)。

于 2013-08-20T18:34:57.453 回答
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];
于 2013-08-20T18:47:46.820 回答
3

$#语法(用于获取数组中最后一个元素的索引)从 5.x 行开始就成为 Perl 语法的一部分。实际上,该$#array语法至少从 Perl 4 开始就已经存在,但引用(因此$#$aref语法)直到 Perl 5 才存在。

虽然它不是很容易搜索,但如果您想知道 Perl 中何时出现更改,您需要查看每个版本的perldelta文档。

于 2013-08-20T19:15:42.537 回答