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

注意不是判断有某个键或某个值,而是整个键值对一起判断... 注意不是判断有某个键或某个值,而是整个键值对一起判断 展开
 我来答
jianxia2k
推荐于2017-12-16 · TA获得超过399个赞
知道小有建树答主
回答量:365
采纳率:82%
帮助的人:194万
展开全部

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


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

(!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";
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式