Perl關(guān)聯(lián)數(shù)組用法集錦
本文和大家重點(diǎn)討論一下Perl關(guān)聯(lián)數(shù)組的概念,創(chuàng)建Perl關(guān)聯(lián)數(shù)組,從數(shù)組變量復(fù)制到Perl關(guān)聯(lián)數(shù)組,元素的增刪,用Perl關(guān)聯(lián)數(shù)組循環(huán)等內(nèi)容,相信通過本文的學(xué)習(xí)你對(duì)Perl關(guān)聯(lián)數(shù)組的用法一定會(huì)有深刻的認(rèn)識(shí)。
Perl關(guān)聯(lián)數(shù)組
一、創(chuàng)建Perl關(guān)聯(lián)數(shù)組
可以用單個(gè)賦值語句創(chuàng)建Perl關(guān)聯(lián)數(shù)組,如:
%fruit=("apples",17,"bananas",9,"oranges","none");
此語句創(chuàng)建的Perl關(guān)聯(lián)數(shù)組含有下面三個(gè)元素:
◆下標(biāo)為apples的元素,值為17
◆下標(biāo)為bananas的元素,值為9
◆下標(biāo)為oranges的元素,值為none
注:用列表給Perl關(guān)聯(lián)數(shù)組賦值時(shí),Perl5允許使用"=>"或","來分隔下標(biāo)與值,用"=>"可讀性更好些,上面語句等效于:
%fruit=("apples"=>17,"bananas"=>9,"oranges"=>"none");
二、從數(shù)組變量復(fù)制到Perl關(guān)聯(lián)數(shù)組
與列表一樣,也可以通過數(shù)組變量創(chuàng)建Perl關(guān)聯(lián)數(shù)組,當(dāng)然,其元素?cái)?shù)目應(yīng)該為偶數(shù),如:
@fruit=("apples",17,"bananas",9,"oranges","none");
%fruit=@fruit;
反之,可以把Perl關(guān)聯(lián)數(shù)組賦給數(shù)組變量,如:
%fruit=("grapes",11,"lemons",27);
@fruit=%fruit;
注意,此語句中元素次序未定義,那么數(shù)組變量@fruit可能為("grapes",11,"lemons",27)或("lemons",27,"grapes",11)。
Perl關(guān)聯(lián)數(shù)組變量之間可以直接賦值,如:%fruit2=%fruit1;還可以把數(shù)組變量同時(shí)賦給一些簡(jiǎn)單變量和一個(gè)Perl關(guān)聯(lián)數(shù)組變量,如:
($var1,$var2,%myarray)=@list;
此語句把@list的第一個(gè)元素賦給$var1,第二個(gè)賦給$var2,其余的賦給%myarray。
最后,Perl關(guān)聯(lián)數(shù)組可以通過返回值為列表的內(nèi)嵌函數(shù)或用戶定義的子程序來創(chuàng)建,下例中把split()函數(shù)的返回值--一個(gè)列表--賦給一個(gè)Perl關(guān)聯(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("Numberofbananas:$fruit{\"bananas\"}\n");
運(yùn)行結(jié)果如下:
oranges5apples7bananas11cherries6
Numberofbananas:11
三、元素的增刪
增加元素已經(jīng)講過,可以通過給一個(gè)未出現(xiàn)過的元素賦值來向Perl關(guān)聯(lián)數(shù)組中增加新元素,如$fruit{"lime"}=1;創(chuàng)建下標(biāo)為lime、值為1的新元素。
刪除元素的方法是用內(nèi)嵌函數(shù)delete,如欲刪除上述元素,則:
delete($fruit{"lime"});
注意:
1、一定要使用delete函數(shù)來刪除Perl關(guān)聯(lián)數(shù)組的元素,這是唯一的方法。
2、一定不要對(duì)Perl關(guān)聯(lián)數(shù)組使用內(nèi)嵌函數(shù)push、pop、shift及splice,因?yàn)槠湓匚恢檬请S機(jī)的。
四、列出數(shù)組的索引和值
上面已經(jīng)提到,keys()函數(shù)返回Perl關(guān)聯(lián)數(shù)組下標(biāo)的列表,如:
- %fruit=("apples",9,
- "bananas",23,
- "cherries",11);
- @fruitsubs=keys(%fruits);
這里,@fruitsubs被賦給apples、bananas、cherries構(gòu)成的列表,再次提請(qǐng)注意,此列表沒有次序,若想按字母順序排列,可使用sort()函數(shù)。
@fruitindexes=sortkeys(%fruits);
這樣結(jié)果為("apples","bananas","cherries")。類似的,內(nèi)嵌函數(shù)values()返回Perl關(guān)聯(lián)數(shù)組值的列表,如:
%fruit=("apples",9,
"bananas",23,
"cherries",11);
@fruitvalues=values(%fruits);
這里,@fruitvalues可能的結(jié)果為(9,23.11),次序可能不同。
五、用Perl關(guān)聯(lián)數(shù)組循環(huán)
前面已經(jīng)出現(xiàn)過利用keys()函數(shù)的foreach循環(huán)語句,這種循環(huán)效率比較低,因?yàn)槊糠祷匾粋€(gè)下標(biāo),還得再去尋找其值,如:
foreach$holder(keys(%records)){
$record=$records{$holder};
}
Perl提供一種更有效的循環(huán)方式,使用內(nèi)嵌函數(shù)each(),如:
%records=("Maris",61,"Aaron",755,"Young",511);
while(($holder,$record)=each(%records)){
#stuffgoeshere
}
each()函數(shù)每次返回一個(gè)雙元素的列表,其第一個(gè)元素為下標(biāo),第二個(gè)元素為相應(yīng)的值,最后返回一個(gè)空列表。
注意:千萬不要在each()循環(huán)中添加或刪除元素,否則會(huì)產(chǎn)生不可預(yù)料的后果。
六、用Perl關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu)
用Perl關(guān)聯(lián)數(shù)組可以模擬在其它高級(jí)語言中常見的多種數(shù)據(jù)結(jié)構(gòu),本節(jié)講述如何用之實(shí)現(xiàn):鏈表、結(jié)構(gòu)和樹。
1、(單)鏈表
鏈表是一種比較簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),可以按一定的次序存貯值。每個(gè)元素含有兩個(gè)域,一個(gè)是值,一個(gè)是引用(或稱指針),指向鏈表中下一個(gè)元素。一個(gè)特殊的頭指針指向鏈表的第一個(gè)元素。
在Perl中,鏈表很容易用Perl關(guān)聯(lián)數(shù)組實(shí)現(xiàn),因?yàn)橐粋€(gè)元素的值可以作為下一個(gè)元素的索引。下例為按字母順序排列的單詞鏈表:
- %words=("abel","baker",
- "baker","charlie",
- "charlie","delta",
- "delta","");
- $header="abel";
下標(biāo)為delta的最后一個(gè)元素的值為空串,表示鏈表的結(jié)束。在將要處理的數(shù)據(jù)個(gè)數(shù)未知或其隨程序運(yùn)行而增長(zhǎng)的情況下,鏈表十分有用。
此程序分為三個(gè)部分:
◆主程序:讀取輸入并轉(zhuǎn)換到相應(yīng)的格式。
◆子程序:add_word_to_list,建立排序單詞鏈表。
◆子程序:print_list,輸出單詞鏈表
第3~17行為主程序,第4行初始化鏈表,將表頭變量$header設(shè)為空串,第5行起的循環(huán)每次讀取一行輸入,第7行去掉頭、尾的空格,第8行將句子分割成單詞。9~15行的內(nèi)循環(huán)每次處理一個(gè)單詞,如果該單詞的最后一個(gè)字符是標(biāo)點(diǎn)符號(hào),就去掉。第13行把單詞轉(zhuǎn)換成全小寫形式,第14行傳遞給子程序add_word_to_list。
子程序add_word_to_list先在第24行處檢查鏈表是否為空。如果是,第25行將單詞賦給$header,26行創(chuàng)建鏈表第一個(gè)元素,存貯在Perl關(guān)聯(lián)數(shù)組%wordlist中。如果鏈表非空,37行檢查第一個(gè)元素是否與該單詞相同,如果相同,就立刻返回。下一步檢查這一新單詞是否應(yīng)該為鏈表第一個(gè)元素,即其按字母順序先于$header。
如果是這樣,則:
1、創(chuàng)建一個(gè)新元素,下標(biāo)為該新單詞,其值為原第一個(gè)單詞。
2、該新單詞賦給$header。
如果該新單詞不該為第一個(gè)元素,則40~44行利用局域變量$pointer尋找其合適的有效位置,41~44行循環(huán)到$wordlist{$pointer}大于或等于$word為止。接下來46行查看該單詞是否已在鏈表中,如果在就返回,否則47~48行將其添加到鏈表中。首先47行創(chuàng)建新元素$wordlist{$word},其值為$wordlist{$pointer},這時(shí)$wordlist{$word}和$wordlist{$pointer}指向同一個(gè)單詞。然后,48行將$wordlist{$pointer}的值賦為$word,即將$wordlist{$pointer}指向剛創(chuàng)建的新元素$wordlist{$word}。
最后當(dāng)處理完畢后,子程序print_list()依次輸出鏈表,局域變量$pointer含有正在輸出的值,$wordlist{$pointer}為下一個(gè)要輸出的值。
注:一般不需要用鏈表來做這些工作,用sort()和keys()在Perl關(guān)聯(lián)數(shù)組中循環(huán)就足夠了,如:
foreach$word(sortkeys(%wordlist)){
#printthesortedlist,orwhatever}
但是,這里涉及的指針的概念在其它數(shù)據(jù)結(jié)構(gòu)中很有意義。
【編輯推薦】
- Perl關(guān)聯(lián)數(shù)組用法詳解
- Perl文件句柄概念詳解
- 實(shí)例解析Perl守護(hù)進(jìn)程用法
- Perl模式匹配經(jīng)驗(yàn)總結(jié)
- 術(shù)語匯編 Perl變量中Perl關(guān)聯(lián)數(shù)組用法解析