列表和数组都是复数名词,列表是直接量,数组是变量,即装列表的容器。
1、列表
直接使用( , , )将若干标量包起来。
() #空列表
范围操作符:".."
1 .. 5 #即从1到5
5 .. 1 #无法计算,结果为undef,因为不能递减计算
a .. z #全部小写字母
A .. Z #全部大写字母
aa .. zz #676个字母
省略引号的字符串列表:qw
把分界符内的字符串当成单引号字符串,并用空白分隔
qw\a b c\ #即(‘a’, 'b', 'c')
注意:分界符可以使用任意两个相同的标点符号或左右对称的分界符
qw!a b c!; qw#a b c#; qw{a b c}; #都表示(‘a’, 'b', 'c')
列表对列表的赋值,例:
($a, $b, $c) = (1 .. 3); #注意两边长度不等可能会有意外情况发生
2、数组:按数字顺序存贮列表中的元素
从0开始计数
$a[n] #提取数组@a中第n-1个元素,n可以是表达式
$#a #数组最后一个元素的索引值,注意:数组长度为$#a+1
$a[-1] #数组最后一个元素
reverse @a; #返回和数组a反顺序的一个数组,但不改变数组a本身
sort @a; #读取数组a,返回按ASCII码排序的一个结果,但不改变数组a本身
pop @a; #取出数组a的最后一个元素并返回该值
push @a, 'b'; #在数组a末尾添加一个元素,该元素为字符b
push @a, 6, 7, 8 #在数组a末尾添加三个数值
shift @a; #取出数组a的第一个元素并返回该值
unshift @a, 'b'; #在数组a起始添加一个元素,该元素为字符b
unshift @a, 6, 7, 8 #在数组a起始添加三个数值
在双引号字符串中替换数组时,数组中的相邻元素会使用空格作为分隔符。
实际上该分隔符是perl中的一个特殊变量$"的值,默认为空格。
例:
@a=(1 ..10);
print "@a"; #元素之间空格分隔
print @a; #元素之间没有分隔
注意:在双引号替换时,虽然在元素之间有空格分隔,但数组前后两端不会添加空格
@a=undef; #不是空列表,而是包含一个元素的数组,该元素的值为undef
@a=(); #这才是空数组
splice的用法
参考:http://blog.sina.com.cn/s/blog_88a2ce2f0100vm2j.html
splice (@a,offset,length,list) #在数组a中,从offset开始,删除length个元素,并在此插入list
@a=1 .. 10; “1 2 3 4 5 6 7 8 9 10”
splice (@a, 2, 3, a .. e); #“1 2 a b c d e 6 7 8 9 10”
splice (@a, 2, 3) #无插入,直接删除。“1 2 d e 6 7 8 9 10”
splice (@a, 5) #省略length,则删除offset后的所有元素。“1 2 d e 6”
splice (@a) #删除数组a
@a=1 .. 10; “1 2 3 4 5 6 7 8 9 10”
splice (@a, 5, -2, a .. e) #offset后面所有元素,保留倒数length个元素。“1 2 3 4 5 a b c d e 9 10”
splice (@a, -5, 3) #"1 2 3 4 5 a b 9 10"
splice (@a, -5, -3) #"1 2 3 4 b 9 10"
3、标量上下文和列表上下文
perl根据上下文环境判断当前位置应该是一个列表还是一个标量。
如果使用了错误的数据形式可能会发生意外。
scalar @a; #强制使用标量上下文
例:
@a=(1 .. 10);
print @a, "\n";
print scalar @a, "\n";