列表和数组的差别很小,精确的说,列表是数据,数组是变量。 Perl哲学:“去除掉不必要的限制”;“办法不止一种(There is more than one way to do it!)”。
数组的名字空间
数组的名字空间和标量的名字空间是相互独立的,程序里可以同时有\$fred[0],\$fred,Perl知道他们是不同类型的两个变量。
特殊的数组索引
数组越界访问的结果是得到一个undef的值。 \$#array表示最后一个元素的索引值,它等于数组长度减一。与之等效的一种写法是使用负数索引值:\$array[-1].
范围操作符
(1..10) 1到10,包括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 !