- 列表----数组的形式
(1, "a", 2.3, $a, $x+1) 元素可以是任意类型,变量,表达式
空列表: ()
单元素列表: (2) .与值2不同。
qw(1 $a str) qw用法同q,qq类似。()可替换成其他符号<>。元素可以为值,变量,不同引号的字符串,元素之间由空格分开。
作为逗号运算返回最后边的元素。 $a=(1,2) ----->$a=2;
- 范围运算符 ..
每次增1,元素从左边的值增加到右边的值,可部分使用范围,小数同样也增1,到小于右边的小数,同样可用于字符串增加,
(1..6)----->(1,2,3,4,5,6)
(1,2..5,6)----->(1,2,3,4,5,6)
(2.4..5.3)---->(2.4, 3.4, 4.4)
("aa".."ad")----->("aa”, "ab", "ac", ”ad");
$month=('01'..'31');
($a, $a+3)---->若$a=3,则为(3,4,5,6)同样可用于变量表达式。
- 数组------列表的存储 @a=(1,2,3)
数组的元素为简单变量,以$开头,元素形式:$a[0]
负索引:最后一个元素可以用$a[-1]表示,倒数第二个为$a[-2].
列表也可以有下标:(1,2,3)[0]------>1,但是列表没有存储,不能在下次使用。
在字符串中"$a[0]"为元素,"$a\[0]" "$a{a}[0]" "$\{a}[0]"均为字符串$a[0],不是数组的元素。
数组的赋值
1: @a=(1,2,3,4);
2: @b=(1,2,3,4), @a=@b;
3: @b=(2,3), @a=(1, @b, 4);
4: @b=('a') x 4; ------->@b=('a', 'a', 'a', 'a');
5: @b=<>; 从标准输入读出一行赋于元素,最后用ctrl-d结束输入。
改变元素的值:$a[1]=3;
超出数组大小的元素:$a[5]=6; @a=(1,2,3,4,"",6),数组自动增长,原来没有的元素值为NULL。
多元素读取:
每个元素对应到变量:@a=(1,2,3); ($x,$y,$z)=@a;----->$x=1;$y=2;$z=3;
多余的变量为空:($a,$b,$c,$d)=@a;------>$a=1,$b=2,$c=3,$d="";
变量不足,后续元素忽略:($a,$b)=@a;------->$a=1;$b=2;
数组读取:
@a=(1,2,3);
$a=@a; $a返回的是数组的长度。 ($a)=@a; 为读取第一个元素。
$a=(1,2,3); 列表赋给简单变量返回的是最右边的元素, $a=3;
可读可写变量$#a存储的是数组a的最后一个元素的索引,返回值是字符串类型。加1即为数组的长度。但对$#a赋值就改变了数组a的长度。
数组的输出:
print @a; 元素相连。 print "@a"; 元素之间以空格分开。
数组片段:
@a=(1,2,3,4,5)
读出:@sub=@a[0,1,3]------->@sub=(1,2,4)
赋值:@a[1,3]=("a","b")------->@a=(1,"a",3,"b",5)
范围:@sub=@a[1..3]-------->@sub=(2,3,4)
$x=1,$y=3; @sub=@a[$x..$y];----------->@sub=(2,3,4)
列表:@b=(1,2,3);@sub=@a[@b];--------->@sub=(2,3,4)
@b=(2,3);@sub=@a[1,@b];--------->@sub=(2,3,4)
($a,@b,$c)=(1,2,3,4,5)----->$a=1, @b=(2,3,4,5),$c=""
数组元素重叠:
交换: @a[1,2]=@a[2,1]--------->@a=(2,1,3,4,5)
重叠: @a[1,2,3]=@a[3,2,4]-------->@a=(1,4,3,5,5)
数组操作函数:
sort {代码块}或函数名 (@array) ,缺省按字母排序,可省略代码块;若数组内容为数字,要按不同的排序方式排序,则需要用上"{代码块}或函数名",内置变量$a,$b代表数组的元素,会屏蔽先前的自定义变量,@_代表数组。
reverse @a ,数组反序
chop @a 每个元素都截去最后一个字符
shift(@a) 删除数组第一个元素,返回删除的元素。若不写@a,缺省对@ARGV数组
unshift(@a,$a):在数组开头添加元素,返回新数组的长度
push(@a, $a):在数组末尾添加元素
pop(@a):在数组末尾删除元素。
join('连接符',数组或列表) 把数组或列表的元素用'连接符'连接成一个字符串
@a=('a','b'); join(',', @a)='a,b'; //连接数组元素
join(',', 'a','b')='a,b'; //连接列表元素
split(/模式/,待分割字符串,长度)
模式:缺省为空格,可省略
分割串:缺省为$_,可省略、
长度:要分割成多少段,可省略代表全部分割
$s="a,b,c"; @a=split(/,/,$s);------>@a=('a','b','c');
@a=split(/,/,$s,2);------->@a=('a','b,c');
在Perl中,来自子程序的返回值既可是一个标量,也可以是一个列表。另外,甚至可以让一个子程序的返回值变得“不确定”----一次调用既有 可能返回一个列表,也有可能返回一个标量---具体由子程序的调用场合来决定。为支持这种不确定性,Perl专门提供了wantarray函数。 一旦在子程序主体中调用了这个函数,那么假如子程序是在一个列表试用场合下调用的,该函数便返回一个真值;假如子程序是在一个标量使用场合下调用的,该函 数便返回一个假值。
sub mysub()
{
print wantarray() ? "数组\t" : "变量\n";
}
@a=mysub; //这是数组环境,打印“数组”
$a=mysub; //这是变量环境,打印“变量”
splice
@ret=splice(@a,skip,length,@newlist)
对@a操作,跳过skip个元素,然后开始用@newlist替换length个元素。@newlist和length可以不等长,无论@newlist多长,它占用(替换)length长的元素位置。
当length=0时为插入。splice(@a,-1,0,@newlist)在末尾追加
当@newlist为空则为删除。
当length和@newlist省略时为其后的全部删除。splice(@a,3);
@found=grep(/patten/,@search)对@search的每一个元素搜索匹配模式,匹配的元素返回到@found数组中。
map(expr, @list)对@list的每个元素进行expr运算,返回运算后的数组。元素用$_代表。map($_+1, (1,2))--------->(2,3)
二维数组:
$aoa=[[1,2,3],['a','b','c']];
子数组访问:@{$aoa->[0]} //打印第一个数组的所有元素
子数组元素列表:@{$aoa->[0]}[0,1] //打印第一个数组的第一第二个元素
元素访问:$aoa->[0][0]
print "@$aoa\n" //打印两个子数组的地址
由两个一维数组构成二维数组:
@a=(1,2,3); @b=('a','b','c'); $aoa=[[@a],[@b]];