明輝手游網(wǎng)中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

Perl教學 第9篇 關聯(lián)數(shù)組之二

[摘要]五、創(chuàng)建關聯(lián)數(shù)組可以用單個賦值語句創(chuàng)建關聯(lián)數(shù)組,如:%fruit = ("apples",17,"bananas",9,"oranges","none");此語句創(chuàng)建的關聯(lián)數(shù)組含有下面三個元素: ·下標為ap...
五、創(chuàng)建關聯(lián)數(shù)組
可以用單個賦值語句創(chuàng)建關聯(lián)數(shù)組,如:
%fruit = ("apples",17,"bananas",9,"oranges","none");
此語句創(chuàng)建的關聯(lián)數(shù)組含有下面三個元素:

·下標為apples的元素,值為17
·下標為bananas的元素,值為9
·下標為oranges的元素,值為none
注:用列表給關聯(lián)數(shù)組賦值時,Perl5允許使用"=>"或","來分隔下標與值,用"=>"可讀性更好些,上面語句等效于:
%fruit = ("apples"=>17,"bananas"=>9,"oranges"=>"none");
六、從數(shù)組變量復制到關聯(lián)數(shù)組
與列表一樣,也可以通過數(shù)組變量創(chuàng)建關聯(lián)數(shù)組,當然,其元素數(shù)目應該為偶數(shù),如:
@fruit = ("apples",17,"bananas",9,"oranges","none");
%fruit = @fruit;
反之,可以把關聯(lián)數(shù)組賦給數(shù)組變量,如:
%fruit = ("grapes",11,"lemons",27);
@fruit = %fruit;
注意,此語句中元素次序未定義,那么數(shù)組變量@fruit可能為("grapes",11,"lemons",27)或("lemons",27,"grapes",11)。
關聯(lián)數(shù)組變量之間可以直接賦值,如:%fruit2 = %fruit1; 還可以把數(shù)組變量同時賦給一些簡單變量和一個關聯(lián)數(shù)組變量,如:
($var1, $var2, %myarray) = @list;
此語句把@list的第一個元素賦給$var1,第二個賦給$var2,其余的賦給%myarray。
最后,關聯(lián)數(shù)組可以通過返回值為列表的內嵌函數(shù)或用戶定義的子程序來創(chuàng)建,下例中把split()函數(shù)的返回值--一個列表--賦給一個關聯(lián)數(shù)組變量。
1: #!/usr/local/bin/perl
2:
3: $inputline = ;
4: $inputline =~ s/^\s+ \s+\n$//g;
5: %fruit = split(/\s+/, $inputline);
6: print ("Number of bananas: $fruit{\"bananas\"}\n");
運行結果如下:
oranges 5 apples 7 bananas 11 cherries 6
Number of bananas: 11
七、元素的增刪
增加元素已經(jīng)講過,可以通過給一個未出現(xiàn)過的元素賦值來向關聯(lián)數(shù)組中增加新元素,如$fruit{"lime"} = 1;創(chuàng)建下標為lime、值為1的新元素。
刪除元素的方法是用內嵌函數(shù)delete,如欲刪除上述元素,則:
delete ($fruit{"lime"});
注意:
1、一定要使用delete函數(shù)來刪除關聯(lián)數(shù)組的元素,這是唯一的方法。
2、一定不要對關聯(lián)數(shù)組使用內嵌函數(shù)push、pop、shift及splice,因為其元素位置是隨機的。
八、列出數(shù)組的索引和值
上面已經(jīng)提到,keys()函數(shù)返回關聯(lián)數(shù)組下標的列表,如:

%fruit = ("apples", 9,
"bananas", 23,
"cherries", 11);
@fruitsubs = keys(%fruits);

這里,@fruitsubs被賦給apples、bananas、cherries構成的列表,再次提請注意,此列表沒有次序,若想按字母順序排列,可使用sort()函數(shù)。
@fruitindexes = sort keys(%fruits);
這樣結果為("apples","bananas","cherries")。類似的,內嵌函數(shù)values()返回關聯(lián)數(shù)組值的列表,如:

%fruit = ("apples", 9,
"bananas", 23,
"cherries", 11);
@fruitvalues = values(%fruits);

這里,@fruitvalues可能的結果為(9,23.11),次序可能不同。
九、用關聯(lián)數(shù)組循環(huán)
前面已經(jīng)出現(xiàn)過利用keys()函數(shù)的foreach循環(huán)語句,這種循環(huán)效率比較低,因為每返回一個下標,還得再去尋找其值,如:

foreach $holder (keys(%records)){
$record = $records{$holder};
}
Perl提供一種更有效的循環(huán)方式,使用內嵌函數(shù)each(),如:

%records = ("Maris", 61, "Aaron", 755, "Young", 511);
while (($holder, $record) = each(%records)) {
# stuff goes here
}
each()函數(shù)每次返回一個雙元素的列表,其第一個元素為下標,第二個元素為相應的值,最后返回一個空列表。
注意:千萬不要在each()循環(huán)中添加或刪除元素,否則會產(chǎn)生不可預料的后果。
十、用關聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結構
用關聯(lián)數(shù)組可以模擬在其它高級語言中常見的多種數(shù)據(jù)結構,本節(jié)講述如何用之實現(xiàn):鏈表、結構和樹。
1、(單)鏈表
鏈表是一種比較簡單的數(shù)據(jù)結構,可以按一定的次序存貯值。每個元素含有兩個域,一個是值,一個是引用(或稱指針),指向鏈表中下一個元素。一個特殊的頭指針指向鏈表的第一個元素。
在Perl中,鏈表很容易用關聯(lián)數(shù)組實現(xiàn),因為一個元素的值可以作為下一個元素的索引。下例為按字母順序排列的單詞鏈表:

%words = ("abel", "baker",
"baker", "charlie",
"charlie", "delta",
"delta", "");
$header = "abel";