如果说标量代表的是单数,那么列表和数组代表的就是复数
列表和数组这两个概念常常混用——列表代表的是标量的有序集合,而数组是存储列表的变量,列表也叫“列表直接量”
数组的命名空间和标量的命名空间是相互独立的
Perl的数组或者说列表中存储的各个标量是彼此独立的,也就是说在一个数组里可以存储不同类型的数据(但是通常不要这样做!)
$arr[0] = "hello";
$arr[1] = "world";
通常来说数组的大小是没有限制的,会根据需要自动扩大
arr[0] = 1;
arr[1] = 2;
arr[99] = 100; # 被新创建但没有赋值的元素是undef的
使用负数索引获取倒数元素的值
print arr[-1] # 在上一个栗子中,结果是100
@(all of)符号
可以读作“all of”,后面接数组名表示数组的所有元素,用来引用整个数组
@rocks = qw/bedrock slate lava/;
@tiny = ()
@quarry = (@rocks, @tiny, "hello"); # <==> ("bedrock","slate","lava","hello")
# 注意,数组不能作为另一个数组的元素(会被展开解释为数组中的元素)
# 注意,当某个数组赋值给另一个数组实际上是列表的复制
赋给数组的右值就是列表直接量
(1, 2, 3) # 包含1 2 3三个元素的列表
(1, 2, 3,) # 末尾的逗号会被忽略
("hi", 4.5) # 两个元素包括“hi”和4.5
() # 空列表,0个元素
(1..100) # 1~100(从1数到100,包含头尾)
qw(quote word)简写
qw(hello world and say hi to perl);
# <==> ("hello","world","and","say","hi","to","perl");
# Perl会将器当成单引号内的字符串处理
# 所以在qw简写中不能像双引号一样使用\n或$fred表示转义
# 其中的空白符会被抛弃,剩下列表和元素
# 另外,qw简写余旭使用多重不同的符号作为定界符,如qw# hello world and say hi to perl#虽然看起来是注释,但是实际上是一个列表,你也可以使用比如“/”或者“{}”甚至“!”作为定界符
列表的赋值
($fred, $barney, $dino) = ("flinstone", "rubble", "undef"); #列表的三个值分别赋给三个变量
($a, $b) = ($b, $a) # 交换a和b变量的值
# 如果左边的变量多于右边的元素,多出来的变量设为undef
# 如果右边的元素多于左边的变量,多出来的元素将被忽略
pop和push操作符
真正的Perl程序员是不用索引的!
可以把数组当作堆栈来用,用Perl的内置函数
@arr = 5..9;
$fred = pop(arr); # fred变成了9,现在arr是(5,6,7,8)
pop(@arr) # (空上下文)pop让数组的最后一个元素丢弃了,现在是(5,6,7)
push(@arr, 0) # @arr现在是(5,6,7,0)
# 注意,不论pop还是push操作的是数组变量,对列表直接操作是没有意义的
shift和unshift操作符
还可以把数组当作队列来用
@arr = qw# dino fred barney #;
$tmp = shift(@arr) # tmp='dino',@arr=('fred','barney')
unshift(@arr, 5) # arr=(5)
unshift(@arr, 3) # arr=(3,5)
unshift(@arr, 1..3) # arr=(1,2,3,3,5)
splice操作符
用来对数组的中间元素操作
一共有四个参数
@arr = qw(pebbles dino fred barney betty);
@removed = splice @arr, 1, 2, qw(wilma); #删除dino和fred
# @remove ==> qw(dino fred)
# @arr ==> qw(pebbles wilma barney betty)(最后一个参数表示替换)