2009年(7)
分类:
2009-07-09 21:21:19
哈希hash in Perl
哈希-一种数据结构,可存值可取值.和数组的区别在于:数组以数字编号作为索引,哈希以任意且唯一的字串作为索引标示,其称为key.代表了元素的名字.
hash: key/value对的集合,无顺序可言.
作为key,它必须是保持唯一性.value是可以重复的.
访问hash元素
$hash{$key} #花括号!
$family_name{"li"}="happy";
与数组和列表相同的是:
1.存入新值覆盖老值。
2.访问不存在的hash 元素得到undef。
作为整体的hash
%hash
给hash赋值,类型为列表context,列表必须是key/value对的集合,所以元素个数为偶数。
%family=("father",baba,"mother","mama","sun","me");
hash 和列表可以相互转换,上例为列表转hash
hash转列表称为hash展开。展开后得到的列表元素顺序可能很混乱(和hash的k/v对不一致),但这就是hash的无顺序特征。
用hash给hash赋值
这种操作不多用因为很容易出错。
%new_hash=%old_hash; #old_hash被展开成key/value对的列表,然后一个一个加入到new_hash里
=> 大箭头
my %family=("father"=>"baba","mother"=>"mama","sun"=>"me",);
更清楚地表明who is key, and who is value....
关于hash函数
keys函数,values函数:
my %hash = (“a”=>1, “b”=>2, “c”=>3);
my @k = keys %hash; #a,b,c
= values %hash; #1,2,3
两个函数返回的结果顺序可能和最初hash的顺序不一致,但keys出来和values出来的顺序肯定是一一对应的(废话).
each函数,取出hash中的key/value对
while (($key, $value) = each %hash){ #条件判断在标量context,其返回元素个数,很明显这里是2个。2为true(非0),进入while.
print “$key => $value\n”;
}
exist函数
check hash中是否有某个key,有返回true,没有就false,(有key但不一定有value,value也可以存undef)
if(exists $books{"li"}){
print "There is a man called li";
}
delete函数
给定key名,删除其key,以及对应的value from hash.
delete $books("li"); #若没有key=li的元素,不做操作
hash支持单元素的双引号内插,但不支持整个%hash内插,诸多原因,比如%用于printf....