【发布时间】:2014-06-24 10:06:54
【问题描述】:
在 for 循环中设置范围计数器的最佳方法是什么?我有一个制表符分隔输入文件,其中前 2 列很重要。我想找到在一系列 Pos 值内出现的分数的最小值和最大值。所以对于示例输入文件:
Pos Score
1 5
2 17
9 80
38 22
40 11
7 0
302 19
85 33
12 51
293 1
5 19
61 8
71 15
如果存在,我需要计算每个范围的最小和最大分数。
1-29 (min=?, max=?)
30-59 (min=?, max=?)
60-89 (min=?, max=?)
预期结果:
1-29 (min=0, max=80)
30-59 (min=11, max=22)
60-89 (min=8, max=33)
290-219 (min=1, max=19)
还有另一个与此相关的线程,但他们只计算设定范围内的出现次数。我的尝试是设置一个 for 循环:
use List::MoreUtils qw( minmax );
my %inputhash;
my %storehash;
open (FF,$inputfile) || die "Cannot open file $inputfile";
while(<FF>) {
next if $. < 2; #use to trim off first line if there is a header
my ($Pos, $Score) = split;
$inputhash{$Pos} = $Score;
}
for (my $x=1; $x<1600; $x+29) #set to 1600 for now
{
my $low = $x;
my $high = $x+29;
foreach my $i ($low...$high)
{
if (exists $inputhash{$i})
{
my $score = $inputhash{$i};
push (@{$storehash{$high}}, $score);
}
}
}
foreach my $range (sort {$a <=> $b} keys %storehash)
{
my ($minrange, $maxrange) = minmax @{$storehash{$range}};
print "$range: $minrange, $maxrange\n";
}
有没有更好的方法来处理这个问题?这个当前的实现给了我一个错误:在 void context 中无用地使用加法 (+)。
【问题讨论】:
-
也许您想将
$x+29更改为$x+=29? -
@perreal :给定范围可能是
$x+=30,并从my $x = 0;开始 -
更改为 $x+=30 似乎可以解决错误消息。谢谢你。这似乎有效。然而,我想知道是否有人会以不同的、也许更优雅的方式实现多个范围的计数器。