跳到主要内容

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函数

从散列中删除指定的键(和相应的值)。如无此键,它的任务就结束。此时没有警告或出错信息给出来。