perl學習日記6哈希

1.    哈希

思考hash 的方法是,把它看作一堆數據(a barrel of data)(參見6-2),每一個數據都有一個相應的標籤。可以通過標籤訪問此標籤對應的元素。但其中是沒有“第一個”元素的概念的。在數組中,數組元素從0,1,開始編號。但在hash中,沒有確定的順序,因此也沒有第一個元素。只是一些key/value 對的集合。

keys values 均爲任意的標量,但keys 通常轉換爲字符串。因此,如果將表達式50/20 作爲keys◆,則其通常被轉換爲3字符的字符串2.5。這是上圖中的一個key

1.1      爲什麼使用Hash?

1.2      哈希元素的存取

$hash{$some_key}

$family_name{“fred”} = “flintstone”;

$family_name{“barney”} = “rubble”

 

Hash key 可以是任意的表達式:

$foo = “bar”

print $family_name{$foo . “ney”}; #輸出“rubble”

當將某個值存儲在已經存在的hash 元素中,以前的值會被覆蓋

$family_name{“wilma”} = “flintstone”; #新增或者替換已有的hash對,一個key(也包括value)

$family_name{“betty”} .= $family_name{“barney”}; #創建一個新元素,如果原來有則追加後賦值,如果沒有則直接創建

訪問不存在的hash 元素得到undef

1.2.1.      作爲整體的hash

%family_name

%some_hash = (“foo”, 35, “bar”, 12.4, 2.5, “hello”, “wilma”, 1.72e30, “betty”, “bye/n”);#個數需偶,否則會警告

@array_array = %some_hash;# 我們把這稱爲:將hash 展開,並將其key/value 對返回到一個列表中。返回的key/value順序和存放的順序可能不同

1.2.2.Hash 賦值

%new_hash = %old_hash;#不常用,因爲效率較低

%inverse_hash = reverse %any_hash;#反轉hash,值和key對調,但是最好你能確定原值是唯一的,否則系統採用覆蓋的方式賦值,而hash又無序,所以你根本不知道到底誰覆蓋了誰。

 

1.2.3.大箭頭符號(=>

my %last_name = (

“fred” => “flintstone”,

“dino” => undef,

“barney”=> “rubble”;

“betty”=> “rubble”,

);

1.3      哈希函數

1.3.1.keys values 函數

keys 函數會返回此hash 的所有keysvalues 函數將返回所有的values

my %hash = (“a”=>1, “b”=>2, “c”=>3);

my @k = keys %hash;

my @v = values %hash;

此時他們的順序用戶是不能控制的,一旦再有對添加,順序就會改變,但是如果a是第一個,那麼1就也是第一個

my $count = keys %hash; #得到3,是指有key/value 對,因爲此時的上下文是數字標量

 

1.3.2.each 函數

while (($key, $value) = each %hash){

print “$key => $value/n”;

}

還可以對返回的key數組進行排序

foreach $key (sort keys %hash){

$value =$hass{$key};

print “$key => $value/n”;

#也可以不使用額外的臨時變量$value

#print “$key => $hash{key}/n”;

}

1.4      哈希的通常用法

$books{“fred”} = 3;

$books{“wilma”} = 1;

很容易知道hash 的某個元素是true 還是false,像下面這樣:

if($books{$someone}){

print “$someone has at least one book checked out./n”;

}

1.4.1.exists 函數(上面是判斷有沒有值,現在是判斷有沒有key

if(exists $books{$dino}){

print “Hey, there’s a libaray card for dino!/n”;

}

1.4.2.delete 函數

delete 函數將某個給定的key(包括其對應的value)從hash 中刪除。

my $person = “betty”;

delete $books{$person}; #$person 的借書卡刪除掉

1.4.3.hash 元素的內插

foreach $person (sort keys %books){

if($books{$person}){

print “$person has $books{$person} items/n” #fred 有3個

}

}

但不支持整個hash 的內插;%books僅是六個不同的字符%books

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章