2014-09-22 78 views
0

我有如下的数据和Perl代码。我试图在每个标题(> dna1,> dna2)下找到最大分数(最后一列)的字母组合并打印出来。我在Perl写的代码如下:如何在每个标题下打印最大值的结果?

use strict; 
use warnings; 
my ($line); 
my $max = 0; 
my @prediction; 
foreach my $line (<DATA>) { 
    chomp($line); 
    if ($line =~ /^>/) { 
     print "$line"; 
    } 
    else { 
     my @split = split(/\s+/,$line); 
     my $score = pop @split; 
     if ($max < $score) { 
      $max = $score; 
      @prediction = @split; 
      push @prediction, $max; 
     } 
    #print "$domain\n"; 
    } 
    print "@prediction\n"; 
} 
__DATA__ 
>dna1 
D 124.6 
D T 137.5 
G -3.4 
G T 9.5 
T 12.9 
>dna2 
A 196.3 
A K 186.5 
A K H 192.7 
A H M 206.2 
A M 200 

输出是

>dna1 
D 124.6 
D T 137.5 
D T 137.5 
D T 137.5 
D T 137.5 
>dna2D T 137.5 
A 196.3 
A 196.3 
A 196.3 
A H M 206.2 
A H M 206.2 

能否请你帮我找出我如何能得到的输出只是最高分最终组合如下:

>dna1 
D T 137.5 
>dna2 
A H M 206.2 

谢谢!

回答

1

下产生预期的输出:

#!/usr/bin/perl 
use warnings; 
use strict; 

my ($max_score, $max_combination); 
while (my $line = <DATA>) { 
    if ($line =~ /^>/) { 
     print "$max_combination $max_score\n" if $max_combination; 

     print $line; 
     $max_score = 0; 

    } elsif (my ($combination, $score) = $line =~ /(.*)\s+([0-9.]+)/) { 
     if ($score > $max_score) { 
      $max_score  = $score; 
      $max_combination = $combination; 
     } 
    } 
} 
print "$max_combination $max_score\n"; 

的主要区别是,你需要在一个新的组开始,或者在最后仅打印结果。

+0

将$ line改为$ _是向后退步IMO – ysth 2014-09-22 22:09:51

+0

是的,它工作的很好。非常感谢! – 2014-09-22 22:10:17

+2

@LingZhang你知道它是如何工作的吗?为什么你的代码不工作?如果不是,可能choroba可以添加一个解释。 – 2014-09-22 22:10:41