文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>《Perl 语言入门》学习笔记(第三章)

《Perl 语言入门》学习笔记(第三章)

时间:2010-07-15  来源:华南理工大学

第三章 列表与数组

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

列表上下文中的<STDIN>

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

相关阅读 更多 +
排行榜 更多 +
我要当超人

我要当超人

休闲益智 下载
欢乐跳一跳

欢乐跳一跳

休闲益智 下载
小鱼快跑手机版

小鱼快跑手机版

休闲益智 下载