perl中的负数组索引如何工作?

时间:2014-01-08 06:59:29

标签: arrays perl

最近我在perl作品中遇到负面索引。基本上当我们给perl中的数组赋一个负索引时,它会从后面开始遍历 例如:

@numbers = (1,2,3,4,5,6);
print "$numbers[-1]\n";

它将输出打印为 6 。如果我将索引设为 -2 ,则会打印 5 ,依此类推。
根据我的理解,数组内存如下:
enter image description here

我想知道,指数 -1 在perl中如何成为 n 。任何人都可以解释这是如何工作的?

P.S:如果我在java中使用否定索引,则会抛出java.lang.ArrayIndexOutOfBoundsException

5 个答案:

答案 0 :(得分:7)

  

任何人都可以解释这是如何工作的?

用于获取数组元素av_fetch的Perl API调用执行与C等效的

my $real_index = $index < 0 ? @array+$index : $index;

more precicely

$index += $#array+1 if $index < 0;

答案 1 :(得分:5)

More About Indices

我们之前说过,数组索引是非负整数。虽然在某种程度上这是严格正确的,但perl可以方便地使用负索引从数组末尾索引元素。 -1指的是倒数第二个元素的最后一个元素-2,依此类推。为了过分简化,-1就像$#array的别名一样......但仅限于索引@array的上下文!

以下是等效的:

$array[ -1 ]
$array[ $#array ]

但要注意:

@array[ 0 .. $#array ]

不能写成:

@array[ 0 .. -1 ]

因为在这种情况下,-1是..范围运算符的参数,它不知道实际上需要什么“最高索引号”。


它的工作原理是因为它在数组索引的上下文中使用时实际上只是一个别名。

答案 2 :(得分:3)

Perl数组不是C数组。它们更像是Java的javal.util.ArrayList。此数据结构包括一些元数据,如数组的长度,而不仅仅是起始指针。

现在在Perl中,当数组访问代码看到负索引时,它会添加数组的长度:给定长度为n+1的数组,则-1 + (n+1)为索引n。这是一种方便的语言功能,但有些语言(尤其是像C这样的“系统编程语言”)希望避免隐含的开销。

答案 3 :(得分:0)

虽然在某种程度上这是严格正确的,但perl可以方便地使用负索引来索引数组末尾的元素。 -1表示最后一个元素,-2表示倒数第二个元素,依此类推。为了过度简化,-1充当$#array的别名...但仅在索引@array的上下文中!

答案 4 :(得分:0)

这是一个记录在案的功能。 (请参阅perldoc perldata下标部分。)