列表和数组都是复数名词,列表是直接量,数组是变量,即装列表的容器。
1、列表
直接使用(,)将若干标量包起来。
()??? #空列表
范围操作符:".."
??? 1 .. 5??? #即从1到5
??? 5 .. 1??? #无法计算,结果为undef,因为不能递减计算
??? a .. z??? #全部小写字母
??? A .. Z??? #全部大写字母
??? aa .. zz??? #676个字母
省略引号的字符串列表:qw
??? 把分界符内的字符串当成单引号字符串,并用空白分隔
??? qwa b c??? #即(‘a’,'b','c')
??? 注意:分界符可以使用任意两个相同的标点符号或左右对称的分界符
??? qw!a b c!; qw#a b c#; qw{a b c};??? #都表示(‘a’,'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,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,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,-3)??? #"1 2 3 4 b 9 10"
3、标量上下文和列表上下文 perl根据上下文环境判断当前位置应该是一个列表还是一个标量。 如果使用了错误的数据形式可能会发生意外。 scalar @a;??? #强制使用标量上下文 例: @a=(1 .. 10); print @a,"n"; print scalar @a,"n";