五、創建關聯數組 可以用單個賦值語句創建關聯數組,如: %fruit = ("apples",17,"bananas",9,"oranges","none"); 此語句創建的關聯數組含有下面三個元素:
·下標為apples的元素,值為17 ·下標為bananas的元素,值為9 ·下標為oranges的元素,值為none 注:用列表給關聯數組賦值時,Perl5允許使用"=>"或","來分隔下標與值,用"=>"可讀性更好些,上面語句等效于: %fruit = ("apples"=>17,"bananas"=>9,"oranges"=>"none"); 六、從數組變量復制到關聯數組 與列表一樣,也可以通過數組變量創建關聯數組,當然,其元素數目應該為偶數,如: @fruit = ("apples",17,"bananas",9,"oranges","none"); %fruit = @fruit; 反之,可以把關聯數組賦給數組變量,如: %fruit = ("grapes",11,"lemons",27); @fruit = %fruit; 注意,此語句中元素次序未定義,那么數組變量@fruit可能為("grapes",11,"lemons",27)或("lemons",27,"grapes",11)。 關聯數組變量之間可以直接賦值,如:%fruit2 = %fruit1; 還可以把數組變量同時賦給一些簡單變量和一個關聯數組變量,如: ($var1, $var2, %myarray) = @list; 此語句把@list的第一個元素賦給$var1,第二個賦給$var2,其余的賦給%myarray。 最后,關聯數組可以通過返回值為列表的內嵌函數或用戶定義的子程序來創建,下例中把split()函數的返回值--一個列表--賦給一個關聯數組變量。 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 七、元素的增刪 增加元素已經講過,可以通過給一個未出現過的元素賦值來向關聯數組中增加新元素,如$fruit{"lime"} = 1;創建下標為lime、值為1的新元素。 刪除元素的方法是用內嵌函數delete,如欲刪除上述元素,則: delete ($fruit{"lime"}); 注意: 1、一定要使用delete函數來刪除關聯數組的元素,這是唯一的方法。 2、一定不要對關聯數組使用內嵌函數push、pop、shift及splice,因為其元素位置是隨機的。 八、列出數組的索引和值 上面已經提到,keys()函數返回關聯數組下標的列表,如:
%fruit = ("apples", 9, "bananas", 23, "cherries", 11); @fruitsubs = keys(%fruits);
這里,@fruitsubs被賦給apples、bananas、cherries構成的列表,再次提請注意,此列表沒有次序,若想按字母順序排列,可使用sort()函數。 @fruitindexes = sort keys(%fruits); 這樣結果為("apples","bananas","cherries")。類似的,內嵌函數values()返回關聯數組值的列表,如:
%fruit = ("apples", 9, "bananas", 23, "cherries", 11); @fruitvalues = values(%fruits);
這里,@fruitvalues可能的結果為(9,23.11),次序可能不同。 九、用關聯數組循環 前面已經出現過利用keys()函數的foreach循環語句,這種循環效率比較低,因為每返回一個下標,還得再去尋找其值,如:
foreach $holder (keys(%records)){ $record = $records{$holder}; } Perl提供一種更有效的循環方式,使用內嵌函數each(),如:
%records = ("Maris", 61, "Aaron", 755, "Young", 511); while (($holder, $record) = each(%records)) { # stuff goes here } each()函數每次返回一個雙元素的列表,其第一個元素為下標,第二個元素為相應的值,最后返回一個空列表。 注意:千萬不要在each()循環中添加或刪除元素,否則會產生不可預料的后果。 十、用關聯數組創建數據結構 用關聯數組可以模擬在其它高級語言中常見的多種數據結構,本節講述如何用之實現:鏈表、結構和樹。 1、(單)鏈表 鏈表是一種比較簡單的數據結構,可以按一定的次序存貯值。每個元素含有兩個域,一個是值,一個是引用(或稱指針),指向鏈表中下一個元素。一個特殊的頭指針指向鏈表的第一個元素。 在Perl中,鏈表很容易用關聯數組實現,因為一個元素的值可以作為下一個元素的索引。下例為按字母順序排列的單詞鏈表:
%words = ("abel", "baker", "baker", "charlie", "charlie", "delta", "delta", ""); $header = "abel";
|