本章讲述了列表和数组的概念、针对列表和数组的一些运算符和函数,并着重阐明了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";
}
没有评论:
发表评论