哈希是一種先進的數組形式。數組的限製之一是,它所包含的信息是很難獲得的。例如,想象一下,你有一個人的名單和他們的年齡.
哈希解決了這個問題,非常整齊,讓我們的訪問,不是由一個指數,而是由一個標量的關鍵,@ages數組。例如使用不同的人的年齡,我們可以使用他們的名字作為重點來定義一個哈希.
%ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29,); print "Rikke is $ages{Rikke} years old\n"; This will produce following result Rikke is 29 years old
哈希創建兩種方式之一。在第一,你分配一個由一對一的基礎上,以一個名為鍵的值:
$ages{Martin} = 28;
在第二種情況下,你使用的名單,這是由個人對從列表轉換:對第一個元素被用作鍵和第二作為值。例如,
%hash = ('Fred' , 'Flintstone', 'Barney', 'Rubble');
為清楚起見,你可以使用=>一個彆名,表示鍵/值對:
%hash = ('Fred' => 'Flintstone', 'Barney' => 'Rubble');
你可以從散列中提取單個元素,通過指定為你想要的值,括號內的關鍵字:
print $hash{Fred}; This will print following result Flintstone
您可以提取哈希片,就像你可以從一個數組中提取切片。然而,你需要使用@前綴,因為返回值將是一個對應值的列表:
#!/uer/bin/perl %hash = (-Fred => 'Flintstone', -Barney => 'Rubble'); print join("\n",@hash{-Fred,-Barney}); This will produce following result Flintstone Rubble
注: 使用$hash{-Fred, -Barney} 將無任何返回.
你可以通過使用密鑰哈希鍵的列表:
#!/usr/bin/perl %ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29); print "The following are in the DB: ",join(', ',values %ages),"\n"; This will produce following result The following are in the DB: 29, 28, 35
這些可以是有用的循環中,當你想打印所有哈希的內容:
#!/usr/bin/perl %ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29); foreach $key (%ages) { print "$key is $ages{$key} years old\n"; } This will produce following result - www.gitbook.net Rikke is 29 years old 29 is years old Martin is 28 years old 28 is years old Sharon is 35 years old 35 is years old
這種方法的問題是,(%age)返回一個值的列表。因此,要解決這個問題,我們每個函數將返回鍵和值對,下麵將給出
#!/usr/bin/perl %ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29); while (($key, $value) = each %ages) { print "$key is $ages{$key} years old\n"; } This will produce following result Rikke is 29 years old Martin is 28 years old Sharon is 35 years old
如果你嘗試訪問哈希未含存在的鍵/值對,你通常未定義的值,如果你有開啟的警告,然後你在運行時產生的警告。通過使用存在的函數,返回true,如果存在命名的鍵,不論它的價值可能是什麼,你可以解決這個問題:
#!/usr/bin/perl %ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29); if (exists($ages{"mohammad"})) { print "mohammad if $ages{$name} years old\n"; } else { print "I don't know the age of mohammad\n - by www.gitbook.net"; } This will produce following result I don't know the age of mohammad
冇有辦法簡單地保證鍵,值,或鍵/值對列表的順序將永遠是相同的。事實上,它不是最好的甚至要依靠計算兩個連續之間的順序:
#!/usr/bin/perl print(join(', ',keys %hash),"\n"); print(join(', ',keys %hash),"\n");
如果你想保證順序,使用排序,例如:
print(join(', ',sort keys %hash),"\n");
如果您正在訪問哈希多次,要使用相同的順序,考慮建立一個單一的數組來保存排序的序列,然後使用數組(這將留在排序順序)遍曆哈希。例如:
my @sortorder = sort keys %hash; foreach my $key (@sortorder)
你的大小 - 使用任一鍵或值的標量上下文從一個哈希 - 也就是說,元素的數目:
#!/usr/bin/perl %ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29); print "Hash size: ",scalar keys %ages,"\n"; This will produce following result Hash size: 3
可以做一個使用簡單的賦值操作符的代碼行添加一個新的鍵/值對。但是從哈希中刪除一個元素,你需要使用刪除功能.
#!/usr/bin/perl
%ages = ('Martin' => 28, 'Sharon' => 35, 'Rikke' => 29);
# Add one more element in the hash
$age{'John'} = 40;
# Remove one element from the hash
delete( $age{'Sharon'} );