標籤:hash perl
【本文原創,未經允許請勿轉載】
雜湊是一種資料結構,它和數組的相似之處在於可以容納任意多的值並能按需取用,而它和數組的不同在於索引方式,數組是以數字來索引,雜湊則以名字來索引。也就是說,雜湊的索引值,此處稱為鍵(key),並不是數字,而是任意唯一的字串。但它也必須是唯一的字串。
我們也可以這麼看待雜湊,試將它想象成一大桶資料,其中每個資料都有關聯的標籤。你可以伸手到桶裡任意取出一張標籤,看它上面附著的資料是什麼。但是桶裡沒有所謂的“第一個”元素,只有一堆資料。是鍵-值對的集合。
要訪問hash元素,需要使用如下文法:
這和訪問數組的做法類似,只是使用了花括弧而非方括弧來表示索引值(雜湊鍵),訪問雜湊表裡不存在的值會得到undef。
要指代整個雜湊,可以用百分比符號(%)作為首碼。雜湊可以被轉成列表,反之亦然。對雜湊賦值等同於在列表上下文中賦值,列表中的元素應該為鍵-值對。可以將雜湊表變成鍵-值對列表。當然,得到的鍵-值對不一定是按照當初賦值時的順序展開。因此選擇使用雜湊的場合,要麼元素儲存順序無關緊要,要麼可以容易地在元素輸出時進行排序。
雜湊賦值:
這會將%any_hash展開成為鍵-值對列表,看起來是(key,value,key,value,...)這樣。然後利用reverse的列表翻轉功能形成一個(value,key,value,key,...)這樣的新列表,鍵值達成互換。
在將列表賦值到雜湊時常常會發現列表中的鍵-值對並不容易區分。所以引進了胖箭頭 =>
當需要加入更多的資訊的時候,只要確保每行都有一組鍵-值對和結尾的逗號就行了。同時上面的代碼可以簡寫為:
當然,也不是所有情況都可以這麼做,因為hash的鍵可以是任意形式的字串,所以要是某個鍵的內容看起來是Perl的操作符的話,就會出問題。還有一個常見的允許省略鍵名引號的地方:在花括弧中檢索特定鍵名的元素。
雜湊函數:keys函數能夠返回雜湊的鍵列表,而values函數能返回對應的值列表。
結果:
abc的順序會有所不同,但是返回的鍵列表和值列表的順序是一致的。在標量上下文中,這兩個函數都會返回雜湊中元素(鍵-值對)的個數。這個計算過程不必對整個雜湊進行遍曆,因而非常高效。
如果需要迭代(逐項處理其中的每一個元素)整個雜湊,常見的寫法就是用each函數,它可以包含兩個元素的列表的形式返回鍵-值對。
結果:
當Perl執行each%hash卻已經沒有任何鍵-值對時,each會返回空列表。
如果需要依次按順序處理雜湊,只要對鍵排序就行了:
結果:
若要檢查雜湊中是否存在某個鍵,可以使用exists函數,它能返回真或假,分別表示鍵存在與否,和鍵對應的值無關。
Delete函數能從雜湊中刪除指定的鍵以及相對應的值。假如沒有這樣的鍵,它就會直接結束,而不會出現任何警告或者錯誤訊息。
這與“將undef存入雜湊元素”並不相同。在這兩種情況下,exists($book{“betty”})會得出相反的結果。在delete之後,鍵便不會出現在雜湊之中,但存入undef後,鍵卻是一定會存在的。
Perl程式既然運行在某個環境中,就需要對周圍的環境有所感知。Perl訪問這些資訊的方法是訪問%ENV雜湊。
結果:
習題:
第一題:
結果:
如果打算使用my來聲明雜湊,則必須在聲明之後才可以對元素進行賦值。My操作符智能聲明獨立的變數,不能用來聲明數組或者雜湊裡的元素。
第二題:
結果:
附加:
結果:
第一個foreach迴圈會逐項處理各個單詞。該迴圈中包含了整個程式裡最重要的一行,它會將$count{$word}的值加上1,然後再存回$count{$word}。
第三題:
結果如下:
本章節加深了我對Hash表的理解和使用。在之後的Perl編程中會好好分析每個$和%的用法。感覺自己還很年輕啊。
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Perl Learning 5 Hash