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

列表(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";

}

 

 

转载于:https://www.cnblogs.com/Hebe/p/3711697.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PerlIO::via::QuotedPrint是Perl语言中的一个模块,用于在文件读写时对数据进行Quoted-Printable编码和解码。Quoted-Printable是一种用于在ASCII字符集中表示非ASCII字符的编码方式,常用于电子邮件和网络传输中。PerlIO::via::QuotedPrint模块提供了一种方便的方式,可以在文件读写时对数据进行Quoted-Printable编码和解码。 PerlIO::via::QuotedPrint模块的使用方法与其他PerlIO模块类似。可以使用open函数打开一个文件句柄,并指定PerlIO::via::QuotedPrint模块作为过滤器,从而实现对文件数据的编码和解码。 下面是一个使用PerlIO::via::QuotedPrint模块对文件进行Quoted-Printable编码和解码的例子: ``` use PerlIO::via::QuotedPrint; # Quoted-Printable编码 open(my $fh, '>:via(QuotedPrint)', 'file.txt'); print $fh "这是一段中文文本\n"; close($fh); # Quoted-Printable解码 open(my $fh, '<:via(QuotedPrint)', 'file.txt'); while(my $line = <$fh>) { print $line; } close($fh); ``` 在上面的例子中,我们使用了PerlIO::via::QuotedPrint模块对一个文件进行了编码和解码。在第一个open函数中,我们使用了':via(QuotedPrint)'指定了PerlIO::via::QuotedPrint模块作为过滤器,从而将写入文件的数据进行了Quoted-Printable编码。在第二个open函数中,我们同样使用了':via(QuotedPrint)'指定了PerlIO::via::QuotedPrint模块作为过滤器,从而将读取的数据进行了Quoted-Printable解码。 使用PerlIO::via::QuotedPrint模块可以方便地对文件数据进行Quoted-Printable编码和解码,从而满足不同应用场景中对数据编码的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值