perl 如何判断哈希表中已存在某个键值对,若没有该键值对,再添加新的。

注意不是判断有某个键或某个值,而是整个键值对一起判断

事实上你这样做是没有意义的。如果存在该键,你就不是添加新的,只能改变原键值。所以只需要判断该键是否存在。


你如果有这种需求,大概是需要用二级哈希

(!exists($a{$key1}->{$key2})) and ($a{$key1}->{$key2} = $value);

追问

谢谢!你说的有道理,我的需求可能也没有表达清楚。
比如我现在有个表格:
ID 时间

001 11:10
001 12:13
002 10:12
002 12:34
002 12:28
……
然后我要关注的就是哪个‘小时’出现的次数最多,但比如ID002有两个12点的,那这时就只能算一次,不同ID的小时是累计的(不知道我说清楚了没有……)

追答

抱歉没看清你的需求,重新回答一下。仔细看了一下,我感觉你还是使用一个二级哈希作为判断,另用一个哈希作为值求和。判断是否存在就看二级哈希是否存在(if (!exists $hash{$k1}{$k2}))或者直接看值也是一样的(if (!$hash{$k1}{$k2}))。对你这的数值完整示例程序如下:

use strict;

my %checkhash;
my %sumhash;

open FILE,"a";
foreach my $line (<FILE>) {
    chop($line);
    my ($id, $time) = split(/ +/, $line);
    my ($hour,$min) = split(/:/, $time);
    if (!exists $checkhash{$hour}{$id}) {
        $checkhash{$hour}{$id} = 1;
        $sumhash{$hour}++;
    }
}
close FILE;

foreach my $k (sort { $sumhash{$a} <=> $sumhash{$b} } keys %sumhash) {
   my $v = $sumhash{$k};
   print "[$k][$v]\n";
}

追问

哦哦好的谢谢!我先去试试看XD
请问$checkhash{$hour}{$id} = 1;是什么意思?

追答

请问$checkhash{$hour}{$id} = 1;是什么意思?

其实没啥意思,就是给这个二维hash赋了一个值,下次再用exists检查这个hash时,就不会不存在了。

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答