Perl学习笔记(三)--列表与数组
列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。访问数组中的元素:
数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1,如:
$fred="yabba";
$fred="dabba";
$fred="doo";
当然,任何求值能得到数字的表达式都可以用作下标,如果不是整数,会自动舍去小数,无论正负:
print $fred; #等同于print $fred
假如下标超出数组尾端,对应的值是undef
特殊的数组索引值:
数组rocks的最后一个元素的索引值是$#rocks,如$rocks[$#rocks];
负数表示倒数,因此$rocks[-1]等同于$rocks[$#rocks]
列表直接量:
列表直接量(list literal,也就是在程序代码中表示一列数据的写法),可以由圆括号内用逗号隔开的一串数据表示,而这些数据就称为列表元素,如
(1,2,3)
("fred",4.5)
(1..5) #范围操作符..,从左边的数字计数到右边,每次加1,等同于(1,2,3,4,5),只能从小到大累加
($m..$n) #数组中的元素可以是表达式
qw简写:
perl会将其当成单引号内的字符串来处理,其中的空白字符会被抛弃,剩下的是列表元素,如
qw(fred barney betty whilma)
perl允许用任何标点符号作为定界符,如下
qw! fred barney betty whilma !
qw/ fred barney betty whilma /
qw# fred barney betty whilma #
列表的赋值:
如
($fred,$barney,$dino)=("flintstone","rubble",undef);
互换变量的值
($fred,$barney)=($barney,$fred); #交换着两个变量的值
数组的简写:在数组名之前加上@
构建一个字符串数组:
@rocks=qw/ bedrock slate lava/;
@copy=@quarry;#将一个数组中的列表复制到另一个数组
pop和push操作符:
pop操作符可以用来取出数组中最后一个元素,同时返回该元素值。如果数组是空的,直接返回undef。
@array=5..9;
$fred =pop(@array); #$fred变成9,@array现在是(5,6,7,8)
$fred=pop @array; #也可以不加括号这样写,@array现在是(5,6,7)
pop @array; #@array现在是(5,6),7被抛弃了
push操作符用于添加一个元素(或是一串元素)到数组的尾端
push(@array,0); #@array现在是(5,6,0)
push @array,8; #@array现在是(5,6,0,8)
push @array,1..10; #@array得到了10个新元素
注意:push的第一个参数或者pop的唯一参数都必须是要操作的数组变量—对列表直接进行push或者pop操作是没有意义的。
shift和unshift操作符:
与pop和push类似,不过是针对数组开头的元素
@array = qw;
$m = shift(@array); #$m变成dino,@array现在是(”fred”,”barney”)
与pop类似,对于一个空的数组变量,shift会返回undef
字符串中的数组内插:
和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组各个元素之间自动添加空格,但首尾不会增添额外空格,如
print "quartz @rocks limestone\n";
为了避免@歧义,可以使用转义字符或用单引号字符串
也可以内插数组的某个元素
$x="this is $fred's place";
foreach控制结构:
能逐项遍历列表中的值,依次迭代
foreach $rock (qw/bedrock slate lava/){
print "One rock is $rock.\n";
}
Perl最喜欢用的默认变量:$_
假如在foreach循环的开头省略控制变量,perl就会用默认变量$_
foreach (1..10){
print "I can count to $_!\n";
}
在许多情况下,当未告知perl使用哪个变量或数值时,perl就会自动使用$_
foreach (1..10){
print ;#直接打印12345678910
}
reverse操作符:
读取列表的值,并按相反的次序返回该列表
@fred = 6..10;
@barney = reverse(@fred) #10,9,8,7,6
@fred = reverse @fred;
sort操作符:
读取列表的值,并根据内部的字符编码顺序进行排序(注意对数字排序可能出错,因为当字符串处理了),如
@rocks= sort @rocks;
标量上下文与列表上下文:
在perl解析表达式的时候,要么希望得到一个标量,要么希望得到一个列表
表达式所在的位置,perl期望得到什么,那就是该表达式的上下文
在标量上下文中使用产生列表的表达式:
@back= reverse qw/yabba dabba doo/;#会变成doo,dabba,yabba
$back= reverse qw/yabba dabba doo/;#会变成oodabbadabbay
在列表上下文中使用产生标量的表达式:
很简单,如果表达式求值结果为标量值,自动产生一个仅含此标量值的列表
清空列表可以使用@betty=();注意不是undef
强制指定标量上下文:
使用伪函数scalar,如
print "I have ", scalar @rocks,"rocks!\n"; # 此时@rocks返回数组个数
列表上下文中的<STDIN>:
返回所有剩下的行,直到文件结尾,返回的每一行都会成为列表中的某个元素
@lines=<STDIN>;
此时也可用chomp去掉每一行的换行符chomp(@lines);
更常见的是
chomp(@lines=<STDIN>);
练习:
1. 写一个程序,读入一些字符串(每行一个),直到文件结尾为止。然后,再以相反顺序输入这个列表。假如输入来自键盘,你需要在Unix系统上键入Ctrl+D或在Windows系统上键入Ctrl+Z然后回车来表示输入的结束。
print reverse <STDIN>;
2.写一个程序,读入一些数字(每行一个),直到文件结尾为止。然后,根据每一个数字输出如下名单中相应的人名。比方说,如果输入的数字是1,、2、4和2.那么输出的人名将会是fred、betty、dino和betty
my @name =(fred,betty,san,dino,ddee,erwre,werew);
chomp(@array = <STDIN>);
foreach(@array){
my $num=$_;
my $n=$num-1;
print "$name[$n]\n";
}
页:
[1]