理解列表

当使用下面的语法创建数组时:

my @arr = (11,22,33);

实际上,左边的@arr表示arr是一个数组变量,右边括号包围的(11,22,33)是一个列表,整个代码表示将列表中的所有元素保存到数组arr中。

列表还可以使用qw来表示:

my @arr = qw(11,22,33);

也可以直接对列表进行索引取值:

my $a = (11,22,33)[2]; # $a=33

要注意,Perl中的列表不是数据类型,而是Perl在内部用来临时存放数据的一种方式,只能由Perl自行维护。

实际上,列表临时保存在栈中,当使用了列表数据后,这些列表数据就会出栈。根据使用列表的不同使用环境,列表数据可能是被复制到了堆内存中保存起来(比如赋值给数组),也可能是用完直接消失(比如一次性使用的列表)。

区分列表和数组

学习Perl的时候,需要区分列表和数组。如果了解过其他编程语言,可以将Perl列表看作是一种特殊的底层可迭代对象,它看起来像数组,但不是数组。

数组是列表最直观的一种体现形式,是暴露给编程人员的一种数据类型。创建数组时,初始化数组元素很可能来自于列表:

my @arr = (11,22,33);  # 数组arr的元素来自于列表

上面的赋值语句,其内部过程大致为:在栈中存储好列表元素,当开始赋值时,perl将栈内列表各元素拷贝到堆内存,并在数组变量arr的各内存中保存这些堆内存数据的引用地址。拷贝完成后,栈中的列表数据全部出栈。

编程人员可以直接操作数组,比如可以将元素push到一个数组,可以pop弹出数组最后一个元素,等等,这些操作无法用于列表。而元素排序、元素筛选、迭代遍历等操作,都可以用于列表。