Pos score1 52 179 8038 2240 117 0302 1985 3312 51293 15 1961 871 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上下文中无用的addition().
解决方法use strict;use warnings;use List::Util qw(max min);my $step = 30; # group into 30 item ...my @bins; # ... bins<DATA>; # skip linewhile (<DATA>) { my ($p,$s) = split; push @{$bins[$p / $step]},$s; }for (my $i = 0; $i < @bins; $i++) { next if not $bins[$i]; printf("%d,%d (min %d,max %d)\n",$i * $step,($i + 1) * $step,min(@{$bins[$i]}),max(@{$bins[$i]}));}__DATA__Pos score1 52 179 8038 2240 117 0302 1985 3312 51293 15 1961 871 15
产量
0,30 (min 0,max 80)30,60 (min 11,max 22)60,90 (min 8,max 33)270,300 (min 1,max 1)300,330 (min 19,max 19)总结
以上是内存溢出为你收集整理的用于多个范围的循环的Perl全部内容,希望文章能够帮你解决用于多个范围的循环的Perl所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)