1. 哈希
思考hash 的方法是,把它看作一堆數據(a barrel of data)(參見圖6-2),每一個數據都有一個相應的標籤。可以通過標籤訪問此標籤對應的元素。但其中是沒有“第一個”元素的概念的。在數組中,數組元素從0,1,2 開始編號。但在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 的所有keys,values 函數將返回所有的values
my %hash = (“a”=>1, “b”=>2, “c”=>3);
my @k = keys %hash;
my @v = values %hash;
此時他們的順序用戶是不能控制的,一旦再有對添加,順序就會改變,但是如果a是第一個,那麼1就也是第一個
my $count = keys %hash; #得到3,是指有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