列表或稱爲數組,和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”; #正確,輸出其數字