2010年(122)
分类:
2010-07-15 17:17:19
第三章 列表与数组
在Perl里代表复数的就是列表和数组。列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。更精确地说,列表指的是数据,而数组指的是变量。列表的值不一定要放在数组里,但每个数组变量都一定包含一个列表(即使该列表可能是空的)。
数组或列表中的每个元素(element)都是单独的标量变量,拥有独立的标量值。数组或列表中的每个元素都有相应的整数作为索引,从0开始。
每个元素都是独立不相关的标量值,所以列表或数组可能包含数字、字符串、undef值或是由不同类型标量值的混合。最常见的,还是让所有元素都具有相同的类型。
访问数组中的元素
数组元素是以连续的整数来编号的;数组的名字空间和标量的名字空间,是完全分开的。
$fred[2.22]即是$fred[2];
超出数组的尾端,则对应的值将会是undef。
特殊的数组索引值
假如你对索引值超过数组尾端的元素进行赋值,数组将会根据需要自动扩大。
数组的最后一个索引值是$#array,这个数字比数组元素的个数少1。
负数数组索引值,假如你在数组中有3个元素,则有效的负数索引值为-1(最后一个元素)、-2(中间的元素)以及-3(第一个元素)。
列表直接量
程序中需要引入列表的时候可以写成数组的样子,也就是在圆括号中用逗号隔开的一系列值。这些值构成了列表中的元素。举例来说:
(1,2,3) #包含1、2、3这三个数字的列表
(1,2,3,) #相同的三个数字
(“fred”,4.5) #两个元素,“fred”和4.5
() #空列表:零个元素
(1..100) #100个整数构成的列表
范围操作符(..)该操作符会从左边的数字计数到右边,每次加1,以产生一连串的数字。举例来说:
(1..5) #(1,2,3,4,5)
(1.7..5.7) #两个数都会被去掉小数部分
(5..1) #空列表:..仅向上计数
(0,2..6,10,12) #与(0,2,3,4,5,6,10,12)相等
($m..$n) #范围由$m和$n当前的值来决定
qw简写
用qw建立简单的单词列表,不必键入许多索然无味的引号:
qw( fred barney betty wilma dino)
Perl会将其当成单引号内的字符串来处理,不能像双引号内的字符串一样使用\n或$fred。空白字符(如空格、制表符以及换行符)会被抛弃,然后剩下的就是列表的元素。
因为qw算是一种引号,所以不能将注释放在qw列表中。
qw还可以用任何标点符号作为定界符:
qw! fred barney betty wilma dino !
qw/ fred barney betty wilma dino /
qw# fred barney betty wilma dino #
qw( fred barney betty wilma dino )
qw{ fred barney betty wilma dino }
qw[ fred barney betty wilma dino ]
qw< fred barney betty wilma dino >
上面后4行定界符是成对的,如果用其他符号,起始和结尾的定界符则必须相同。
如需要在被圈引的字符串内使用定界符,那说明你可能是挑错了定界符。不过,可以通过反斜线转义引入这个字符。
列表的赋值
像标量值可被赋值给变量一样,列表值也可以赋值到变量:
($fred,$barney,$dino)=(“flintstone”,”rubble”,undef);
($fred,$barney)=($barney,$fred);//互换两者的值
如果变量的个数不等于给定的列表值的个数时,会发生什么情况呢?对列表进行赋值时,多出来的值会被悄悄忽略掉。另一种情况,如果变量的个数多过给定的列表值,那么那些多出来的变量将会被设成undef。
对数组赋值可在数组名之前加上@(at)字符就可以。
@rocks=qw/bedrock slate lava /;
@tiny=();
@giant=1..1e5;
@stuff=(@giant,undef,@giant);
$dino=”granite”;
@quarry=(@rocks,”crushed rock”,@tiny,$dino);
复制数组
@copy=@quarry;
pop和push操作符
pop操作符可用来取出数组中最后一个元素,同时返回该元素值;如果数组为空的,pop什么也不做,直接返回undef。
@array=5..9;
$fred=pop(@array);
$barney=pop @array;
pop @array;
push操作符,用于添加一个元素(或是一串元素)到数组的尾端:
push(@array,0)
push @array,8;
push @array, 1..10;
@others=qw /9 0 2 1 0/;
push @array, @others;
注意:push和pop操作的都是数组,对列表直接量进行压入和弹出操作是不可能的。
shift和unshift操作符
push和pop操作符处理的是数组的尾端;相似地,unshift和shift操作符则是对数组的“开关”进行相应的处理。
字符串中的数组内插
和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组的各个元素之间自动添加分隔用的空格。
内插数组中的某个元素时,会被替换成该元素的值。
索引表达式会被当成普通字符串表达式处理。
foreach控制结构
foreach能对整个数组或列表进行处理。
foreach $rock (qw/ bedrock slate lava /)
{#do something}
$rock是控制变量,控制变量并不是列表元素的复制品—实际上,它就是列表元素本身。也就是说,假如在循环中修改了控制变量的值,也就同时修改了这个列表元素。
Perl的老地方:$_
假如你在foreach循环的开头省略了控制变量,Perl就会使用它的“老地方”变量$_。这个变量除了名称比较特别之外,和其他标量变量(几乎)没什么差别为。
reverse操作符
reverse操作符会读取列表的值(可能来自数组),并按相反的次序返回该列表。
@fred = reverse @fred;
sort操作符
sort操作符会读取列表的值(可能来自数组),而且根据内部的字符编码的顺序,对它们进行排序。
@numbers=sort 97..102; #得100,101,102,97,98,99
标量上下文与列表上下文
概念:同一个表达式,出现在不同的地方会有不同的意义。
所谓上下文,指的是表达式所在的位置。在Perl解析表达式的时候,要么希望得到一个标量,要么希望得到一个列表。表达式所在的位置,Perl期望得到什么,那就是该表达式的上下文。
以数组的“名称”为例:在列表上下文中,它会产生元素的列表;但是在标量上下文中,则会返回数组中元素的个数。
在标量上下文中使用产生列表的表达式
在列表上下文中使用产生标量的表达式
清空数组的方法
@betty=();
强制指定标量上下文
可以使用伪函数scalar,强制引入标量上下文。
列表上下文中的
在列表上下文中,则会返回所有剩下的行,直到文件结尾为止。返回每一行都会成为列表中的某个元素。