本文和大家重點討論一下perl關聯陣列的概念,建立perl關聯陣列,從陣列變數複製到perl關聯陣列,元素的增刪,用perl關聯陣列迴圈等內容,相信通過本文的學習你對perl關聯陣列的用法一定會有深刻的認識。
perl關聯陣列
一、建立perl關聯陣列
二、從陣列變數複製到perl關聯陣列
注意,此語句中元素次序未定義,那麼陣列變數@fruit可能為("grapes",11,"lemons",27)或("lemons",27,"grapes",11)。
perl關聯陣列變數之間可以直接賦值,如:%fruit2=%fruit1;還可以把陣列變數同時賦給一些簡單變數和乙個perl關聯陣列變數,如:
($var1,$var2,%myarray)=@list;
此語句把@list的第乙個元素賦給$var1,第二個賦給$var2,其餘的賦給%myarray。
最後,perl關聯陣列可以通過返回值為列表的內嵌函式或使用者定義的子程式來建立,下例中把split()函式的返回值--乙個列表--賦給乙個perl關聯陣列變數。
1:#!/usr/local/bin/perl2:
3:$inputline=;
4:$inputline=~s/^\s+|\s+\n$//g;
5:%fruit=split(/\s+/,$inputline);
6:print("numberofbananas:$fruit\n");
三、元素的增刪
增加元素已經講過,可以通過給乙個未出現過的元素賦值來向perl關聯陣列中增加新元素,如$fruit=1;建立下標為lime、值為1的新元素。
刪除元素的方法是用內嵌函式delete,如欲刪除上述元素,則:
delete($fruit);
注意:1、一定要使用delete函式來刪除perl關聯陣列的元素,這是唯一的方法。
2、一定不要對perl關聯陣列使用內嵌函式push、pop、shift及splice,因為其元素位置是隨機的。
四、列出陣列的索引和值
上面已經提到,keys()函式返回perl關聯陣列下標的列表,如:
"bananas",23,"cherries",11);
@fruitsubs=keys(%fruits);
五、用perl關聯陣列迴圈
前面已經出現過利用keys()函式的foreach迴圈語句,這種迴圈效率比較低,因為每返回乙個下標,還得再去尋找其值,如:
foreach$holder(keys(%records));
}perl提供一種更有效的迴圈方式,使用內嵌函式each(),如:
%records=("maris",61,"aaron",755,"young",511);
while(($holder,$record)=each(%records))
each()函式每次返回乙個雙元素的列表,其第乙個元素為下標,第二個元素為相應的值,最後返回乙個空列表。
注意:千萬不要在each()迴圈中新增或刪除元素,否則會產生不可預料的後果。
六、用perl關聯陣列建立資料結構
用perl關聯陣列可以模擬在其它高階語言中常見的多種資料結構,本節講述如何用之實現:鍊錶、結構和樹。
1、(單)鍊錶
鍊錶是一種比較簡單的資料結構,可以按一定的次序存貯值。每個元素含有兩個域,乙個是值,乙個是引用(或稱指標),指向鍊錶中下乙個元素。乙個特殊的頭指標指向鍊錶的第乙個元素。
在perl中,鍊錶很容易用perl關聯陣列實現,因為乙個元素的值可以作為下乙個元素的索引。下例為按字母順序排列的單詞鍊錶:
%words=("abel","baker","baker","charlie",
"charlie","delta",
"delta","");
$header="abel";
下標為delta的最後乙個元素的值為空串,表示鍊錶的結束。在將要處理的資料個數未知或其隨程式執行而增長的情況下,鍊錶十分有用。
此程式分為三個部分:
◆主程式:讀取輸入並轉換到相應的格式。
◆子程式:add_word_to_list,建立排序單詞鍊錶。
◆子程式:print_list,輸出單詞鍊錶
第3~17行為主程式,第4行初始化鍊錶,將表頭變數$header設為空串,第5行起的迴圈每次讀取一行輸入,第7行去掉頭、尾的空格,第8行將句子分割成單詞。9~15行的內迴圈每次處理乙個單詞,如果該單詞的最後乙個字元是標點符號,就去掉。第13行把單詞轉換成全小寫形式,第14行傳遞給子程式add_word_to_list。
子程式add_word_to_list先在第24行處檢查鍊錶是否為空。如果是,第25行將單詞賦給$header,26行建立鍊錶第乙個元素,存貯在perl關聯陣列%wordlist中。如果鍊錶非空,37行檢查第乙個元素是否與該單詞相同,如果相同,就立刻返回。下一步檢查這一新單詞是否應該為鍊錶第乙個元素,即其按字母順序先於$header。
如果是這樣,則:
1、建立乙個新元素,下標為該新單詞,其值為原第乙個單詞。
2、該新單詞賦給$header。
如果該新單詞不該為第乙個元素,則40~44行利用局域變數$pointer尋找其合適的有效位置,41~44行迴圈到$wordlist大於或等於$word為止。接下來46行檢視該單詞是否已在鍊錶中,如果在就返回,否則47~48行將其新增到鍊錶中。首先47行建立新元素$wordlist,其值為$wordlist,這時$wordlist和$wordlist指向同乙個單詞。然後,48行將$wordlist的值賦為$word,即將$wordlist指向剛建立的新元素$wordlist。
最後當處理完畢後,子程式print_list()依次輸出鍊錶,局域變數$pointer含有正在輸出的值,$wordlist為下乙個要輸出的值。
注:一般不需要用鍊錶來做這些工作,用sort()和keys()在perl關聯陣列中迴圈就足夠了,如:
foreach$word(sortkeys(%wordlist))
但是,這裡涉及的指標的概念在其它資料結構中很有意義。
1215 關聯陣列
一 陣列變數的限制 在前面講的陣列變數中,可以通過下標訪問其中的元素。例如,下列語句訪問陣列 array 的第三個元素 scalar array 2 雖然陣列很有用,但它們有乙個顯著缺陷,即很難記住哪個元素存貯的什麼內容。假如我們來寫乙個程式計算某檔案中首字母大寫的單詞出現的次數,用陣列來實現就比較...
9 3 關聯陣列
關聯陣列是bash 4.0新增的乙個特性。關聯陣列將值與索引連線 關聯 到一起,所以我們可以將元資料與實際資料關聯起來。使用這種方式可以將 家與他的樂器聯絡起來。關聯陣列必須以大寫的declare a命令來進行宣告。cat musicians.sh bin bash declare a beatle...
JS 關聯陣列
使用方式 var arr arr key1 value1 arr key2 value2 通常的陣列在填充時會隱式或者顯示指定陣列下標,但js中陣列可以以名字的形式為元素賦值,這就形成了關聯陣列,如 var arr new array arr china beijing,niaoling,hulan...