我有这段代码但是在我的输出文件中它只写了最后的结果。我错过了什么?
#!/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
此外,它不是在我的输出文件上写标题。
答案 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