Perl:循环遍历数组以递增哈希值



我是perl的新手,我有一个问题要解决。在我的程序的这个阶段,我已经将一个文件放入数组中并创建了一个哈希,其中所有键都是数字,在一定范围内按用户指定的 bin 大小增加所有键的值设置为 0。我的目标是遍历数组并找到与我的哈希键匹配的数字,并在匹配时将相应的值递增 1。为了使在数组中查找特定值更容易一些,数组的每一行将只包含一个感兴趣的数字,并且这个数字将始终是小数,所以也许我可以使用正则表达式:

=~ m{(d+.d+)}

以挑选感兴趣的数字。找到感兴趣的数字后,我需要将数字四舍五入(目前我使用"Math::Round 'nlowmult';"),以便它可以放入适当的箱中(如果存在),如果箱不存在,循环需要继续,直到扫描完数组的所有行。

因此,总体目标是拥有一个哈希,该哈希记录了该数组中的值在用户指定的范围和增量(箱大小)内出现的次数。

目前,我的代码尝试这样做是(MathRound已在程序的前面调用):

my $msline;
foreach $msline (@msfile) {
    chomp $msline;
    my ($name, $pnum, $m2c, $charge, $missed, $sequence) = split (" ", $msline);
    if ($m2c =~ /[$lowerbound,$upperbound]/) {
        nlowmult ($binsize, $m2c);
        $hash{$m2c}++;
    }
}

注意:数组的每一行包含 6 个字段,感兴趣的数字始终出现在第三个字段"m2c"中。

该程序不会向下舍入值,也不会向键添加值,而是创建新键并增加这些值。我也不认为使用 split 是一个好主意,因为一个真正的数组将包含大约 40,000 行。这可能会使哈希填充过程非常慢。

我哪里出错了?任何人都可以给我任何关于如何解决这个问题的提示吗?如果问题的任何方面需要进一步解释,请告诉我!

提前谢谢你!

更改:

if ($m2c =~ /[$lowerbound,$upperbound]/) {
    nlowmult ($binsize, $m2c);
    $hash{$m2c}++;
}

自:

if ($m2c >= $lowerbound && $m2c <= $upperbound) {
    $m2c = nlowmult ($binsize, $m2c);
    $hash{$m2c}++;
}

不能使用这样的正则表达式来测试数值范围。并且您使用 $m2c 的原始值作为哈希键,而不是舍入值。

我认为主要问题是你的行:

nlowmult ($binsize, $m2c);

将此行更改为:

$m2c = nlowmult ($binsize, $m2c);

至少可以解决这个问题,因为nlowmult()实际上并没有修改$m2c。 它只返回舍入结果。 你需要告诉perl将结果存储回$m2c

如果您不想实际修改$m2c的内容,您可以将该行和它下面的行合并:

$hash{nlowmult ($binsize, $m2c)}++;

可能不是一个竞争答案,但我希望这有所帮助。

最新更新