perl的列表与数组(转)

来源:互联网 发布:excel数据标签 编辑:程序博客网 时间:2024/06/03 00:16

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,4,5,6),且左边第一个元素最小,右边最后一个元素最大
②下面是最常用的使用范围运算符来表示列表
(1, 2, 3, 4, 5, 6)  -->  (1..6)元素从左边的值增加到右边的值
(1, 2, 3, 4, 5, 6)  --> (1,2..5,6)部分使用范围
(3..3) --> (3)首尾一样,也就是说没有增加,所以表示的是一个元素的列表
(2.4..5.3)  --> (2,3,4,5)小数同样也增1,不过是取整数部分
(4.5..1.6) --> () 左边值>右边值则为空(范围运算符表示的是:右边>左边,且增1)
("aa".."ad") --> ("aa","ab","ac","ad")同样可用于字符串增加,规则同字符串自增,例如:$month=('01'..'31')
($a,$a+3)  --> 设$a=3则为(3,4,5,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 = $fred\n";
print "\$barney = $barney\n";
print "\$dino = $dino\n";
返回的结果为:
$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_name\n";
print "CHANGE-before:\$last_name = $last_name\n";

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

print "CHANGE-after:\$first_name = $first_name\n";
print "CHANGE-after:\$last_name = $last_name\n";
返回的结果为:
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,2,3),与$a是不同的变量
注意:数组的初始值为空()

2)   元素形式
例如:$a[0]
注意如下几点
(1)数组的元素为简单变量,以$开头。后面的变量名同数组名
(2)下标从0开始。[ ]有时也称运算符
(3)负索引:最后一个元素可以用$a[-1]表示,倒数第二个为$a[-2]
(4)列表也可以有下标:(1,2,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,2,3,4的数组
(1)@a=(1,2,3,4);  #标准的列表赋值
(2)@b=(1,2,3,4),@a=@b;  #数组复制
(3)@b=(2,3),@a=(1,@b,4);  #数组引用(@a=(1,2,3,4))
(4)@b=(‘a’)  x  4;  $b=(‘a’, ‘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", @city, "lava" );  #数组rocks的元素为:"bedrock",undef,"lava"
@rocks = ("bedrock", undef, "lava");#数组rocks的元素为:"bedrock",undef,"lava"(显示声明undef)

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

3)数组元素读取
例如:@a=(1..3),即:@a为含元素1,2,3的数组
(1)单个数组元素读取:$a=$a[1];
(2)多个数组元素读取
每个元素对应到变量:@a=(1,2,3);  ($x,$y,$z)=@a;  $x=1,$y=2,$z=3;
多余的变量为空: ($a,$b,$c,$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,2,3,4的数组
$a=@a;  变量$a值为数组长度
($a)=@a; 列表元素a的值为数组的第一个元素值
$a=(1,2,3),返回最右的元素,即:$a=3
$#a数组最后一个元素的索引。加1即为长度。但对$#a赋值就改变了数组的长度

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

5)数组片断

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

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

(3)数组元素重叠
例如:@a=(1,2,3,4,5)
交换:@a[1,2]=@a[2,1]  ====> @a=(1,3,2,4,5)
重叠:@a[1,2,3]=@a[3,2,4]  ====> @a=(1,4,3,5,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 "@a\n";
返回结果为:are you ,

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

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

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

(8)join函数
语法:join(‘连接符’, @a)
作用:把数组连接成一个字符串
#!/usr/bin/perl
@a=(1..5);
$b=join(':',@a);
print "$b\n";
返回结果: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,0,@n),它表示在数组@a的最后一个元素之前追加@n数组中的所有元素;
例如:splice(@a,0,0,@n),它表示在数组@a的第一个元素之前追加@n数组中的所有元素;
例如:splice(@a,$#a+1,0,@n),它表示在数组@a的最后一个元素之后($#a+1)追加@n数组中的所有元素;

第二种情况:当@newlist为空则为删除
例如:splice(@a,2,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,2,3],['a','b','c']];
注意:二维数组用“$”标识符,其二是右端用”[]“符号

2、二维数组的操作
1)内含两个子数组(1,2,3),('a','b','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、二维数组简介


 

 

五、例子

0 0
原创粉丝点击