hash類型也稱爲字典、關聯數組、映射(map)等等,其實它們都是同一種東西:鍵值對。每個Key對應一個Value。數組
%
表示hash類型,如%myhash
。使用$hashname{index}
訪問hash中的元素{鍵1,值1,鍵2,值2...}
=>
)替代逗號,讓整個hash看起來很清晰$phone_num{longshuai}="18012345678"; $phone_num{xiaofang}="17012345678"; $phone_num{fairy}="16012345678";
等價於如下幾種方式:函數
%phone_num1=("longshuai","18012345678", # 注意是括號,不是大括號 "xiaofang","17012345678", "fairy","16012345678"); my %phone_num1=("longshuai" => "18012345678", # 將hash聲明爲局部hash "xiaofang" => "17012345678", "fairy" => "16012345678");
$phone_num{"longshuai"}
和$phone_num{longshuai}
都有效%phone_num1=(longshuai =>"18012345678", xiaofang =>"17012345678", fairy =>"16012345678");
若是key命名不夠規範,則不會自動加上引號。有時候,這可能會看成一個表達式進行計算:操作系統
$myhash{foo.bar} # $myhash{foobar}
%hash_name1 = %hash_name2;
Perl中的這個賦值過程和通常語言不太同樣,它會先將%hash_name2
展開成列表,而後再將這個列表賦值給新列表%hash_name1
。code
print %myhash
,但不能加上引號,例如print "%myhash"
不會輸出hash裏的元素%myhash = (key1,value1,key2,value2,key3,value3); print %myhash,"\n"; print "%myhash","\n";
print $ENV{PATH}; # 輸出操做系統的PATH環境變量
若是perl想訪問操做系統中某個變量,能夠直接在操做系統中設置,而後經過perl訪問:索引
$ myvar=2;export myvar; print $ENV{myvar};
主要有reverse()、keys()、values()、exists()和delete()。字符串
(key1,value1,key2,value2,key3,value3)
反轉過程當中:hash
(value3,key3,value2,key2,value1,key1)
反轉後新的hash可能之一:變量
(value2,key2,value1,key1,value3,key3)
由於反轉爲新的hash時,是以原來的value看成新的key,因此可能會有重複的新key,perl採起的是覆蓋生效:後存儲的覆蓋先存儲的。foreach
再者,反轉爲新的hash時,會對新的key從新hash計算存儲到hash桶裏,因此反轉後的順序不必定真的是反序的。這裏的reverse更注重key/value的反轉。perl
%myhash = (key1,value1,key2,value2,key3,value3); @keys = keys %myhash; @values = values %myhash; $keys_num = keys %myhash; print @keys,"\n"; print @values,"\n"; print $keys_num,"\n"; # 返回3
顯然,key列表和value列表的順序和存儲的順序多是不一致的,但至少keys函數返回的列表中,若是key1排在最前,那麼values函數返回的列表中,value1也確定排在最前
if(%hash){ print "True\n"; }
%myhash = (key1,value1,key2,value2,key3,value3); # each迭代遍歷 while (($key,$value) = each %myhash){ print "$key: $value","\n"; } # foreach迭代遍歷 foreach my $key (sort keys %myhash){ print $key,$myhash{$key},"\n"; }
須要注意的是each遍歷,是不保證順序的,foreach能夠按照必定keys的順序進行遍歷。另外,在上面while each迭代的過程當中,有幾個過程:
each %myhash
首先迭代第一個鍵值對;($key,$value)
;while
的條件真假,由於賦值後獲得的是一個包含鍵、值的列表,在while的標量上下文中,它返回列表中元素數量2,因此爲真;