加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl的列表与数组(转)

发布时间:2020-12-15 23:59:51 所属栏目:大数据 来源:网络整理
导读:5章:perl的列表与数组(转) 申明:转自播布客论坛 一、列表及其形式 1、列表(它是数组的表现形式) ===(列表:指的是数据) 1)列表的形式 (1)第一种 例如:(1,"a",2.3,$a,$x+1) 注意:列表中的元素可以是:任意类型、变量、表达式、undef值 例如

5章:perl的列表与数组(转)

申明:转自播布客论坛

一、列表及其形式

1、列表(它是数组的表现形式)===>(列表:指的是数据)

1)列表的形式

(1)第一种
例如:(1,"a",2.3,$a,$x+1)
注意:列表中的元素可以是:任意类型、变量、表达式、undef值
例如:my $d=(1,$b,$c,2);? #变量$d的值为:2(即:返回最右边的值)

(2)第二种
例如:qw(1 $a str)
注意以下几点:
第一点:qw用法同q、qq
第二点:qw中的元素,可以为值、变量、不用引号的字符串、undef值,元素之间用空格分开
第三点:()可替换成其他符号<>等,但是()或者<>中的元素都当成普通字符(即:如果是变量也不进行解析)

例如:my $a=12;my $b=qw(1 $a);? #变量$b的值为:$a,而不是12(即:$a不进行解析了)

2)列表的种类
(1)空列表,例如:()
(2)单元素列表,例如:(2),注意:它与数值2是不一样的
(3)多元素列表,例如:(2,3,”abc”)
在多元素列表当中,我们还可以使用范围来表示一个列表,例如:(3..5)<=> (3,4,5)
①"..": 范围运算符。每次增1(例如:(1..6),表示(1,2,3,5,6),且左边第一个元素最小,右边最后一个元素最大
②下面是最常用的使用范围运算符来表示列表
(1,6)? -->? (1..6)元素从左边的值增加到右边的值
(1,6)? --> (1,2..5,6)部分使用范围
(3..3) --> (3)首尾一样,也就是说没有增加,所以表示的是一个元素的列表
(2.4..5.3)? --> (2,5)小数同样也增1,不过是取整数部分
(4.5..1.6) --> () 左边值>右边值则为空(范围运算符表示的是:右边>左边,且增1)
("aa".."ad") --> ("aa","ab","ac","ad")同样可用于字符串增加,规则同字符串自增,例如:$month=('01'..'31')
($a,$a+3)? --> 设$a=3则为(3,6)同样可用于变量表达式

3)列表参与运算
(1)列表运算:作为逗号运算,返回是最右的元素,例如:$a=(1,2),则$a=2;但是如果使用的是范围运算符的方式表示列表,且没有出现逗号运算符,那么将得到空
(2)列表也可以有下标的,它的下标是从0开始的

例如:下面这个例子
#! /usr/bin/perl
use strict;
use warnings;
my $fred;
my $barney;
my $dino;
($fred,$barney,$dino) = ("flintstone","rubble",undef);
print "$fred = $fredn";
print "$barney = $barneyn";
print "$dino = $dinon";
返回的结果为:
$fred = flintstone
$barney = rubble
$dino =
说明:上述的列表操作,相当于三次独立的赋值操作

例如:互换两个变量的值
#! /usr/bin/perl
use strict;
use warnings;
my $first_name = "Brian";
my $last_name = "Ruan";
print "CHANGE-before:$first_name = $first_namen";
print "CHANGE-before:$last_name = $last_namen";

($first_name,$last_name) = ($last_name,$first_name);

print "CHANGE-after:$first_name = $first_namen";
print "CHANGE-after:$last_name = $last_namen";
返回的结果为:
CHANGE-before:$first_name = Brian
CHANGE-before:$last_name = Ruan
CHANGE-after:$first_name = Ruan
CHANGE-after:$last_name = Brian

例如:当左边列表中的变量数目 < 右边列表中的值数目,那么右边列表中多余的值将被抛弃
(my $first_name,my $last_name) = qw(ruan xi Brian);
返回的结果为:$first_name="ruanxi",$last_name="xi"

例如:当左边列表中的变量数目 > 右边列表中的值数目,那么左边列表中剩余的变量将被赋予undef值
(my $first_name,$middle_name,my $last_name) = qw(ruan xi);
返回的结果为:$first_name = ”ruan“,$middle_name = "xi",$last_name =

二、 数组(它是列表的存储) ===>(数组:指的是变量)

1、?? 形式

1)?? 数组形式
例如:@a=(1,3),与$a是不同的变量
注意:数组的初始值为空()

2)?? 元素形式
例如:$a[0]
注意如下几点
(1)数组的元素为简单变量,以$开头。后面的变量名同数组名
(2)下标从0开始。[ ]有时也称运算符
(3)负索引:最后一个元素可以用$a[-1]表示,倒数第二个为$a[-2]
(4)列表也可以有下标:(1,3)[0] ===> 1,但是列表没有存储,不能在下次使用
(5)在字符串中“$a[0]”为元素,“$a[0]”、”${a}[0]”、”${a}[0]”均为字符串$a[0]
(6)$#a,表示数组@a中最后一个元素的索引,$#a=数组的长度-1,同时要注意$#a变量是可以修改的,如果修改了$#a变量,那么数组中的元素个数也发生变化

例如:下列这个例子
#! /usr/bin/perl
use strict;
use warnings;
my $number=2.71828;
my @food;
for (my $i=0;$i<5;$i++) {
$food[$i]=$i;
}
print "$food[$number+1]n";
说明:任何求值能得到数字的表达式都可以用作下标

2、赋值

1)数组赋值形式
例如:@a=(1..4),即:@a为含元素1,4的数组
(1)@a=(1,4); ?#标准的列表赋值
(2)@b=(1,4),@a=@b; ?#数组复制
(3)@b=(2,3),@a=(1,@b,4); ?#数组引用(@a=(1,4))
(4)@b=(‘a’) ?x ?4;? $b=(‘a’,‘a’,‘a’);
(5)@b=<>;? #从标准输入(键盘)读出一行赋与元素,最后用ctrl-d结束输入
(6) @rocks = qw( bedrock $name lava ); #返回的结果为:rocks[0]="bedrock",rocks[1]='$name'(注意:不是变量$name的值),rocks[2]="lava"
(7)下列几种:
@city = (); @rocks = ( "bedrock",@city,"lava" );? #数组rocks的元素为:"bedrock","lava“,空列表被去除(隐示声名undef)
@city = (undef); @rocks = ( "bedrock","lava" );? #数组rocks的元素为:"bedrock",undef,"lava"
@rocks = ("bedrock",undef,"lava");#数组rocks的元素为:"bedrock",undef,"lava"(显示声明undef)

2)数组元素值改变
例如:@a=(1..4),即:@a为含元素1,4的数组
(1)改变数组元素的值:$a[1]=3; @a=(1,4);
(2)超出数组大小的元素:$a[5]=6; @a=(1,“”,6); 那么数组自动增长,原来没有的元素值为NULL
(3)读不存在的数组元素,将得到空值:$x=$a[7];

3)数组元素读取
例如:@a=(1..3),即:@a为含元素1,3的数组
(1)单个数组元素读取:$a=$a[1];
(2)多个数组元素读取
每个元素对应到变量:@a=(1,3); ?($x,$y,$z)=@a; ?$x=1,$y=2,$z=3;
多余的变量为空: ($a,$d)=@a; ?$a=1,$b=2,$c=3,$d=“”(由于给了abcd4个变量,但是数组a只有3个元素,所以最后一个变量d,只能得到空值)
变量不足,后续元素忽略:($a,$b)=@a; $a=1,$b=2; (由于只给ab2个变量,所以$a[2]开始往后的值被忽略)
(3)数组读取
例如:@a=(1..4),即:@a为含元素1,4的数组
$a=@a; ?变量$a值为数组长度
($a)=@a; 列表元素a的值为数组的第一个元素值
$a=(1,3),返回最右的元素,即:$a=3
$#a数组最后一个元素的索引。加1即为长度。但对$#a赋值就改变了数组的长度

4)数组的输出
print @a; 输出的数组元素的值是相连
print “@a”; 输出的数组元素的值之间加空格
print “@an”; 输出的数组的所有元素值后,再进行换行

5)数组片断

(1)访问数组的部分元素:不是单元素,也不是全部
例如:@a=(1,5)
数组片断读出:@sub=@a[0,1,3]? ===> @sub=(1,4)
数组片断赋值:@a[1,3]=(“a”,”b”)? ===> @a=(1,”a”,”b”,5)??

(2)数组的元素列表可用列表的各种形式表示
例如:@a=(1,5)
范围:@sub=@a[1..3] ===> @sub=(2,4)
$x=1,$y=3; ?@sub=@a[$x..$y]; ?===> @sub=(2,4)
列表:@b=(1,3); ?@sub=@a[@b]; ?===>? @sub=(2,4)
@b=(2,3); ?@sub=@a[1,@b]; ?@sub=(2,4)
($a,$c)=(1,5) ?===>? @b=(2,5),$c=''


(3)数组元素重叠
例如:@a=(1,5)
交换:@a[1,2]=@a[2,1]? ====> @a=(1,5)
重叠:@a[1,3]=@a[3,4]? ====> @a=(1,5)


6)数组操作函数

(1)sort函数
语法:sort ?{代码块}或函数名 (@array)
作用:对数组元素进行排序(缺省按字母排序,可省略代码块)


注意:@a代表数组,$a与$b代表数组元素

(2)reverse函数
语法:reverse (@array)
作用:对数组元素进行反序排列


(3)chop函数
语法:chop(@array)
作用:对数组中的每个元素截去最后一个字符


(4)shift函数
语法:shift(@array)
作用:删除数组的第一个元素,返回删除的元素。缺省对@ARGV数组
#!/usr/bin/perl
@a=("how","are","you",",");
shift(@a);
print "@an";
返回结果为:are you,

(5)unshift函数
语法:unshift (@array,$a)
作用:在数组开头增加元素,返回新数组长度
#!/usr/bin/perl
@a=("how",");
unshift(@a,"Say:");
print "@an";
返回结果为:Say: how are you,

(6)push函数
语法:push(@array,$a)
作用:在数组的末尾增加元素
#!/usr/bin/perl
@a=("how",");
push(@a,"today?");
print "@an";
返回结果:how are you,today?

(7)pop函数
语法:pop(@array)
作用:在数组末尾删除元素
#!/usr/bin/perl
@a=("how",");
pop(@a);
print "@an";
返回结果:how are you

(8)join函数
语法:join(‘连接符’,@a)
作用:把数组连接成一个字符串
#!/usr/bin/perl
@a=(1..5);
$b=join(':',@a);
print "$bn";
返回结果:1:2:3:4:5

(9)split函数
语法:split(/模式/,分割串,长度)
作用:对数组的元素进行分隔
注意:以下参数
第一个:模式,它缺省为空格,可省略
第二个:分割串,它缺省为$_,可省略
第三个:长度,它可省略,全部分割
例如:$s="a,b,c";? @a=split(/,/,$s);? ===> @a=('a','b','c');
例如:@a=split(/,$s,2);? ===> @a=('a','b,c');

(10)wantarray函数
语法:wantarray()
作用:当期望返回数组时为真,返回简单变量时为假
例如:@a=mysub;$a=mysub;

(11)splice函数
语法: splice(@a,skip,length,@newlist)
解析如下:
对@a数组进行操作,跳过skip个元素,然后开始用@newlist替换length个元素。@newlist和length可以不等长,无论@newlist多长,它只占用(替换)length长的元素位置(即:如果此时@newlist的长度小于length时,那么只替换掉length中的部分元素;如果此时@newlist的长度等于length,那么将替换掉length中的所有元素;如果此时@newlist的长度大于length,那么将所有@newlist中的中元素也只能占length所规定的长度

第一种情况:当length=0时为插入
例如:splice(@a,-1,@n),它表示在数组@a的最后一个元素之前追加@n数组中的所有元素;
例如:splice(@a,@n),它表示在数组@a的第一个元素之前追加@n数组中的所有元素;
例如:splice(@a,$#a+1,@n),它表示在数组@a的最后一个元素之后($#a+1)追加@n数组中的所有元素;

第二种情况:当@newlist为空则为删除
例如:splice(@a,3),它表示跳过数组@a的前2个元素,然后将剩下数组元素中的前3个元素删除,如果此时还有剩下数组元素,则不进行删除(具体请仔细查看下图中的例子)

第三种情况:当length和@newlist同时省略时
例如:splice(@a,3),它表示跳过数组@a的前3个元素,然后将剩余的所有元素删除

(12)grep函数
语法: @result=grep(/pattern/,@search)
作用: 对@search的每一个元素搜索匹配模式
例如: @found=grep(/pattern/,@search), 对@search的每一个元素搜索匹配模式,匹配的元素返回到@found数组中


(13)map函数
语法: @result=map(expr,@list)
作用: 对@list每个元素进行expr运算,返回运算后的结果并存放数组result中。元素用$_代表
例如: map($_+1,(1,2)) ===> (2,3)



三、 二维数组

?1、二维数组定义
$aoa=[[1,3],['a','c']];
注意:二维数组用“$”标识符,其二是右端用”[]“符号

2、二维数组的操作
1)内含两个子数组(1,3),('a','c')。
2)引用子数组:@{$aoa->[0]}(注意:因为子数组是一维的,所以用”@”标识)
3)引用子数组元素列表:@{$aoa->[0]}[0,1]
4)引用子数组中的元素:$aoa->[0][0] 或者 ${$aoa->[0]}[2]

?

四、总结


1、列表:

 (1,2,3),(1..3),qw(),(‘a’) x 4

2、数组

@a=(1,2,3),$a[0]

数组间赋值,元素自动增加

数组元素逐一读到变量中

@a在简单变量上下文中为长度,$#为最后元素的索引
数组的片断也是数组,表示为@a[1,2]。可以逐一赋值

3、数组函数

sort,reverse,chop,chomp,shift,unshift,push,pop,wantarray,join,split,splice,grep,map

4、二维数组简介


?

?

五、例子

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读