Perl列表与数组

列表和数组的差别很小,精确的说,列表是数据,数组是变量。 Perl哲学:“去除掉不必要的限制”;“办法不止一种(There is more than one way to do it!)”。

数组的名字空间

数组的名字空间和标量的名字空间是相互独立的,程序里可以同时有\$fred[0],\$fred,Perl知道他们是不同类型的两个变量。

特殊的数组索引

数组越界访问的结果是得到一个undef的值。 \$#array表示最后一个元素的索引值,它等于数组长度减一。与之等效的一种写法是使用负数索引值:\$array[-1].

范围操作符

(1..10) 110,包括10的列表。
(10..1) 空列表,只能向上计数。

qw简写

qw表示"quoted word"。空白符会被抛弃,剩下的就是列表元素。 qw( fred barney betty);

列表变量的赋值

($fred,$barney,$dino) = qw(fred barney);
($fred,$barney) = qw(fred barney dino);
@rocks = qw/    bedrock slate   lava/;
@tiny = ();
@quarry = (@rocks,"crushed rock",@tiny);
@quarry => ("bedrock","slate","lava","crushed rock");

如果变量的个数多于给定的列表值的个数,多余的变量设为undef;反之,多余的列表值会被忽略掉。 如果数组里面包含数组,则数组名会被展开成它所拥有的元素列表,如果数组是空数组,那么它不会对数组贡献任何元素,这里跟undef不一样,也不是一个()元素,这点与python不同。

pop & push

我们常常把数组当成stack来用,利用pop和push来操作数组列表最右侧的元素。

@array = 5..9;
$fred = pop @array;
push @array,10;
push @array,1..10;
push @array,@others;

注意pop和push的第一个参数都必须是要操作的数组变量,对列表直接量进行pop和push是没有意义的。

shift &unshift

与pop & push相对应,shift和unshift是对数组开头元素进行操作的函数。

splice

如果希望添加或者移除数组中间的某些元素,使用splice,4个参数,第一是待操作数组,第二个是起始位置,第三个是要操作的元素个数,第四个要替换的列表,列表长度跟删除的数组元素个数可以不同,后两个参数是可选的。

@array = qw /pebbels dino fred barney betty/;
@removed = splice @array,1,2,qw(xuechao tangbo);
@removed =>( pebbels,xuechao,tangbo,barney,betty);

注意到,如果把第三个参数设为0,就可以实现其他语言里面的add(index,element)类似的功能了。

字符串中的数组内插

数组内容可以被内插到双引号中,数组元素之间自动用空格隔开。如果是想打印@符号,则需要用转义字符,否则可能造成歧义,或者使用单引号内插。

@fred = qw (eating rocks is wrong);
$fred = "right";
"$fred[3]";     =>"wrong"
"${fred}[]";    =>"right"

如果需要在标量后面使用方括号,为了避免perl误解为数组变量,应该将方括号隔开。

perl最喜欢的默认变量:$_

在许多情况下,当未告知perl使用哪个变量或数值时,perl都会自动使用$_.让我们免于命名的痛苦。

reverse & sort

reverse倒转数组,但不会改变原数组,而只会返回原数组的倒转数组,sort也有类似的性质。 sort默认按照字符串来排序,有时候可能产生不符合预期的结果,例如:

@numbers = sort 97..102; =>100,101,102,97,98,99

each操作符

每次对数组调用each,会返回数组中下一个元素所对应的两个值----索引和元素值。

my @array = qw /pebbels dino fred barney betty/;
while( my ($index,$value) = each @array){
    do something;
}

标量上下文和列表上下文

在perl里面,上下文是一个及其重要的东西,在没有上下文的情况下,没有办法确定变量的准确含义。一般根据操作符,或者要进行的函数来决定。 例如,数组变量:

@people = qw(fred barney betty);
@sorted = sort @people; 数组。
$number = 42 + @people; 数组元素个数。

列表上下文中的: 在标量上下文中会返回输入数据的下一行,在列表上下文中,则会返回所有剩下的行,直到文件结尾位置,返回的每一行都会成为列表中的元素。

chomp(@lines = <STDIN>);

Comments !