perl hash 常见用法

来源:互联网 发布:二炮有多厉害知乎 编辑:程序博客网 时间:2024/05/20 10:51
 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次