Perl語言程式設計 雜湊

2021-08-31 19:53:19 字數 2575 閱讀 7502

在學習perl語言的過程中,遇到了乙個別的語言中並不常見的概念——雜湊。雜湊表並不是perl語言特有的資料結構,但是perl語言中的雜湊具有得天獨厚的優勢。雜湊與陣列非常相似,但是也有著非常明顯的不同。在乙個陣列當中,陣列的每乙個元素包含乙個值,同時每乙個元素都有它對應的下標。簡單些說,就是陣列是「值」與「陣列下標」之間的對應關係,其中值可以有任意情況(可以使空、未定義、數字、字串等等),而陣列下標務必是唯一的。而雜湊則是「鍵」與「值」之間的對應,我們可以把雜湊的「鍵」與陣列的「下標」進行模擬,它們的作用是相似的。雜湊的鍵是唯一的,而值則跟陣列一樣。它們之間的不同點在於,下標是從0開始遞增的自然數,而雜湊的鍵則是字串。對此我們可以引申出乙個事實——雜湊是沒有順序的。在雜湊中不存在陣列中所謂「第幾個元素」的概念,就好比是一對資料,每個資料都有對應的標籤,我們只能通過標籤去尋找資料,而無法通過「它是第幾個元素」來對資料進行定位。

對於雜湊的鍵,perl語言中的上下文起到了至關重要的作用。上文中提到過,雜湊的鍵都是字串,因此在程式執行的過程中,不同的上下文會對雜湊的鍵有不同的影響。例如,如果5/2存在於字串上下文中,並把它設定為雜湊的鍵的話,那麼這個雜湊的鍵為「5/2」;如果是在標量上下文中,則雜湊的鍵將會是這個標量的運算結果,即「2.5」。

如果要訪問雜湊元素,採用的語法為:

$hash
其中hash是雜湊表的名字,而some_key是鍵。對於perl語言而言,判斷乙個變數是否為雜湊的依據是「$符號後面有花括號」,也就是說,如果名稱之前有乙個美金符號,而名稱之後有花括號,那麼系統會認為自己訪問的是乙個雜湊元素。

如果要訪問整個雜湊表,可以用百分號(%)作為字首。perl程式會將雜湊轉換成列表(反之亦然)。對雜湊的每乙個賦值操作實際上就是再列表上下文中賦值,且列表中的元素為鍵-值對。舉乙個《learning perl》上的例子:

$some_hash = (

'foo', 35, 'bar', 12.4, 2.5, 'hello', 'wilma', 1.72e30, 'betty', 'bye\n'

)

當雜湊表被轉化為列表的時候,也就是在列表上下文中,這種轉化稱之為展開雜湊,不過需要注意的是,通過這個方法得到的鍵值對的順序不會是原來的順序,而是是刻意打亂的,這樣黑客就無法預知資訊是如何儲存的。一般選擇使用雜湊的場合,要麼元素儲存順序無關緊要,要麼可以容易地在元素輸出的時候進行排序。

雜湊賦值可以用一般的賦值語法來實現,不過使用更多的是利用胖箭頭。

如果要用一般的賦值語法來賦值,例如:

my %new_hash = %old_hash;
在執行這行**的時候,perl程式會先將%old_hash展開為鍵-值對,然後通過列表賦值重新構建每乙個鍵-值對,最終形成新的雜湊%new_hash。

另一種賦值方法是利用胖箭頭。本質上,這種賦值方法跟給陣列賦值一樣,只不過在給雜湊賦值的時候,鍵與值是交替出現的,也就是說我們得從頭開始計數,第奇數個為鍵,偶數個為值,這樣賦值會非常麻煩,而且容易出錯。胖箭頭在perl程式中是逗號的另一種寫法,如果用胖箭頭代替逗號,那麼整個賦值過程會變得非常清晰明了,我們也可以一眼看出來誰是鍵誰是值。例如:

#正常的賦值方法

%some_hash = ('foo', 35, 'bar', 12.4, 2.5, 'hello', 'wilma', 1.72e30, 'betty', "bye\n");

#使用胖箭頭賦值

%some_hash = (

'fred' => 'flintstone',

'dino' => undef,

'barney' => 'rubble',

'betty' => 'rubble',

);

不過胖箭頭跟逗號還是有細微差別的,胖箭頭左邊的任意裸字都會自動加上引號,因此胖箭頭左邊的裸字不需要加引號。

perl中有很多函式可以一次處理整個雜湊。

在列表上下文中,keys函式能返回雜湊的鍵列表;values函式可以返回雜湊的值列表。如果雜湊表為空,那麼這兩個函式都會返回空列表。雖然雜湊表中的元素的順序是不可**的,但是用這兩個函式返回的鍵列表和值列表的順序是能對應上的。只要在取得鍵與取得值這兩個動作之間不修改雜湊,那麼順序必然一致。在標量上下文中,這兩個函式都會返回雜湊中元素的個數。

如果需要迭代整個雜湊,那麼最快捷的方式就是用each函式。它會依次返回雜湊中的鍵值對。如果所有的元素都被訪問過,或者雜湊表是空的,那麼它就會返回空列表。在實戰中,最常用到each的地方就是while迴圈,例如:

while (($key, $value) = each %hash)
如果要檢查雜湊表中是否存在某個鍵,可以使用exists函式,它的返回值是布林變數,用來表示鍵值存在與否,而與鍵所對應的值無關。

delete函式可以用來從雜湊中刪除指定的鍵及其相對應的值。假如沒有這樣的鍵的話,它就會直接結束且不會報錯。例如:

my $person = "betty";

delete $books;

這個函式會把雜湊表展開成為鍵-值對列表,然後將鍵與值調換位置形成乙個新列表,從而得到乙個新的雜湊表。這個函式只能在確保值也是唯一的時候使用,否則重複的值中,後面的會覆蓋前面的,導致資料丟失。

Perl語言入門 雜湊

什麼是雜湊 雜湊是一種資料結構,類似與陣列,不同之處在於雜湊是用字串而非數字來檢索的 為什麼用雜湊 典型的雜湊應用有 按名字找姓 用主機名找ip位址 按ip位址找主機名 按單詞統計出現次數 按身份證號找出姓名等 訪問雜湊元素 語法為 hash 如 family name flintstone 雜湊元...

Perl 遍歷雜湊

我們在遍歷二維或多維的雜湊時,可以採用遞迴的方法.1.首先檢視每個value的值型別,如hash,array,還是簡單的標量 2.如果value的值型別是hash,則遞迴直到找到相應的array 或者標量 3.如果value的值型別是array,則通過迴圈列印出各個元素 4.如果value的值型別是...

Perl語言學習筆記 6 雜湊

1 雜湊的鍵是唯一的,值可以重複!2 訪問雜湊元素 hashname 雜湊為大括號,陣列為方括號,鍵為字串 family name firstd 給雜湊元素賦值 3 雜湊鍵支援任意表示式 foo na family name 獲取 family name對應的值 4 訪問整個雜湊 family na...