【问题标题】:Perl: Looping Through an Array to Increment the Values of a HashPerl:循环遍历数组以增加哈希值
【发布时间】:2013-11-02 22:45:56
【问题描述】:

我是 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 行。这可能会使哈希填充过程非常缓慢。

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

提前谢谢你!

【问题讨论】:

  • 如果我没有收到回复,我会尝试,谢谢 :)
  • 你想用$m2c =~ /[$lowerbound,$upperbound]/做什么?这是一个匹配字符串$lowerbound$upperbound 或逗号中的任何字符的正则表达式。它不进行数值范围测试。
  • 使用该表达式,我试图仅捕获用户指定范围内的值,并忽略任何超出范围的值

标签: regex arrays perl hash increment


【解决方案1】:

变化:

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

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

}

到:

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

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

}

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

【讨论】:

    【解决方案2】:

    我认为主要的问题是你的台词:

    nlowmult ($binsize, $m2c);
    

    将此行更改为:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-08-20
      • 1970-01-01
      • 2013-02-09
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2016-01-27
      • 1970-01-01
      • 2012-08-22
      相关资源
      最近更新 更多