【发布时间】: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