Perl筆記 05 雜湊

2021-06-18 18:04:15 字數 3284 閱讀 3586

雜湊是一種資料結構,和陣列相比

相同在於:可以容納很多值(沒有上限),並能隨機訪問。

區別在於:不像陣列是以數字來檢索,雜湊是以名字來檢索。也就是說檢索用的鍵不是數字,而是保證唯一的字串

所謂鍵其實就是字串,所以我們不必用數字3來獲取陣列元素,而是用vilma這個名字來訪問雜湊元素。

這些鍵可以是任何字串……你可以用任意字串表示式作為雜湊鍵。它們也必須是唯一的字串,就像陣列中只能有乙個編號為3的元素一樣。

雜湊的鍵與值

另一種看待雜湊的方法是將它想象成一大桶的資料,其中每個資料都有關聯的標籤,可以伸手到桶裡任意取出一張標籤,檢視它附著的資料時什麼。但是在桶裡沒有所謂的第乙個元素,只有一堆資料。陣列中有第乙個元素0,但在雜湊裡沒有順序,只有一些鍵/值對。如下圖:

雜湊像一桶資料

這些鍵和值都是任意的標量,但會被轉換成字串,如50/20為鍵,那麼他會轉換成含有三個字元的字串「2.5」。

根據perl「去除不必要限制」的原則,雜湊可能是任意大小,從沒有任何鍵/值的空雜湊到填滿整個記憶體的雜湊都可以。由於perl針對雜湊的演算法優化,與替他語言不通,perl在操作含有三個鍵值的雜湊和操作三百萬個鍵值的雜湊速度是一樣的。

要訪問雜湊元素,需要使用如下語法:

$hash

這和訪問陣列的做法類似,只是使用了花括號而非方括號來引出索引。而且現在的鍵表示式是字串,而非數字:

$family_name

="flintstone"

;$family_name

="rubble";

我們可以在程式中這樣訪問雜湊:

foreach

$person

(qw < barney fred

>

).\n";}

雜湊變數的命名和其它perl的識別符號類似,可以有字母、數字和下劃線,但不可以用數字開頭。雜湊有自己的命名空間,也就是說程式中可以定義同名的雜湊,子程式,或陣列,但按照正常人的思維方式還是不要這樣辦的好。

要指代整個雜湊,可以用百分號(%)作為字首。因此前面我們使用的雜湊應該稱之為�mily_name

為了方便起見,雜湊可以轉換成列表,反過來也行。但當列表轉為雜湊時一定要確保列表中的元素為偶數個,否則的話會產生奇怪的結果。

my%last_name=(

# 雜湊也可以是詞法變數

"fred"

=>

"flintstone"

,"dino"

=>

undef

,"barney"

=>

"rubble"

,"betty"

=>

"rubble",)

; 這樣的賦值清晰明了。列表結尾有乙個額外的逗號,這種寫法不但無傷大雅,而且便於維護。但需要加入更多人的資訊時,只要確保每行都有一組鍵/值對和結尾的逗號就可以了。

keys和values函式

keys函式能返回雜湊的鍵列表,而values函式返回值列表。如果雜湊沒有任何成員,則兩個函式都返回空列表:

my%hash=(

"a"=>1,

"b"=>2,

"c"=3,

);my@k

=keys

%hash;my

@v=values

%hash;

這樣,@k包含「a」,「b」,「c」,而@v則會包含1,2,和3。需要注意,順序可能會不同,別忘了perl儲存雜湊的順序無法**。但可以確定的是返回的鍵列表和值列表的順序是一樣的。在標量上下文中這兩個函式都會返回雜湊中鍵/值對兒的個數。這個計算過程不必對整個雜湊進行遍歷,因而非常高效:

my $count = keys %hash; # 得到 3,也就是說有三對兒鍵值

偶爾也能看到別人的程式裡把雜湊當成布林表示式來判斷真假,如下:if(

%hash)

只要雜湊中有乙個鍵/值對,就返回真。所以,這裡的意思是如果雜湊不為空就列印輸出。這種寫法很少見。

each函式

如果要羅列雜湊的每個鍵/值對,可以使用each函式。它可以用兩個元素的列表形式返回鍵/值對。每一次對同乙個雜湊呼叫此函式,他就會返回下一組鍵/值對,直到所有的元素都被訪問過。也就是再沒有任何新的鍵/值對,此時each會返回空列表。

實際使用時,唯一適合使用each的地方就是在while迴圈中,如下:

while((

$key

,$value)=

each

%hash)

這裡有很多的操作,首先,each %hash會從雜湊中返回一組鍵/值對,結果是含有兩個元素的列表。該列表會賦值給($key,$value)。while迴圈中每次會從%hash取出一對資料賦值給$key,$value 如果到最後沒有內容了,這兩個變數的就會賦值為undef,預設情況下undef的值為0,因此這時候while就會終止迴圈了。當然each返回鍵/值對的順序是亂的,也就是說和我先前賦值的時候順序是不一致的。但它與keys和values返回的順序相同,也就是雜湊的自然順序。那如果要想對雜湊排序怎麼辦呢,只要對鍵排序就行了。如下方法:

foreach

$key

(sort

keys

%hash);

print

"$key=> $value\n"

;# 或者可以省略變數$value

# print "$key=>$hash\n";}

exists函式

若要檢查哈戲中是否有某個鍵,可以使用exists函式,它能返回真或假,分別表示鍵存在與否,和鍵對應的值無關:if(

exists

$books)

也就是說,exists $books返回真,意味著dino存在於keys %books返回的鍵列表中。

delete函式

該函式可以刪除雜湊中指定的鍵以及其對應的值。如果沒有該鍵,則會直接結束,不會出現仍和的警告資訊。

雜湊值內插

可以將單一雜湊元素內插到雙引號引起的字串中:

foreach

$person

(sort

keys

%books))

items\n";}

} 但整個雜湊的內插是不支援的,"$books"的結果只是6個字元的串 %books

%evn雜湊

perl既然是允許在系統中,那麼它就有必要知道當前系統的一些環境。perl是利用%env雜湊來儲存這些資訊的。例如在%env中訪問path鍵的值:

print

"path is $evn\n";

因此在perl中可以從$env 中得到系統環境中的變數。

Perl自學(05) 雜湊

本文參考部落格 對於資料儲存而言個人鍵值對可以說是很多場景,更是費長方便的儲存方式,要遠遠比傳統的數字索引的方式通過陣列處理資料的要方便很多很多的。下面介紹 perl 中的雜湊。雜湊是 perl 的一種資料型別,比較類似陣列,用於存放資料,包括2部分關鍵字keys和值value 即鍵值對 不同於傳統...

Perl 學習筆記 05

1 鍵盤輸入 2 所有輸入 3 argv argv儲存輸入的所有引數 4 printf 符號意義 g輸出數字 d十進位制整數 x十六進製制 o八進位制 s字串 f截尾 輸出百分比 5 控制代碼 檔案控制代碼,所有字母大寫。但不能和系統內建的衝突 stdin stdout stderr data ar...

perl 雜湊 hash 學習筆記( )

1.什麼是雜湊 雜湊是perl的一種資料型別,比較類似陣列,用於存放資料,包括2部分關鍵字keys和值value。不同於陣列,雜湊訪問元素的是按照名字訪問標量的key value.hash 用 來標示 2.hash 操作 a.增加 my hash 定義 第一種寫法 hash young author...