列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法。
1.1.定义
一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是一致的。
数组下标:
· 数组中的元素是由连续整数编了号的,其从0 开始;
· 下标可以是任何能返回数值的表达式。如果其值不为整数,则自动将其转换为小于它的最大整数值。
· 如果下标超出了数组的范围,则其值为undef。这和通常的变量情况是一样的,如果没有值存放在变量中,则其为undef。
· 如果将一个元素存储在数组最后元素的后面的位置,数组会自动增长的
$rocks[0] = ‘slate’; #又一个
$rocks[1] = ‘lava’; #又一个
$rocks[2] = ‘crushed rock’;#又一个
$rocks[99] = ‘schist’; #现在有96 个undef 元素
· 数组的负数索引值从最后一个元素开始,$#name 返回最后一个元素的索引。
$rocks[-1] = ‘hard rock’; #完成上例中的一种更简单的方法
$dead_rock = ‘rocks[-100]’; #得到‘bedrock’,第0 个元素
$rocks[-200] = ‘crystal’; #严重错误(fatal error!)
$#rocks = 99
(0,2 .. 6,10,12) #同(0,2,3,4,5,6,10,12)
($m ..$n) #由$m 和$n 的值决定
($m+$o,$p+$q) #两个值
(“fred”, “barney”, “betty”, “wilma”, “dino”)
qw(fred barney betty wilma dino ) #同上,但输入更少
qw ! fred barney betty wilma dino !
qw# fred barney betty wilma dino # #有些像注释
qw( fred barney betty wilma dino )
qw{ fred barney betty wilma dino }
qw[ fred barney betty wilma dino ]
qw< fred barney betty wilma dino >
1.2.列表赋值
($fred, $barney, $dino) = (“flintstone”, “rubble”, undef);
($fred, $barney) = ($barney, $fred) #交换两个变量
引用这个数组时,Perl 有一种简单的写法,在数组名前加@(后没有中括号)来引用整个数组
@rocks = qw / bedrock slate lava /;
@tiny = (); #空表
@giant = 1..1e5; #包含1到105元素的表
@stuff = (@giant, undef, @giant); #包含200,001 个元素的表
@dino = “granite”;
@quarry = (@rocks, “crushed rock”, @tiny, $dino);
最后一个赋值语句将五个元素(bedrock, slate, lava, crushed, rock, granite)赋给变量@quarry,因为@tiny 没有元素。
特别的是,它没有undef 这个值,但可以像@stuff 那样明确的指定它。
还有一点需要注意的是数组名字被其列表值替换。
数组不能成为列表的一个元素的原因是数组只能包含标量值,不能包含其它的数组。
没有赋值的数组变量的值为( ),空表。和未初始化的标量变量为undef 类似,未被初始化的数组为空表。
@copy = @quarry; #将一个数组中的值拷贝的另一个数组中
1.3.插入和删除
Perl 程序员不使用索引,介绍几种不使用索引来操作数组的方法:
通常将数组类似于栈来使用,在其右边添加或者删除数据
pop 操作将数组的最后一个元素取出并返回;
@array = 5..9;
$fred = pop(@array); #$fred 得到9,@array 现在为(5,6,7,8)
push,它可以将一个元素(或者一列元素)加在数组的末尾:
@array = 5..6 ;
push(@array,0); #@array 现在为(5,6,0)
push @array,8; #@array 现在为(5,6,0,8)
push @array,1..10; #@array 现在多了10 个元素
@others =qw/9 0 2 1 0 /;
push @array,@others; #@array 现在又多了5 个元素(共有19 个)
unshift 和shift 对一个数组的开头进行操作(数组的左端有最小下标的元素)
@array = qw# dino fred barney #;
$m = shift (@array); #$m 得到“dino”, @array 现在为(“fred”, “barney”)
$n = shift @array; #$n 得到”fred”, @array 现在为(“barney”)
shift @array; #@array 现在为空
$o = shift @array; #$o 得到undef, @arry 仍为空
unshift(@array,5); #@array 现在为(5)
unshift @array,4; #@array 现在为(4,5)
@others = 1..3;
unshift @array, @others; #array 现在为(1,2,3,4,5)
和标量类似,数组也可以插入双引号的字符串中。插入的"数组元素"会自动由空格分开,插入的数组元素的第一个元素前面和最后一个元素后面不会插入空格,如果需要可以自己加入.
1.4.遍历
foreach 从列表的第一个元素一直循环执行到最后一个元素,一次迭代一个
控制变量不是这些列表元素中的一个拷贝而是这些元素本身。也就是说,如果在循环中修改这个变量,那原始列表中的元素也会被修改.
#! /usr/bin/perl foreach $color(qw [red yellow block white]) { print "$color\n" ; } # @rocks = qw/ bedrock slate lava /; print "before foreach ,The rocks are:\n@rocks\n"; foreach $rock(@rocks){ $rock ="\t$rock"; #@rocks 的每一个元素前加入一个tab $rock .= "\n"; #每一个元素后加一个换行符 print "in foreach ,the rock is :$rock \n" ; } print "after foreach, The rocks are:\n@rocks";
程序结果:
如果在foreach 循环中省略了控制变量,那Perl 会使用其默认的变量:$_
foreach(1..10){ #使用默认的变量$_
print “I can count to $_!\n”;
}
#遍历
foreach(0..$#rocks)
{
print "$rocks[$_]";
}
1.5.排序
sort 操作将输入的一串列表(可能是数组)根据内部的字符顺序进行排序。如对于ASCII 字符串,将根据ASCII 序进行排
序。当然,ASCII 中有一些奇怪的地方,如大写字母在小写字符的前面,数字在字符的前面,而标点符号散布在各处。
#! /usr/bin/perl @list = qw {111 2 test Test HUNAN 9 10} ; @list = sort(@list); foreach (@list) { print "$_\n"; } |
1.6.其他函数
reverse(逆转)操作将输入的一串列表(可能是数组)按相反的顺序返回。
@fred = 6 ..10;
@barney = reverse (@fred); #得到10,9,8,7,6
1.7.标量和列表
标量就是【c】变量
列表就是【c】数组
Perl 中的表达式将根据其context 返回适当的值,列表or标量,例如,一个数组的“name”,在列表context 中,它返回列表元素;在标量context 中,它返回数组元素的个数。
@people = qw( fred barney betty );
@sorted = sort @people; #列表context:barney , betty, fred
$number = 42 + @people; #标量context:42+3,得到45
$fred = something; # 标量context
@pebbles = something; #列表context
($wilma,$betty) = something; #列表context
($dino) = something; #列表context,dino取列表中的第一个值
下面是一些标量context:
$fred = something;
$fred[3] = something;
123 + something;
something + 654
if(something){… }
$fred[something] = something;
下面是一些列表context:
@fred = something;
($fred, $barney) = something;
($fred) = something;
push @fred, something;
foreach $fred(something)
sort something
reverse something
print something
偶尔你可能需要标量context而Perl 期望的是列表。这种情况下,可以使用函数scalar。它不是一个真实的函数因为其仅是告诉Perl 提供一个标量context
@rocks = qw(talc quartz jade obsidian);
print “How many rocks do you have?\n”;
print “I have ”, @rocks, “rocks!\n”; #错误,输出rocks 的名字
print “I have ”, scalar @rocks, “rocks!\n”; #正确,输出其数字