?? perl 語(yǔ)言-perl 中文教程(第九章).htm
字號(hào):
onmouseout=MM_swapImgRestore()
href="http://www.sun126.com/perl5/perl5-13.htm"><IMG
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/13.gif" border=0
name=Image16></A></TD></TR>
<TR>
<TD><A onmouseover="MM_swapImage('Image18','','14a.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://www.sun126.com/perl5/perl5-14.htm"><IMG
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/14.gif" border=0
name=Image18></A></TD></TR>
<TR>
<TD><A onmouseover="MM_swapImage('Image19','','y1a.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://www.sun126.com/perl5/perl5-15.htm"><IMG
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/y1.gif" border=0
name=Image19></A></TD></TR>
<TR>
<TD><A onmouseover="MM_swapImage('Image20','','y2a.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://www.sun126.com/perl5/perl5-16.htm"><IMG
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/y2.gif" border=0
name=Image20></A></TD></TR>
<TR>
<TD><A onmouseover="MM_swapImage('Image21','','y3a.gif',1)"
onmouseout=MM_swapImgRestore()
href="http://www.sun126.com/perl5/perl5-17.htm"><IMG
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/y3.gif" border=0
name=Image21></A></TD></TR></TBODY></TABLE></TD>
<TD class=myFont vAlign=top width=30><IMG height=1
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/x.gif" width=10> </TD>
<TD class=myFont vAlign=top>
<DIV align=center><IMG height=30
src="Perl 語(yǔ)言-Perl 中文教程(第九章).files/top.gif" width=180><BR><SPAN
class=myFont><SPAN class=myFont><FONT face=宋體>翻譯:</FONT></SPAN></SPAN>
<SPAN class=myFont><SPAN class=myFont>flamephoenix</SPAN></SPAN> <BR>
<HR width="100%" SIZE=1>
<DIV align=left>
<P align=center><B>第九章 關(guān)聯(lián)數(shù)組/哈希表</B><A
href="http://www.sun126.com/perl5/perl5-9.htm#1"> </A></P>
<P><A href="http://www.sun126.com/perl5/perl5-9.htm#1">一、數(shù)組變量的限制</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#2">二、定義</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#3">三、訪問(wèn)關(guān)聯(lián)數(shù)組的元素</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#4">四、增加元素</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#5">五、創(chuàng)建關(guān)聯(lián)數(shù)組</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#6">六、從數(shù)組變量復(fù)制到關(guān)聯(lián)數(shù)組</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#7">七、元素的增刪</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#8">八、列出數(shù)組的索引和值</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#9">九、用關(guān)聯(lián)數(shù)組循環(huán)</A><BR><A
href="http://www.sun126.com/perl5/perl5-9.htm#10">十、用關(guān)聯(lián)數(shù)組創(chuàng)建數(shù)據(jù)結(jié)構(gòu)</A><BR>
<A
href="http://www.sun126.com/perl5/perl5-9.htm#10.1">1、(單)鏈表</A><BR>
<A href="http://www.sun126.com/perl5/perl5-9.htm#10.2">2、結(jié)構(gòu)</A><BR>
<A href="http://www.sun126.com/perl5/perl5-9.htm#10.3">3、樹(shù)</A><BR><BR><A
name=1>一、數(shù)組變量的限制</A><BR> 在前面講的數(shù)組變量中,可以通過(guò)下標(biāo)訪問(wèn)其中的元素。例如,下列語(yǔ)句訪問(wèn)數(shù)組@array的第三個(gè)元素:<BR> $scalar
=
$array[2];<BR> 雖然數(shù)組很有用,但它們有一個(gè)顯著缺陷,即很難記住哪個(gè)元素存貯的什么內(nèi)容。假如我們來(lái)寫(xiě)一個(gè)程序計(jì)算某文件中首字母大寫(xiě)的單詞出現(xiàn)的次數(shù),用數(shù)組來(lái)實(shí)現(xiàn)就比較困難,程序代碼如下:
</P>
<BLOCKQUOTE>
<P>1 : #!/usr/local/bin/perl<BR>2 :<BR>3 : while ($inputline =
<STDIN>) {<BR>4 : while ($inputline =~ /\b[A-Z]\S+/g)
{<BR>5 : $word = $&;<BR>6 : $word =~
s/[;.,:-]$//; # remove punctuation<BR>7 : for ($count = 1;
$count <= @wordlist;<BR>8 : $count++)
{<BR>9 : $found = 0;<BR>10: if
($wordlist[$count-1] eq $word) {<BR>11:
$found = 1;<BR>12: $wordcount[$count-1] +=
1;<BR>13: last;<BR>14:
}<BR>15: }<BR>16: if ($found == 0) {<BR>17:
$oldlength = @wordlist;<BR>18:
$wordlist[$oldlength] = $word;<BR>19:
$wordcount[$oldlength] = 1;<BR>20: }<BR>21:
}<BR>22: }<BR>23: print ("Capitalized words and number of
occurrences:\n");<BR>24: for ($count = 1; $count <= @wordlist;
$count++) {<BR>25: print ("$wordlist[$count-1]:
$wordcount[$count-1]\n");<BR>26: }</P></BLOCKQUOTE>
<P> 運(yùn)行結(jié)果如下:<BR></P>
<BLOCKQUOTE>
<P>Here is a line of Input.<BR>This Input contains some Capitalized
words.<BR>^D<BR>Capitalized words and number of occurrences:<BR>Here:
1<BR>Input: 2<BR>This: 1<BR>Capitalized: 1 </P></BLOCKQUOTE>
<P> 這個(gè)程序每次從標(biāo)準(zhǔn)輸入文件讀一行文字,第四行起的循環(huán)匹配每行中首字母大寫(xiě)的單詞,每找到一個(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è)新元素。<BR><BR><A
name=2>二、定義</A><BR> 正如你所看到的,使用數(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í)間的。<BR> 這些問(wèn)題產(chǎn)生的原因是數(shù)組元素通過(guò)數(shù)字下標(biāo)訪問(wèn),為了解決這類(lèi)問(wèn)題,Perl定義了另一種數(shù)組,可以用任意簡(jiǎn)單變量值來(lái)訪問(wèn)其元素,這種數(shù)組叫做關(guān)聯(lián)數(shù)組,也叫哈希表。<BR> 為了區(qū)分關(guān)聯(lián)數(shù)組變量與普通的數(shù)組變量,Perl使用%作為其首字符,而數(shù)組變量以@打頭。與其它變量名一樣,%后的第一個(gè)字符必須為字母,后續(xù)字符可以為字母、數(shù)字或下劃線。<BR><BR><A
name=3>三、訪問(wèn)關(guān)聯(lián)數(shù)組的元素</A><BR> 關(guān)聯(lián)數(shù)組的下標(biāo)可以為任何簡(jiǎn)單/標(biāo)量值,訪問(wèn)單個(gè)元素時(shí)以$符號(hào)打頭,下標(biāo)用大括號(hào)圍起來(lái)。例如:
</P>
<BLOCKQUOTE>
<P>$fruit{"bananas"}<BR>$number{3.14159}<BR>$integer{-7} </P></BLOCKQUOTE>
<P> 簡(jiǎn)單變量也可作為下標(biāo),如:<BR> $fruit{$my_fruit}<BR><BR><A
name=4>四、增加元素</A><BR> 創(chuàng)建一個(gè)關(guān)聯(lián)數(shù)組元素最簡(jiǎn)單的方法是賦值,如語(yǔ)句$fruit{"bananas"}
= 1;
把1賦給關(guān)聯(lián)數(shù)組%fruit下標(biāo)為bananas的元素,如果該元素不存在,則被創(chuàng)建,如果數(shù)組%fruit從未使用過(guò),也被創(chuàng)建。<BR> 這一特性使得關(guān)聯(lián)數(shù)組很容易用于計(jì)數(shù)。下面我們用關(guān)聯(lián)數(shù)組改寫(xiě)上面的程序,注意實(shí)現(xiàn)同樣的功能此程序簡(jiǎn)化了許多。<BR></P>
<BLOCKQUOTE>
<P>1 : #!/usr/local/bin/perl<BR>2 :<BR>3 : while ($inputline = <STDIN>)
{<BR>4 : while ($inputline =~ /\b[A-Z]\S+/g) {<BR>5 :
$word = $&;<BR>6 : $word =~ s/[;.,:-]$//; #
remove punctuation<BR>7 : $wordlist{$word} += 1;<BR>8 :
}<BR>9 : }<BR>10: print ("Capitalized words and number of
occurrences:\n");<BR>11: foreach $capword (keys(%wordlist)) {<BR>12:
print ("$capword: $wordlist{$capword}\n");<BR>13: }
</P></BLOCKQUOTE>
<P> 運(yùn)行結(jié)果如下:<BR></P>
<BLOCKQUOTE>
<P>Here is a line of Input.<BR>This Input contains some Capitalized
words.<BR>^D<BR>Capitalized words and number of occurrences:<BR>This:
1<BR>Input: 2<BR>Here: 1<BR>Capitalized: 1 </P></BLOCKQUOTE>
<P> 你可以看到,這次程序簡(jiǎn)單多了,讀取輸入并存貯各單詞數(shù)目從20行減少到了7行。<BR> 本程序用關(guān)聯(lián)數(shù)組%wordlist跟蹤首字母大寫(xiě)的單詞,下標(biāo)就用單詞本身,元素值為該單詞出現(xiàn)的次數(shù)。第11行使用了內(nèi)嵌函數(shù)keys()。這個(gè)函數(shù)返回關(guān)聯(lián)數(shù)組的下標(biāo)列表,foreach語(yǔ)句就用此列表循環(huán)。<BR> 注:關(guān)聯(lián)數(shù)組總是隨機(jī)存貯的,因此當(dāng)你用keys()訪問(wèn)其所有元素時(shí),不保證元素以任何順序出現(xiàn),特別值得一提的是,它們不會(huì)以被創(chuàng)建的順序出現(xiàn)。<BR> 要想控制關(guān)聯(lián)數(shù)組元素出現(xiàn)的次序,可以用sort()函數(shù)對(duì)keys()返回值進(jìn)行排列,如:
</P>
<BLOCKQUOTE>
<P>foreach $capword (sort keys(%wordlist)) {<BR> print ("$capword:
$wordlist{$capword}\n");<BR>} </P></BLOCKQUOTE>
<P><A name=5></A><FONT
color=#003300>五、創(chuàng)建關(guān)聯(lián)數(shù)組</FONT><BR> 可以用單個(gè)賦值語(yǔ)句創(chuàng)建關(guān)聯(lián)數(shù)組,如:<BR> %fruit
=
("apples",17,"bananas",9,"oranges","none");<BR> 此語(yǔ)句創(chuàng)建的關(guān)聯(lián)數(shù)組含有下面三個(gè)元素:
</P>
<BLOCKQUOTE>
<UL>
<LI>下標(biāo)為apples的元素,值為17
<LI>下標(biāo)為bananas的元素,值為9
<LI>下標(biāo)為oranges的元素,值為none </LI></UL></BLOCKQUOTE>
<P> 注:用列表給關(guān)聯(lián)數(shù)組賦值時(shí),Perl5允許使用"=>"或","來(lái)分隔下標(biāo)與值,用"=>"可讀性更好些,上面語(yǔ)句等效于:<BR> %fruit
= ("apples"=>17,"bananas"=>9,"oranges"=>"none");<BR><BR><A
name=6>六、從數(shù)組變量復(fù)制到關(guān)聯(lián)數(shù)組</A><BR> 與列表一樣,也可以通過(guò)數(shù)組變量創(chuàng)建關(guān)聯(lián)數(shù)組,當(dāng)然,其元素?cái)?shù)目應(yīng)該為偶數(shù),如:<BR> @fruit
=
("apples",17,"bananas",9,"oranges","none");<BR> %fruit
=
@fruit;<BR> 反之,可以把關(guān)聯(lián)數(shù)組賦給數(shù)組變量,如:<BR> %fruit
= ("grapes",11,"lemons",27);<BR> @fruit =
%fruit;<BR> 注意,此語(yǔ)句中元素次序未定義,那么數(shù)組變量@fruit可能為("grapes",11,"lemons",27)或("lemons",27,"grapes",11)。<BR> 關(guān)聯(lián)數(shù)組變量之間可以直接賦值,如:%fruit2
= %fruit1;
還可以把數(shù)組變量同時(shí)賦給一些簡(jiǎn)單變量和一個(gè)關(guān)聯(lián)數(shù)組變量,如:<BR> ($var1, $var2,
%myarray) =
@list;<BR> 此語(yǔ)句把@list的第一個(gè)元素賦給$var1,第二個(gè)賦給$var2,其余的賦給%myarray。<BR> 最后,關(guān)聯(lián)數(shù)組可以通過(guò)返回值為列表的內(nèi)嵌函數(shù)或用戶定義的子程序來(lái)創(chuàng)建,下例中把split()函數(shù)的返回值--一個(gè)列表--賦給一個(gè)關(guān)聯(lián)數(shù)組變量。
</P>
<BLOCKQUOTE>
<P>1: #!/usr/local/bin/perl<BR>2:<BR>3: $inputline =
<STDIN>;<BR>4: $inputline =~ s/^\s+|\s+\n$//g;<BR>5: %fruit =
split(/\s+/, $inputline);<BR>6: print ("Number of bananas:
$fruit{\"bananas\"}\n"); </P></BLOCKQUOTE>
<P> 運(yùn)行結(jié)果如下: </P>
<BLOCKQUOTE>
<P>oranges 5 apples 7 bananas 11 cherries 6<BR>Number of bananas: 11
</P></BLOCKQUOTE>
<P><A name=7></A><FONT
color=#003300>七、元素的增刪</FONT><BR> 增加元素已經(jīng)講過(guò),可以通過(guò)給一個(gè)未出現(xiàn)過(guò)的元素賦值來(lái)向關(guān)聯(lián)數(shù)組中增加新元素,如$fruit{"lime"}
=
1;創(chuàng)建下標(biāo)為lime、值為1的新元素。<BR> 刪除元素的方法是用內(nèi)嵌函數(shù)delete,如欲刪除上述元素,則:<BR> delete
($fruit{"lime"});<BR>注意: </P>
<BLOCKQUOTE>
<P>1、一定要使用delete函數(shù)來(lái)刪除關(guān)聯(lián)數(shù)組的元素,這是唯一的方法。<BR>2、一定不要對(duì)關(guān)聯(lián)數(shù)組使用內(nèi)嵌函數(shù)push、pop、shift及splice,因?yàn)槠湓匚恢檬请S機(jī)的。 </P></BLOCKQUOTE>
<P><A name=8></A><FONT
color=#003333>八、列出數(shù)組的索引和值</FONT><BR> 上面已經(jīng)提到,keys()函數(shù)返回關(guān)聯(lián)數(shù)組下標(biāo)的列表,如:<BR></P>
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -