2007年4月26日星期四

《Learning Perl》学习笔记 -- 第三章 列表和数组

本章讲述了列表和数组的概念、针对列表和数组的一些运算符和函数,并着重阐明了Perl中重要的“上下文”的概念。

1.列表和数组的概念

列表(list):是一个有序的标量集合;

数组(array):是一个包含列表的变量。

因此,简单地说,列表是数据,而数组是变量。

在Perl中不需要事先定义数组的大小,数组的大小总是可以根据需要自动扩展和收缩,没有被赋值或预定义的数组元素其值为undef。

1.1 访问数组及数组元素

对整个数组的访问很简单,在数组名前面加上@符号即表示整个数组,如@array。

使用索引访问数组元素,索引从0开始,逐渐递增,和C语言相同。

譬如数组名为array,则访问数组元素的方式为:$array[index]。

一个数组的最后一个元素的索引值为$#array(array为该数组名)。

Perl中还提供了一种从数组尾部访问数组元素的快捷方式:负的数组索引从数组的尾部算起。譬如,$array[-1]表示array数组的最后一个元素。

1.2 命名空间的概念

在Perl中,标量、数组和后面章节将要讲的散列的变量名是在不同的命名空间,你可以在同一个程序中定义一个名为Jerry的标量,名为Jerry的数组和名为Jerry的散列,而Perl不会讲它们搞混,因为它们本来就没在一个命名空间。要记住的是访问类型的变量,需要使用不同的前缀,可以认为前缀是命名空间的名字。以$开头的总是标量,以@开头的总是数组,以%开头的总是散列。

2.针对列表和数组的运算符和函数

2.1 ".."运算符

".."运算符表示一个区间,譬如1..5,表示从1到5的五个数字(1 2 3 4 5),一般用于列表或数组的赋值中。

2.2 qw快捷方式

qw表示“被括引的单词(quoted words)”,用于将一些字符序列赋值给列表或数组。

譬如要将fred, barney, betty,wilma和dino赋值给数组array,如果不用qw快捷方式,则需@array = ("fred", "barney", "betty", "wilma", "dino");这样需要键入大量的双引号。如果使用qw,则为@array = qw /fred barney betty wilma dino /;

注意qw快捷方式后面使用的分隔符是任意的,可以使用//,也可以使用!!或<>等,只要这两个匹配即可。

2.3 pop和push操作符

这两个操作符将数组当作堆栈来处理,pop用于从数组中弹出一个数据,push用于向数组中压入一个数据,针对的都是数组的尾部。

语法:$var = pop @array; push @array, $var;

2.4 shift和unshift操作符

这两个操作符的功能和pop与push类似,只是它们针对的是数组的头部进行操作。

语法:$var = shift @array; unshift @array, $var;

2.5 foreach控制结构

这个控制结构用于遍历整个数组,语法为:

foreach $var (@array) {};

要注意的是在遍历数组时,$var不是数组元素的拷贝,它就是数组元素本身,因此在{}中改变$var将改变array数组本身。但是,在遍历结束后,$var将恢复遍历数组前的值,即如果遍历数组前,$=10,则遍历完成后,$var仍然等于10。

2.6 reverse操作符

reverse操作符取一个列表的值(可以是来自一个数组),然后返回相反顺序的列表。记住reverse只是返回反序列表,它并不影响它的参数。因此,如果返回值不被赋给别的变量,它就毫无用处。

语法:@var = reverse @array;

2.7 sort操作符

sort操作符取一个列表的值(可以是来自一个数组),然后按照内部字符序进行排序。对ASCII字符串,就是按照ASCII字母表的顺序。sort和reverse相同,不影响它的参数,因此,你必须把你要的结果赋给别的变量。

3. 上下文的概念

上下文指的是一个表达式是在哪里出现的。它实际上就是一个简单的思想:一个给定的表达式在不同的地方,可能会有不同的含义。当Perl解析你的表达式时,它总是期望一个标量值或一个列表值或一个其它的值。Perl的期望就被称作表达式的上下文。对Perl中具体上下文的认识需要在实践中逐步领会。

譬如:

5 + something; # something必须是个标量

sort something; # something必须是个列表

一个有意思的现象是,当把一个数组赋值给一个标量时,这个标量获得这个数组的元素的个数,$var = @array;

有些时候需要强制使用标量上下文,这时可使用一个假函数scalar通知Perl,这里需要一个标量上下文。如scarlar @array;

在列表上下文中,从<STDIN>获得的数据存储在一个数组中,每行为一个数组元素。@lines = <STDIN>; #在列表上下文中读取标准输入

3.1 Perl的缺省变量$_

在任何需要使用标量变量的地方,都可以省略不写,而Perl会自动使用缺省变量$_表示这个变量。

譬如:

foreach (1..10) { #缺省使用$_

print "I can count to $_!n";

}

没有评论: