一、數(shù)組變量的限制 在前面講的數(shù)組變量中,可以通過下標(biāo)訪問其中的元素。例如,下列語句訪問數(shù)組@array的第三個(gè)元素: $scalar = $array[2]; 雖然數(shù)組很有用,但它們有一個(gè)顯著缺陷,即很難記住哪個(gè)元素存貯的什么內(nèi)容。假如我們來寫一個(gè)程序計(jì)算某文件中首字母大寫的單詞出現(xiàn)的次數(shù),用數(shù)組來實(shí)現(xiàn)就比較困難,程序代碼如下: 1 : #!/usr/local/bin/perl 2 : 3 : while ($inputline = ) { 4 : while ($inputline =~ /\b[A-Z]\S+/g) { 5 : $word = $&; 6 : $word =~ s/[;.,:-]$//; # remove punctuation 7 : for ($count = 1; $count <= @wordlist; 8 : $count++) { 9 : $found = 0; 10: if ($wordlist[$count-1] eq $word) { 11: $found = 1; 12: $wordcount[$count-1] += 1; 13: last; 14: } 15: } 16: if ($found == 0) { 17: $oldlength = @wordlist; 18: $wordlist[$oldlength] = $word; 19: $wordcount[$oldlength] = 1; 20: } 21: } 22: } 23: print ("Capitalized words and number of occurrences:\n"); 24: for ($count = 1; $count <= @wordlist; $count++) { 25: print ("$wordlist[$count-1]: $wordcount[$count-1]\n"); 26: } 運(yùn)行結(jié)果如下:
Here is a line of Input. This Input contains some Capitalized words. ^D Capitalized words and number of occurrences: Here: 1 Input: 2 This: 1 Capitalized: 1 這個(gè)程序每次從標(biāo)準(zhǔn)輸入文件讀一行文字,第四行起的循環(huán)匹配每行中首字母大寫的單詞,每找到一個(gè)循環(huán)一次,賦給簡(jiǎn)單變量$word。在第六行中去掉標(biāo)點(diǎn)后,查看該單詞是否曾出現(xiàn)過,7~15行中在@wordlist中挨個(gè)元素做此檢查,如果某個(gè)元素與$word相等,@wordcount中相應(yīng)的元素就增加一個(gè)數(shù)。如果沒有出現(xiàn)過,即@wordlist中沒有元素與$word相等,16~20行給@wordlist和@wordcount增加一個(gè)新元素。 二、定義 正如你所看到的,使用數(shù)組元素產(chǎn)生了一些問題。首先,@wordlist中哪個(gè)元素對(duì)應(yīng)著哪個(gè)單詞并不明顯;更糟的是,每讀進(jìn)一個(gè)新單詞,程序必須檢查整個(gè)列表才能知道該單詞是否曾經(jīng)出現(xiàn)過,當(dāng)列表變得較大時(shí),這是很耗費(fèi)時(shí)間的。 這些問題產(chǎn)生的原因是數(shù)組元素通過數(shù)字下標(biāo)訪問,為了解決這類問題,Perl定義了另一種數(shù)組,可以用任意簡(jiǎn)單變量值來訪問其元素,這種數(shù)組叫做關(guān)聯(lián)數(shù)組,也叫哈希表。 為了區(qū)分關(guān)聯(lián)數(shù)組變量與普通的數(shù)組變量,Perl使用%作為其首字符,而數(shù)組變量以@打頭。與其它變量名一樣,%后的第一個(gè)字符必須為字母,后續(xù)字符可以為字母、數(shù)字或下劃線。 三、訪問關(guān)聯(lián)數(shù)組的元素 關(guān)聯(lián)數(shù)組的下標(biāo)可以為任何簡(jiǎn)單/標(biāo)量值,訪問單個(gè)元素時(shí)以$符號(hào)打頭,下標(biāo)用大括號(hào)圍起來。例如: $fruit{"bananas"} $number{3.14159} $integer{-7} 簡(jiǎn)單變量也可作為下標(biāo),如: $fruit{$my_fruit} 四、增加元素 創(chuàng)建一個(gè)關(guān)聯(lián)數(shù)組元素最簡(jiǎn)單的方法是賦值,如語句$fruit{"bananas"} = 1; 把1賦給關(guān)聯(lián)數(shù)組%fruit下標(biāo)為bananas的元素,如果該元素不存在,則被創(chuàng)建,如果數(shù)組%fruit從未使用過,也被創(chuàng)建。 這一特性使得關(guān)聯(lián)數(shù)組很容易用于計(jì)數(shù)。下面我們用關(guān)聯(lián)數(shù)組改寫上面的程序,注意實(shí)現(xiàn)同樣的功能此程序簡(jiǎn)化了許多。
1 : #!/usr/local/bin/perl 2 : 3 : while ($inputline = ) { 4 : while ($inputline =~ /\b[A-Z]\S+/g) { 5 : $word = $&; 6 : $word =~ s/[;.,:-]$//; # remove punctuation 7 : $wordlist{$word} += 1; 8 : } 9 : } 10: print ("Capitalized words and number of occurrences:\n"); 11: foreach $capword (keys(%wordlist)) { 12: print ("$capword: $wordlist{$capword}\n"); 13: } 運(yùn)行結(jié)果如下:
Here is a line of Input. This Input contains some Capitalized words. ^D Capitalized words and number of occurrences: This: 1 Input: 2 Here: 1 Capitalized: 1 你可以看到,這次程序簡(jiǎn)單多了,讀取輸入并存貯各單詞數(shù)目從20行減少到了7行。 本程序用關(guān)聯(lián)數(shù)組%wordlist跟蹤首字母大寫的單詞,下標(biāo)就用單詞本身,元素值為該單詞出現(xiàn)的次數(shù)。第11行使用了內(nèi)嵌函數(shù)keys()。這個(gè)函數(shù)返回關(guān)聯(lián)數(shù)組的下標(biāo)列表,foreach語句就用此列表循環(huán)。 注:關(guān)聯(lián)數(shù)組總是隨機(jī)存貯的,因此當(dāng)你用keys()訪問其所有元素時(shí),不保證元素以任何順序出現(xiàn),特別值得一提的是,它們不會(huì)以被創(chuàng)建的順序出現(xiàn)。 要想控制關(guān)聯(lián)數(shù)組元素出現(xiàn)的次序,可以用sort()函數(shù)對(duì)keys()返回值進(jìn)行排列,如: foreach $capword (sort keys(%wordlist)) { print ("$capword: $wordlist{$capword}\n"); }
|
溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!