哈希可看做一种特殊的数组,特殊之处在于哈希采用key来索引,而数组用位置序号来索引
哈希变量用%a表示,初始化格式如下:
$a{key} = value; //初始化只含一个key-value对的哈希
%a = ( key1, value1, key2, value2, ... );
%a = ( key1 => value1, key2 => value2, .... ); //上面两种初始化方法效果相同,但后者可读性更好
$a{key} //和数组类似,取单个元素时使用$符号
Perl提供了两个函数keys和values,分别返回哈希的key列表和value列表,如
@keys = keys %a;
@values = values %a;
另外还有一个reverse函数,作用是将哈希中的key和value对调,以value来索引key(由于value不一定唯一,故reverse操作可能会引起冲突)
Perl还提供了exists和delete两个函数,分别用于判断元素是否存在和删除元素,如
print "exist!" if(exists $a{key}); //若存在则exists函数返回true,否则返回false
delete $a{key}; //删除%a中对应key的元素
若要清空整个哈希,简单地使用下面这条语句即可:
%a = ();
总之牢记两条准则:
- 对于数组和哈希,若进行整体操作,则分别使用@和%;若进行单个元素操作,则均使用$,此时Perl会根据后跟的中括号[]和花括号{}识别出数据类型
- 哈希是一种特殊的数组
哈希的一些应用
1.确定文本中各单词的频率分布
while(<>){
while(/(/w[/w-]*)/g){
$times{$1}++; //$1对应模式匹配中圆括号包围的部分
}
}
生成的哈希%times的key为单词,value为对应的出现次数
2.去掉数组中的重复元素
@fish = qw(one fish two fish red fish blue fish);
foreach (@fish){
$tmp{$_} = 1; //这儿只是为了将多个数组元素对应为单个哈希元素,至于赋值没有意义
}
@uniq_fish = keys tmp;
3.获得两个数组的交集
@a = qw(1 2 3 4 5);
@b = qw(3 4 5 6 7);
foreach (@a){
$tmp{$_} = 1; //此处将@a转换为%tmp是为了在后面使用exists函数
}
@intersection = grep exists $tmp{$_} @b; //grep函数判断@b中的元素是否在%tmp中同样存在,若存在,则返回该元素的值并赋给@intersection