2013-08-20 63 views
0

我发现,这是你如何使用范围与数组引用:

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

所以,情况是我没有访问所有这些不同的Perl环境(测试),但如果代码,这将最终得到编译,未能编译,我惹上麻烦。

的Perl版本:5.16.25.10.1,并5.8.8

有人知道吗?

谷歌的Perl语法错综复杂而没有变得聪明,实际上是不可能的。我不够聪明为此做。

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

这是因为perl没有以合理的方式处理它,除非两个范围索引都是相同的符号:要得到一个包含从上到下的第5个分片,您只需使用@arr[-5..-1]

+6

这是明智的 - “-3.5”是系列-3,-2,-1,0,1,... 5,并且您正在索要这些指数的一部分。 **你恰好有一个六元素数组**,因此索引-3处的元素也与索引3处的元素相同。 – pilcrow

+0

现在我知道范围本身就是一个事物,并提供阵列切片之外的用途。 –

回答

6

这种表示法其实并不特别;这就是数组slice,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> 

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

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]; 
+0

我喜欢Python如何做。转动90度。 –

3

$#语法(用来获取的最后一个元素的索引中的阵列),因为5.x的线的曙光已经Perl的语法的一部分。实际上,$#array的语法已经存在,因为至少Perl 4,但引用(因此$#$aref语法)在Perl 5之前不存在。

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