Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15632
  • 博文数量: 7
  • 博客积分: 390
  • 博客等级: 一等列兵
  • 技术积分: 95
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-07 00:31
文章分类

全部博文(7)

文章存档

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....

阅读(1213) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~