perl学习笔记四
第五章 散列 by reduta || basenet
什么是散列?
散列(hash)是一个数据结构,与数组相同的是它可以含有任意数目的值并随意读取它们。但与数组中由数字对值进行索引不同,散列用名字(name)查找值。也就是说,索引不再是数字,而是任意的惟一字符串,称之为键(key)。它是一桶数据,不存在第一项,它是一团糟的,随意的,没有固定的顺序。键总是被转成字符串,如用 数值50/20做键,它就会被变成“2.5”。
散列可以任意大小,从空散列直以填满内存。
在perl中巨大的散列并不可怕,从三个和三百万个键值对中取出一个数的速度差不了多少。
为什么要用散列
你有一组数据与另外一组数据相关。
如
名 姓 主机名 ip地址 ip地址 主机名 单词 单词出现的次数 用户名 用户使用的硬盘块数
驾照号码 名字 如果你的任务描述中包含“找到重复项”,“唯一的”,“交叉引用”,或“查表”之类的词语,那么散列就会在实现中很有用处。
散列元素访问
使用如下语法:
$hash{$some_key}
$a{"home"} = "first";
$a("hotel"} = "second";
当你在一个已存在的散列中存入东西时,会覆盖以前的值。
访问散列之外的元素会得到undef:
$a = $b{"test"}; 这里没有test,得到undef。
作为一个整体的散列
要访问整个散列,就使用%号做前缀。
为方便起见,可以将散列转换为一个列表,并转换回来,给散列赋值是一个列表上下文,这个表由键-值对组成
%hash = ("aa",33,"bay",11,2.5,"hello","cc","bb\n");
展开散列(unwind),把散列转换回键-值对应列表。次序乱了,但键-值还是成对出现的。
@array = %hash
print "@array";
bay,11,2.5,hello,cc,bb(一个换行符),aa,33
散列赋值
%new_hash = %old_hash perl将%old_hash展开成一个键-值对列表,并赋值给
%new_hash。
%inverse_hash = reverse %any_hash 生成逆散列,键变值,值变键。前提是原散列值要唯一。
大箭头
用大箭头把散列中的键-值对组织起来。
my %hash = (
"aa" => "test1",
"bb" => "test2",
"cc" => "test3", 最后额外的逗号是无害的
);
散列函数
keys函数得到一个散列中所有当前键构成的一个列表,values函数得到一个相应的值。
my %hash = ("a" => "test1,"b" => "test2","c" =>"test3");
my @k = keys %hash 得到"a","b","c"。
my @v = values %hash 得到"test1","test2","test3"。
在一人标量上下文中,这些函数给出散列的元素个数。
my $count = keys %hash 得到3,即有三个键-值对。
each函数
该函数可以遍历一个完整的散列。每次返回一个键-值对作为一个二元元素列表。最后返回一个空列表。
while ( ($key,$value) = each %hash ) {
print "$key => $value\n";
}
exists函数
查看某键是否在散列中。存在就返回真,不存在就返回假。
delete函数
从散列中删除指定的键(和相应的值)。如无此键,它的任务就结束。此时没有警告或出错信息给出来。