Perl语言入门:列表和数组

如果说标量代表的是单数,那么列表和数组代表的就是复数


列表和数组

列表和数组这两个概念常常混用——列表代表的是标量的有序集合,而数组是存储列表的变量,列表也叫“列表直接量”

数组的命名空间和标量的命名空间是相互独立的

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)(最后一个参数表示替换)



本文到此结束,下一讲“简单的控制流”、“子程序(函数)”,可能会涉及“IO”的知识(Perl的文件操作还是很爽的~)

你可能感兴趣的:(Perl,语言)