Perl 如何打印每个标题下具有最大值的结果?

Perl 如何打印每个标题下具有最大值的结果?,perl,Perl,我有如下数据和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"; }

我有如下数据和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 T 137.5
>dna2
A H M 206.2
你能帮我弄清楚我怎样才能得到最终组合的最大分数,如下所示:

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 T 137.5
>dna2
A H M 206.2

谢谢

以下内容产生了预期的输出:

#!/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";
#/usr/bin/perl
使用警告;
严格使用;
我的($max_分数,$max_组合);
while(我的$line=){
如果($line=~/^>/){
如果$max\u组合,则打印“$max\u组合$max\u分数\n”;
打印$行;
$max_得分=0;
}elsif(我的($combination,$score)=$line=~/(.*)\s+([0-9.]+)/){
如果($score>$max_score){
$max_分数=$score;
$max_组合=$combination;
}
}
}
打印“$max\u组合$max\u分数\n”;

主要区别在于,您只需要在新组开始时或在最末尾打印结果。

将$line更改为$是一种倒退IMO@LingZhang您是否了解它是如何工作的,以及为什么您的代码不工作的?“如果不是的话,也许乔洛巴可以加上一个解释。”我吓坏了外星人。谢谢你的提醒。是的,我明白。在我的代码中,我使用了foreach,所以在每次迭代中打印带有max score的组合。Choroba在这里使用了“while”,我可以在每个新组之前打印最终结果。再次感谢。@LingZhang
foreach
while
只是遍历数组的方法——choroba的代码可以用
foreach
循环重写。代码的问题在于,您每行都打印结果,而不是在每个“部分”的末尾。