Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2080534
  • 博文数量: 354
  • 博客积分: 4955
  • 博客等级: 上校
  • 技术积分: 4579
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-21 11:46
文章分类

全部博文(354)

文章存档

2015年(1)

2013年(4)

2012年(86)

2011年(115)

2010年(67)

2009年(81)

我的朋友

分类:

2011-02-24 10:19:39

一、列表及其形式

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用法同qqq
第二点:qw中的元素,可以为值、变量、不用引号的字符串、undef值,元素之间用空格分开
第三点:()可替换成其他符号<>等,但是()或者<>中的元素都当成普通字符(即:如果是变量也不进行解析)

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

2
)列表的种类
1)空列表,例如:()
2)单元素列表,例如:(2),注意:它与数值2是不一样的
3)多元素列表,例如:(23”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)数组操作函数

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

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

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


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


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

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

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

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

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

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


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

11splice函数
语法: splice(@askiplength@newlist)
解析如下:
@a数组进行操作,跳过skip个元素,然后开始用@newlist替换length个元素。@newlistlength可以不等长,无论@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
、列表:

 (123)(1..3)qw()(a) x 4

2、数组

@a=(123)$a[0]

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

数组元素逐一读到变量中

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

3、数组函数

sortreversechopchompshiftunshiftpushpopwantarrayjoinsplitsplicegrepmap

4、二维数组简介


 

 

五、例子

阅读(1530) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~