博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

数组和列表

Posted on 2011-02-01 19:37  bw_0927  阅读(530)  评论(0)    收藏  举报
  • 列表----数组的形式

(1, "a", 2.3, $a, $x+1)  元素可以是任意类型,变量,表达式

空列表:  ()

 单元素列表: (2) .与值2不同。

qw(1 $a str)     qw用法同q,qq类似。()可替换成其他符号<>。元素可以为值,变量,不同引号的字符串,元素之间由空格分开。

作为逗号运算返回最后边的元素。 $a=(1,2) ----->$a=2;

  • 范围运算符 ..

每次增1,元素从左边的值增加到右边的值,可部分使用范围,小数同样也增1,到小于右边的小数,同样可用于字符串增加,

(1..6)----->(1,2,3,4,5,6)

(1,2..5,6)----->(1,2,3,4,5,6)

(2.4..5.3)---->(2.4, 3.4, 4.4)

("aa".."ad")----->("aa”, "ab",  "ac",  ”ad"); 

$month=('01'..'31');

($a, $a+3)---->若$a=3,则为(3,4,5,6)同样可用于变量表达式。

  • 数组------列表的存储   @a=(1,2,3)

数组的元素为简单变量,以$开头,元素形式:$a[0]

负索引:最后一个元素可以用$a[-1]表示,倒数第二个为$a[-2].

列表也可以有下标:(1,2,3)[0]------>1,但是列表没有存储,不能在下次使用。

在字符串中"$a[0]"为元素,"$a\[0]"  "$a{a}[0]"   "$\{a}[0]"均为字符串$a[0],不是数组的元素。

数组的赋值

1: @a=(1,2,3,4);

2:   @b=(1,2,3,4),   @a=@b;

3:   @b=(2,3), @a=(1, @b, 4);

4:   @b=('a') x 4;  ------->@b=('a', 'a', 'a', 'a');

5:   @b=<>; 从标准输入读出一行赋于元素,最后用ctrl-d结束输入。

改变元素的值:$a[1]=3;

超出数组大小的元素:$a[5]=6; @a=(1,2,3,4,"",6),数组自动增长,原来没有的元素值为NULL。

多元素读取:

每个元素对应到变量:@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="";

变量不足,后续元素忽略:($a,$b)=@a;------->$a=1;$b=2;

 数组读取:

 @a=(1,2,3);

$a=@a;  $a返回的是数组的长度。  ($a)=@a; 为读取第一个元素。

$a=(1,2,3); 列表赋给简单变量返回的是最右边的元素, $a=3;

可读可写变量$#a存储的是数组a的最后一个元素的索引,返回值是字符串类型。加1即为数组的长度。但对$#a赋值就改变了数组a的长度。

数组的输出:

print @a; 元素相连。    print "@a"; 元素之间以空格分开。

 数组片段:

@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)

范围:@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)----->$a=1, @b=(2,3,4,5),$c=""

数组元素重叠:

交换: @a[1,2]=@a[2,1]--------->@a=(2,1,3,4,5)

重叠: @a[1,2,3]=@a[3,2,4]-------->@a=(1,4,3,5,5)

 

数组操作函数:

sort {代码块}或函数名 (@array) ,缺省按字母排序,可省略代码块;若数组内容为数字,要按不同的排序方式排序,则需要用上"{代码块}或函数名",内置变量$a,$b代表数组的元素,会屏蔽先前的自定义变量,@_代表数组。

reverse @a  ,数组反序

chop @a  每个元素都截去最后一个字符

shift(@a) 删除数组第一个元素,返回删除的元素。若不写@a,缺省对@ARGV数组

unshift(@a,$a):在数组开头添加元素,返回新数组的长度

push(@a, $a):在数组末尾添加元素

pop(@a):在数组末尾删除元素。

join('连接符',数组或列表)     把数组或列表的元素用'连接符'连接成一个字符串

@a=('a','b'); join(',', @a)='a,b';    //连接数组元素

join(',', 'a','b')='a,b';       //连接列表元素

split(/模式/,待分割字符串,长度)

模式:缺省为空格,可省略

分割串:缺省为$_,可省略、

长度:要分割成多少段,可省略代表全部分割

$s="a,b,c";           @a=split(/,/,$s);------>@a=('a','b','c');

                           @a=split(/,/,$s,2);------->@a=('a','b,c');

在Perl中,来自子程序的返回值既可是一个标量,也可以是一个列表。另外,甚至可以让一个子程序的返回值变得“不确定”----一次调用既有 可能返回一个列表,也有可能返回一个标量---具体由子程序的调用场合来决定。为支持这种不确定性,Perl专门提供了wantarray函数。 一旦在子程序主体中调用了这个函数,那么假如子程序是在一个列表试用场合下调用的,该函数便返回一个真值;假如子程序是在一个标量使用场合下调用的,该函 数便返回一个假值。

sub mysub()
{
        print wantarray() ? "数组\t" : "变量\n";
}

@a=mysub;    //这是数组环境,打印“数组”
$a=mysub;     //这是变量环境,打印“变量”

splice

@ret=splice(@a,skip,length,@newlist)

对@a操作,跳过skip个元素,然后开始用@newlist替换length个元素。@newlist和length可以不等长,无论@newlist多长,它占用(替换)length长的元素位置。

当length=0时为插入。splice(@a,-1,0,@newlist)在末尾追加

当@newlist为空则为删除。

当length和@newlist省略时为其后的全部删除。splice(@a,3);

@found=grep(/patten/,@search)对@search的每一个元素搜索匹配模式,匹配的元素返回到@found数组中。

map(expr, @list)对@list的每个元素进行expr运算,返回运算后的数组。元素用$_代表。map($_+1, (1,2))--------->(2,3)

二维数组:

$aoa=[[1,2,3],['a','b','c']];

子数组访问:@{$aoa->[0]}         //打印第一个数组的所有元素

子数组元素列表:@{$aoa->[0]}[0,1]     //打印第一个数组的第一第二个元素

元素访问:$aoa->[0][0]

print "@$aoa\n"    //打印两个子数组的地址

由两个一维数组构成二维数组:

@a=(1,2,3);  @b=('a','b','c');   $aoa=[[@a],[@b]];