• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Perl学习笔记(三)--列表与数组

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

列表(list)指的是标量的有序集合,而数组(array)则是存储列表的变量。

访问数组中的元素

数组元素是以连续的整数来编号,从0开始,之后的每一个元素依次加1,如:

$fred[0]="yabba";

$fred[1]="dabba";

$fred[2]="doo";

 当然,任何求值能得到数字的表达式都可以用作下标,如果不是整数,会自动舍去小数,无论正负:                 

print $fred[2.71828-1];     #等同于print $fred[1]

 假如下标超出数组尾端,对应的值是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[dino fred barney];
$m = shift(@array);      #$m变成dino,@array现在是(”fred”,”barney”)

 与pop类似,对于一个空的数组变量,shift会返回undef

 

字符串中的数组内插

和标量一样,数组的内容同样可以被内插到双引号串中。内插时,会在数组各个元素之间自动添加空格,但首尾不会增添额外空格,如

print "quartz @rocks limestone\n";

  为了避免@歧义,可以使用转义字符或用单引号字符串
 也可以内插数组的某个元素

 $x="this is $fred[1]'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";

}

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
2章 perl标量变量发布时间:2022-07-22
下一篇:
Perl语法-基础发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap