Chinaunix首页 | 论坛 | 博客
  • 博客访问: 350534
  • 博文数量: 122
  • 博客积分: 5000
  • 博客等级: 大校
  • 技术积分: 1191
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-24 11:12
文章分类

全部博文(122)

文章存档

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)           #包含123这三个数字的列表

(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;

poppush操作符

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;

注意:pushpop操作的都是数组,对列表直接量进行压入和弹出操作是不可能的。

shiftunshift操作符

pushpop操作符处理的是数组的尾端;相似地,unshiftshift操作符则是对数组的“开关”进行相应的处理。

字符串中的数组内插

和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组的各个元素之间自动添加分隔用的空格。

内插数组中的某个元素时,会被替换成该元素的值。

索引表达式会被当成普通字符串表达式处理。

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,强制引入标量上下文。

列表上下文中的

       在列表上下文中,则会返回所有剩下的行,直到文件结尾为止。返回每一行都会成为列表中的某个元素。

阅读(1150) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~