发布于2026-06-29 阅读(0)
扫一扫,手机访问
Perl 中的列表与数组,可以说是这门语言最基础也最灵活的数据结构之一。很多初学者一开始会被它们看似相近的概念搞混,但实际上,理解清楚这两者的区别与用法,后面的编程就会顺畅得多。下面我们一步步把它们拆开来看。

列表就是放在圆括号里的一串值,可以是数字、字符串,甚至什么也没有——空列表 ()。比如 (1, 5.3, "hello", 2) 就是一个典型的列表。有一点要注意:单独一个数值的列表(比如 (43.2))和这个数值本身(43.2)在类型上并不相同,但 Perl 会在需要的时候自动进行转换。来看几个例子:
列表本身只是一串数据,而数组则是用来存放这些数据的变量。数组变量以 @ 开头,比如:
几个需要记住的点:
()。@ 和 $ 来区分数组变量和普通标量,所以同一个名字可以同时用于数组和标量(比如 $var 和 @var 可以共存),但这样做很容易让人糊涂,所以不推荐这么干。数组元素用下标访问,第一个元素下标是 0。访问不存在的元素会得到 undef,但如果你给一个超出当前长度的下标赋值,数组会自动增长,中间空缺的位置自动补上 undef。看看下面这段:
数组之间可以直接拷贝:
也可以用数组给列表赋值:
数组还可以给标量变量赋值——注意这种赋值是按列表匹配的:
@array = (5, 7, 11); ($var1, $var2) = @array; 结果 $var1=5, $var2=7,剩下的 11 被忽略。undef。从标准输入读取也很方便:
在双引号字符串中,"$var[0]" 会被解释为数组 @var 的第一个元素。如果你不想这样,可以用反斜线转义:"$var[0]" 等价于 "$var" . "[0]"。另外 "${var}[0]" 和 "$var[0]" 效果相同。而 "${var}" 则把花括号当成普通字符,不会做变量替换。
用 .. 运算符可以便捷地生成连续数值或字符串的列表:
对于实数,.. 按步长 1 递增:(2.1..5.3) 得到 (2.1, 3.1, 4.1, 5.1)。如果起始值大于结束值,返回空列表。
对于字符串,.. 按照 ASCII 顺序自动递增,比如 ("aaa".."aad") 得到 ("aaa","aab","aac","aad")。甚至可以用它来生成日期的字符串:@day_of_month = ("01".."31")。
范围中还可以包含变量或表达式,比如 ($var1..$var2+5)。一个小技巧:利用 x 操作符重复字符串:
结果会输出两行 "Hello, Fred!"。
将数组直接放在 print 中,元素会被紧密拼接在一起:
但如果把数组放在双引号里,元素之间会自动用空格分隔:
当数组出现在期待标量的上下文时,Perl 会自动取其长度:
利用这个特性可以很方便地控制循环次数:
你可以用多个下标或范围来截取数组的一部分:
利用子数组还可以轻松交换两个元素的位置:
Perl 提供了一些非常实用的数组处理函数,下面列出最常用的几个。
sort —— 按字符顺序排序:
reverse —— 反转数组:
chop —— 去掉每个元素末尾的字符(通常用于去掉换行符):
join/split —— 连接与拆分:
如果把标量比作 Perl 中的单数,那么列表和数组就是复数。列表是标量的有序集合,而数组则是用来存放列表的变量。虽然在实际使用中这两个术语经常被混用,但严格来说,列表指的是数据本身,数组是存放数据的变量名。你可以有一串值(列表)而不属于任何数组;但每一个数组变量都对应一个列表,哪怕它是空的。
列表中的每个元素都是独立的标量值,它们按顺序排列,从索引 0 开始递增。一个列表或数组可以包含数字、字符串、undef 甚至不同类型混合在一起。当然,实际编程中建议保持类型一致,这样代码更容易理解。
列表和数组的长度没有硬性限制——最少 0 个元素,最多可以填满你的可用内存。这正体现了 Perl 的设计哲学:“不必要的限制一律不要”。
通过索引访问元素非常直观:$array[0] = "test"; print $array[0];。注意数组名和标量名属于不同的命名空间,所以你可以同时拥有 $array 和 @array,但不要这么做,容易混淆。
如果你给数组最后一个元素后面的位置赋值,数组会自动扩展。Perl 不会限制你的长度,只要你内存够用。自动扩展时,中间缺失的元素会被赋值为 undef。
获取数组最后一个元素的索引可以用 $#array。另外 Perl 还支持负数索引:-1 表示最后一个元素,-2 表示倒数第二个,依此类推。不过实际中大多数人只用 -1。
列表就是用圆括号括起来、逗号分隔的一系列值。这些值不一定是常数,也可以是表达式,在运行时才计算。
字符串列表在 Perl 中太常用了,所以有了 qw 这个便捷写法。它把空白分隔的单词当成单引号字符串处理,省去大量输入引号的麻烦。注意 qw 内部不能使用变量替换和转义字符 \n,而且不能用注释。Perl 允许任何标点符号作为分隔符,比如 qw/ ... /、qw{ ... } 等。
你可以像给标量赋值一样,把列表赋给一组变量:
左边的每个变量都会得到对应的值,这相当于连续执行三个赋值语句。甚至可以用它来交换两个变量的值——因为列表是在赋值之前就已经构建好了。另外,如果你想引用整个数组,只需在数组名前加 @(不带中括号)。
pop 从数组末尾取出并返回最后一个元素:
push 则相反,把一个或多个元素追加到数组末尾:
注意,push 的第一个参数或 pop 的唯一参数必须是数组变量。
push/pop 操作的是数组末尾,而 shift 和 unshift 则操作数组开头(也就是下标最小的那一端)。shift 取出并返回第一个元素,unshift 将元素插入到开头。
数组可以像标量一样直接放入双引号字符串中:
此时元素之间会自动以空格分隔。
$_ 是 Perl 中使用最广泛的默认变量。很多操作在没有明确指定变量时,会自动使用 $_:
它会打印出 "yahoo google baidu"。
reverse 返回输入列表的反转顺序,但它不会修改原数组:
如果反转后的结果没有赋值给任何变量,那这次操作就没有实际意义。
sort 根据内部的字符顺序对列表进行排序:
上下文是 Perl 中非常重要的概念。同一个表达式在标量上下文和列表上下文中的行为可能完全不同:
当 reverse 用在标量上下文时,它会把整个列表当作字符串反转:
如果表达式产生的是标量值,当它出现在列表上下文时,会自动转换成一个单元素列表:
当你需要标量上下文,但 Perl 默认给你列表上下文时,可以用 scalar 函数强制转换:
注意,Perl 没有对应的函数能强制转换为列表上下文,因为上下文是由表达式所在的位置决定的。
上一篇:Perl中的文件读写学习笔记
下一篇:Perl读写文件简单示例
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8