您的位置:首页 > 其它

perl-hash的用法

2009-03-05 23:31 295 查看
perl hash 常见用法
基本用法

# 初始化 %h为空数组
%h = {};
# 用数组初始化%h为 a=>1, b=>2
%h = ('a', 1, 'b', 2);
# 意义同上,只是另一种更形象化的写法。
%h = ('a'=>1, 'b'=>2);
.
得到hash的所有键值

# 得到所有keys,顺序取决于hash函数,或者说是乱序
@all_keys = keys %h;
# 所有键值,是按hash的值从大往小排列的。值的比较是数字比较(比如说,10>9)
@all_keys = sort{$h{$b}<=>$h{$a}} (keys %h);
# 所有键值,是按hash的值从小往大排列的。值的比较是数字比较
@all_keys = sort{$h{$a}<=>$h{$b}} (keys %h);
# 所有键值,是按hash的值从小往大排列的。值的比较是字符串比较
#(比如说,‘10’ < ‘9’)
@all_keys = sort{$h{$a} cmp $h{$b}} (keys %h);

判断hash是否包含key
exists($h{$key});

Hash的长度
想要知道一个hash有多少<key, value>,常见的方法是得到包含所有键值的数组。这个数组的长度就是hash的长度:<

遍历一个hash中所有的<key, value>
.while (my ($k, $v) = each %h) {
print "$k ---> $v/n";
}
Reference

$h_ref = /%h; # 获得一个hash的reference
%aHash = %{$h_ref};# 把hash reference当成hash用
$value = $h_ref->{akey} # 这个和%h{akey}是一样的

实例:

有一份用户名列表,存储了 10000 个用户名,没有重复项;
还有一份黑名单列表,存储了 2000 个用户名,格式与用户名列表相同;
现在需要从用户名列表中删除处在黑名单里的用户名,要求用尽量快的时间处理。

#!/usr/bin/perl
for(my $i = 0; $i < @arrayN; ++$i)
{
for (my $j = 0; $j < @arrayM; ++$j)
{
if ($arrayN[$i] eq $arrayM[$j])
{
$arrayM[$j] = undef;
}
}
}

两层循环的话要执行10000*2000次

#!/usr/bin/perl
my %arrayHash;
for(my $i = 0; $i < @arrayN; ++$i)
{
$arrayHash{$arrayN[$i]} = 1;
}

for(my $i = 0; $i < @arrayM; ++$i)
{
if ($arrayHash{$arrayM[$i]})
{
$arrayM[$i] = undef;
}
}
现在只需执行10000+2000次
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: