为什么我只能在输出中写下最后一行?

时间:2016-05-16 13:21:37

标签: perl

我有这段代码但是在我的输出文件中它只写了最后的结果。我错过了什么?

#!/usr/bin/perl

use strict;
use warnings;

print "type in the name of a file\n";
my $fasta_file = <STDIN>;
chomp ($fasta_file);

open (FASTA, $fasta_file) or die "error $!";

my $fasta = "";

while (my $line = <FASTA>) {
    $fasta .= $line; }


my @seq = split (/\>/s, $fasta);

for (my $i=0; $i<@seq; $i++) {
    my $sequence = $seq[$i];
    next if $sequence eq '';

..

    my $perc_GC = ((($G + $C) / $size) *100);
    print "$perc_GC% GC\n";

    open(OUTFILE, "> $fasta_file") or die "\nCould not create file ;/";

        print OUTFILE "$perc_GC% GC\n";

};
};

close (FASTA);
close(OUTFILE);
exit;

输入

>cel-mir-39 MI0000010 Caenorhabditis
AAAAAGCGCG

输出

  

cel-mir-39 MI0000010 Caenorhabditis 50%GC

此外,它不是在我的输出文件上写标题。

1 个答案:

答案 0 :(得分:3)

问题是你在内部for循环中打开输出文件,这是循环遍历的循环。删除已经写入的任何内容并每次打开一个新的空文件,这不是你想要的。在开始处理输入数据之前,您只需打开输出文件一次

您的标题未打印到文件中,因为您只使用print "$header\n"将其打印到STDOUT。即使它正常工作,重复打开输出文件也会删除它

您还需要将基本计算移到内部循环之外。所有循环应该做的是扫描基数并计算Gs和Cs。在计算总数之前,不应输出任何内容

您可能更喜欢这个程序的重写,它更简洁,更好地遵循最佳实践。它还解决了将序列标题打印到输出

的问题
#!/usr/bin/perl

use strict;
use warnings 'all';

print 'Enter the name of the FASTA file: ';
my $fasta_file = <STDIN>;
chomp $fasta_file;
print "\n";

(my $out_file = $fasta_file) =~ s/\.fasta$/.gc/ or die "File name must end in .fasta";
open my $out_fh, '>', $out_file or die qq{Unable to open "$out_file" for output: $!};

my $fasta = do {
    open my $fh, '<', $fasta_file or die qq{Unable to open "$fasta_file" for input: $!};
    local $/;
    <$fh>;
};

for my $sequence ( split />/, $fasta ) {

    next unless $sequence =~ /\S/;

    my ( $header, $dna ) = split /\n/, $sequence,  2;
    $dna =~ s/\s//g;

    my %bases;
    ++$bases{$_} for split //, $dna;

    for my $fh ( \*STDOUT, $out_fh ) {
        printf $fh "%s %.1f%% GC\n",
            $header,
            ( $bases{G} + $bases{C} ) / length($dna) * 100;
    }
}

输出

Enter the name of the FASTA file: test.fasta

cel-mir-39 MI0000010 Caenorhabditis 50.0% GC