数组和列表包含一个有序的标量集合。 除了使用引用(这会在另一个概念中介绍)之外,这意味着数组和列表始终是扁平的,也就是说,它们不能包含其他数组或列表。
大多数情况下,列表由括号 () 包围,其中的元素用逗号 , 分隔。
数组变量通常通过把列表赋值给它来填充,例如my @names = ('Alice', 'Bob', 'Charlie');。
可以通过下标指定索引来访问数组或列表的元素,例如('Alice', 'Bob', 'Charlie')[1] # 'Bob'。
Perl 中的索引从 0 开始。
负索引会从数组或列表的末尾开始计数,例如('Alice', 'Bob', 'Charlie')[-1] # 'Charlie'。
有许多函数可用于操作数组和列表,其中最有用的一些是 grep(生成一个由匹配条件的元素组成的新列表)、map(把元素转换成一个新的值列表)和 sort(生成一个重新排序的元素列表)。
用于操作数组的函数包括 push(在末尾添加元素)、pop(移除最后一个元素)、shift(移除第一个元素)、unshift(在开头添加元素)以及 splice(进行更复杂的修改)。
你还会经常遇到使用 for(each) 语句遍历数组和列表的情况。
访问数组的元素时,所用的符号决定了结果。
变量名末尾的下标 [] 告诉 Perl,你正在访问以该名字命名的数组。
my @names = ('Alice', 'Bob', 'Charlie');
$names[0]; # 'Alice' <- A scalar
@names[0]; # ('Alice') <- A slice (with only one index, this probably isn't what you want. There will be a warning.)
%names[0]; # (0, 'Alice') <- A key/index + value slice
$names[1, 2]; # 'Charlie' <- A scalar (via unsupported syntax for an ancient feature. Probably not what you want. There will be a warning.)
@names[1, 2]; # ('Bob', 'Charlie') <- A slice
%names[1, 2]; # (1, 'Bob', 2, 'Charlie') <- A key/index + value slice
虽然允许这样做,但为了可读性,建议不要让不同类型的变量共用同一个名字。
数组和列表有许多相似之处,在很多地方可以互换使用,但它们并不是一回事。 列表是固定且不可变的标量集合。 数组是可变的标量集合,其内容和数组本身的大小都可以改变。
在某些上下文中,它们的行为不同。 在标量上下文中使用数组,会得到数组的大小。 在标量上下文中使用列表,会得到列表中的最后一个元素,还可能出现一些警告,提示其余内容被用在空上下文中。
my @names = ('Alice', 'Bob', 'Charlie');
scalar @names; # 3
scalar ('Alice', 'Bob', 'Charlie'); # 'Charlie' (and some warnings).
更多内容请参阅以下常见问题解答:列表和数组有什么区别?