Perl中的数组和负索引

6

我是一个Perl的新手,正在学习数组相关的内容。
我理解数组可以根据需要自动扩展(很酷!)
但我也读到我们可以使用负数索引以相反的顺序访问数组。
例如,一个由3个元素组成的数组可以被访问为:
$array [0] $array [1] $array [2]
或者
$array [-1] $array [-2] $array [-3] (以相反的顺序)。
我的问题是对于小于-3的值,例如$array [-5]会发生什么?
数组会扩展吗?


6
试一试。这些类型的问题很适合你自己解决。 - chrsblck
3
为什么不试一试呢? - marcadian
我可以试一下,但我正在尝试理解内存模型,在 Perl 中是否有意义。如果不行的话我可以关闭这个问题。 - Cratylus
简单地说,undef 就是你得到的。 - Miguel Prz
1
你可以用一行代码来测试它,但一定要使用-w选项以便显示所有问题。(使用脚本语言的一个原因是因为测试非常容易。) - William
3个回答

9
如果你读取它,结果与读取$array[5]相同——该值不存在,您会得到undef。向左越界和向右越界是一样的。
如果您写入它,将会出现错误。数组只能自动向右扩展。

我有一个特殊版本的Perl,其中我的数组面向我以零为起点。它们只能自动向远离我的方向扩展。 - Borodin

2

如果您读取该值,则会得到未定义的值。

use strict;
use warnings;

my @l = qw(A B C);
print $l[-4];

输出到 stderr(程序继续运行):

Use of uninitialized value in print at ./x.pl line 7.

或者:

my @l = qw(A B C);
print "undef" if !defined $l[-4];

输出:

undef

如果您想给它赋值,会出现错误:

my @l = qw(A B C);
$l[-4] = "d";

输出(程序退出):

Modification of non-creatable array value attempted, subscript -4 at ./x.pl line 7.

实际上,间隔可以被修改。因此,数组可以从任何值开始,而不仅仅是0。

my @l = qw(A B C);
$[ = -4; # !!! Deprecated
print $l[-4], "\n";
print $l[-3], "\n";

输出:

A
B

1
$[已被弃用,请勿使用。 - ysth

1
您无法这样做,它会抛出错误:

尝试修改不可创建的数组值,下标为-2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接