列表和数组用于表示复数(标量表示单数)
列表指的是标量的有序集合,数组是存储列表的变量;列表指的是数据,数组指的是变量;
列表和数组中的每个元素都和互不相关的标量变量,可以使数字、字符串、undef值或不同类型标量值的混合
数组和列表可以包含任意多的元素
数组
$fred[0]="aa";
$fred[1].="bb";
print $fred[3];
如果下标超出数组的尾端则对应的值为undef
数组会根据需要自动扩大
最后一个元素的索引值为$#数组名
列表
(1,2,3,100..200,"fred",$n..$m,$x+$y) #..表示到
列表的赋值
($a,$b,$c)=("aa","bb","cc");
($a,$b)=($b,$a); #交换变量的值
($a,$b,$c)=qw( aa bb cc );
@数组名1=(@数组名2,'aa',$n,..); #@数组名表示引用整个数组
@copy=@quarry; #将一个数组的列表复制到另一个数组,注意仍然是列表的赋值运算
qw简写
省去引号
格式:qw 定界符 内容 定界符
qw( a b cda );qw{ a b cba };qw! a b cba !; #如果定界符有对应的"右"形式则要以右形式结束
pop和push操作
把数组当做堆栈使用,对数组最右边进行处理
$x=pop(@array);
pop @array; #相当于丢弃数组array的最后一个元素,可以不要()
push(@array,0);
push @array,@others; #把数组others的全部元素值压入array
push @array,1..10;
shift和unshift
shift相当于pop,unshift相当于push,只不过是对数组最左边进行处理
$m=shift(@array); #把数组array最左边的元素弹出来给变量m
@others=1..3;
@array=(4,5);
unshift @array,@othters; #@array为(1,2,3,4,5)
splice操作符
对数组中的元素实现操作,删除,添加等
第一个参数为被操作数组,第二个参数为操作的起始位置(只有前两个参数则从起始位置到最后),第三个参数为操作元素的个数,第四个参数为插入的参数
@array=qw( a b c d );
@removed=splice @array,2; #@removed为qw( c d ),@array为qw( a b )
@removed=splice @array,1,2; #@removed为qw( b c ),@array为qw( a d )
@insert=qw( i );
@removed=splice @array,1,2,@insert; #@removed为qw( b c ),@array为qw( a i d )
splice @array,1,0,@insert; #@array为qw( a i b c d )
字符串中的数组内插
@insert=qw( b c );
print "there are a @insert d e\n" #打印there are a b c d e,元素之间会被默认加上空格
如果不要内插,要\@(比如写email地址的时候)
foreach控制结构
逐项遍历列表中的值
perl会自动存储foreach循环的控制变量并在循环结束后还原,所以不必担心之前是否用过同名变量
$x=k;
@array=qw( a b c );
foreach $k (@array)
{print $k;} #打印abc
print $k; #打印k
foreach (1..10)
{print $_;} #打印1到10,$_为默认变量,除此之外和别的变量无区别
print; #打印$_
reserve操作符
读取列表的值,并且按照相反的次序返回,但是不会修改传进来的参数
@array=qw(1..10);
@fred=reserve(@array); #@fred为10到1,@array仍然为1到10,可以去掉括号
sort操作符
读取列表的值,根据内部的字符编码顺序进行排序
@sorted=sort @array;
@sorted=reserve sort @array;
each操作
每次调用each返回数组下一个元素的索引和值
my @array=qw( a b c )
my( $index,$value )=each @array;
上下文
同一个表达式出现在不同地方意义不同
@array=pw( a b c );
@array2=sort @array; #列表上下文,c b a
$num=1+@array; #标量上下文,$num为4
scalar告诉perl把列表上下文切换到标志上下文
@array=pw( a b c );
print @array; #打印a b c
print scalar @array #打印3,因为array中有3个元素
<STDIN>中unix或类似系统用control+D告诉系统不会有任何输出,而DOS/Windows中用control+Z
比如输入三行数据,得到的数组包含三个元素,每个元素以换行符号结尾,去除:
chomp($lines=<STDIN>);