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,因此为真;