1

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

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

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

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

目前我的代码尝试这样做是(在程序的前面已经调用了 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 行。这可能会使哈希填充过程非常缓慢。

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

先感谢您!

4

2 回答 2

1

改变:

if ($m2c =~ /[$lowerbound,$upperbound]/) {

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

}

到:

if ($m2c >= $lowerbound && $m2c <= $upperbound) {

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

}

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

于 2013-11-02T14:45:20.710 回答
1

我认为主要问题是您的线路:

nlowmult ($binsize, $m2c);

将此行更改为:

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

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

如果您不想实际修改以下内容,则可以将该行与其下方的行合并$m2c

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

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

于 2013-11-02T14:45:56.920 回答