Perl關(guān)聯(lián)數(shù)組用法詳解
本文和大家重點(diǎn)討論一下Perl關(guān)聯(lián)數(shù)組的概念,Perl關(guān)聯(lián)數(shù)組的下標(biāo)可以為任何簡(jiǎn)單/標(biāo)量值,訪問(wèn)單個(gè)元素時(shí)以$符號(hào)打頭,下標(biāo)用大括號(hào)圍起來(lái)。想了解Perl關(guān)聯(lián)數(shù)組的具體內(nèi)容請(qǐng)看本文詳細(xì)介紹。
Perl關(guān)聯(lián)數(shù)組
一、Perl關(guān)聯(lián)數(shù)組變量的限制
在前面講的數(shù)組變量中,可以通過(guò)下標(biāo)訪問(wèn)其中的元素。例如,下列語(yǔ)句訪問(wèn)數(shù)組@array的第三個(gè)元素:
$scalar=$array[2];
雖然數(shù)組很有用,但它們有一個(gè)顯著缺陷,即很難記住哪個(gè)元素存貯的什么內(nèi)容。假如我們來(lái)寫一個(gè)程序計(jì)算某文件中首字母大寫的單詞出現(xiàn)的次數(shù),用數(shù)組來(lái)實(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/[;.,:-]$//;#removepunctuation
- 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("Capitalizedwordsandnumberofoccurrences:\n");
- 24:for($count=1;$count<=@wordlist;$count++){
- 25:print("$wordlist[$count-1]:$wordcount[$count-1]\n");
- 26:}
運(yùn)行結(jié)果如下:
- HereisalineofInput.
- ThisInputcontainssomeCapitalizedwords.
- ^D
- Capitalizedwordsandnumberofoccurrences:
- 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)過(guò),7~15行中在@wordlist中挨個(gè)元素做此檢查,如果某個(gè)元素與$word相等,@wordcount中相應(yīng)的元素就增加一個(gè)數(shù)。如果沒(méi)有出現(xiàn)過(guò),即@wordlist中沒(méi)有元素與$word相等,16~20行給@wordlist和@wordcount增加一個(gè)新元素。
二、Perl關(guān)聯(lián)數(shù)組定義
正如你所看到的,使用數(shù)組元素產(chǎn)生了一些問(wèn)題。首先,@wordlist中哪個(gè)元素對(duì)應(yīng)著哪個(gè)單詞并不明顯;更糟的是,每讀進(jìn)一個(gè)新單詞,程序必須檢查整個(gè)列表才能知道該單詞是否曾經(jīng)出現(xiàn)過(guò),當(dāng)列表變得較大時(shí),這是很耗費(fèi)時(shí)間的。
這些問(wèn)題產(chǎn)生的原因是數(shù)組元素通過(guò)數(shù)字下標(biāo)訪問(wèn),為了解決這類問(wèn)題,Perl定義了另一種數(shù)組,可以用任意簡(jiǎn)單變量值來(lái)訪問(wèn)其元素,這種數(shù)組叫做Perl關(guān)聯(lián)數(shù)組,也叫哈希表。
為了區(qū)分Perl關(guān)聯(lián)數(shù)組變量與普通的數(shù)組變量,Perl使用%作為其首字符,而數(shù)組變量以@打頭。與其它變量名一樣,%后的第一個(gè)字符必須為字母,后續(xù)字符可以為字母、數(shù)字或下劃線。
三、訪問(wèn)Perl關(guān)聯(lián)數(shù)組的元素
Perl關(guān)聯(lián)數(shù)組的下標(biāo)可以為任何簡(jiǎn)單/標(biāo)量值,訪問(wèn)單個(gè)元素時(shí)以$符號(hào)打頭,下標(biāo)用大括號(hào)圍起來(lái)。例如:
$fruit{"bananas"}
$number{3.14159}
$integer{-7}
簡(jiǎn)單變量也可作為下標(biāo),如:
$fruit{$my_fruit}
四、增加元素
創(chuàng)建一個(gè)Perl關(guān)聯(lián)數(shù)組元素最簡(jiǎn)單的方法是賦值,如語(yǔ)句$fruit{"bananas"}=1;把1賦給Perl關(guān)聯(lián)數(shù)組%fruit下標(biāo)為bananas的元素,如果該元素不存在,則被創(chuàng)建,如果數(shù)組%fruit從未使用過(guò),也被創(chuàng)建。
這一特性使得Perl關(guān)聯(lián)數(shù)組很容易用于計(jì)數(shù)。下面我們用Perl關(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/[;.,:-]$//;#removepunctuation
- 7:$wordlist{$word}+=1;
- 8:}
- 9:}
- 10:print("Capitalizedwordsandnumberofoccurrences:\n");
- 11:foreach$capword(keys(%wordlist)){
- 12:print("$capword:$wordlist{$capword}\n");
- 13:}
運(yùn)行結(jié)果如下:
- HereisalineofInput.
- ThisInputcontainssomeCapitalizedwords.
- ^D
- Capitalizedwordsandnumberofoccurrences:
- This:1
- Input:2
- Here:1
- Capitalized:1
你可以看到,這次程序簡(jiǎn)單多了,讀取輸入并存貯各單詞數(shù)目從20行減少到了7行。
本程序用Perl關(guān)聯(lián)數(shù)組%wordlist跟蹤首字母大寫的單詞,下標(biāo)就用單詞本身,元素值為該單詞出現(xiàn)的次數(shù)。第11行使用了內(nèi)嵌函數(shù)keys()。這個(gè)函數(shù)返回Perl關(guān)聯(lián)數(shù)組的下標(biāo)列表,foreach語(yǔ)句就用此列表循環(huán)。
注:Perl關(guān)聯(lián)數(shù)組總是隨機(jī)存貯的,因此當(dāng)你用keys()訪問(wèn)其所有元素時(shí),不保證元素以任何順序出現(xiàn),特別值得一提的是,它們不會(huì)以被創(chuàng)建的順序出現(xiàn)。
要想控制Perl關(guān)聯(lián)數(shù)組元素出現(xiàn)的次序,可以用sort()函數(shù)對(duì)keys()返回值進(jìn)行排列,如:
- foreach$capword(sortkeys(%wordlist)){
- print("$capword:$wordlist{$capword}\n");
- }
【編輯推薦】
- Perl if語(yǔ)句用法實(shí)例解析
- Perl文件句柄概念詳解
- 實(shí)例解析Perl守護(hù)進(jìn)程用法
- Perl模式匹配經(jīng)驗(yàn)總結(jié)
- 術(shù)語(yǔ)匯編 Perl變量中Perl關(guān)聯(lián)數(shù)組用法解析