列表和数组用于表示复数(标量表示单数)

列表指的是标量的有序集合,数组是存储列表的变量;列表指的是数据,数组指的是变量;

列表和数组中的每个元素都和互不相关的标量变量,可以使数字、字符串、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>);