我有这段代码
use warnings;
use Getopt::Long;
use Bio::SeqIO;
GetOptions("in=s" => \$file) or die("Error in command line arguments\n");
open $new3, ">", "sequences_tmp.tab";
$seqin = Bio::SeqIO->new(-file => $file, -format => "Fasta");
$seqout = Bio::SeqIO->new(-file => ">$new3", -format => "tab");
while ($seq = $seqin->next_seq()) {
$seqout->width($seq->length);
$obj = $seq->id ."\t".$seq->seq()."\n";
$seqout->write_seq($obj);
}
close $new3;
希望以这种方式打印序列seq_id TAB sequence
。但是,此代码打印一个空文件。你知道发生了什么吗?
答案 0 :(得分:0)
$obj
变量对我来说毫无用处。它是一个字符串,而不是一个序列对象。由于您只想重新格式化序列,因此您可以简单地将$seq
传递给write_seq()
方法。
所以我想知道你是否正在执行循环体。您可以打印调试输出以验证它。如果未执行循环体,则确保输入文件确实包含FASTA格式的序列。
另外,请在脚本之上声明use strict;
。它将帮助您避免许多陷阱。
答案 1 :(得分:0)
您打开文件句柄$new3
,然后对其进行字符串化并将其用作-file
参数中的文件名。这是一个错误。
open $new3, ">", "sequences_tmp.tab";
$seqout = Bio::SeqIO->new(
-file => ">$new3", # <--- Not what you want
-format => "tab",
);
Bio::SeqIO->new
可以接受文件句柄-fh
或文件名-file
作为初始化参数。因此,以下任何一种方法都可能对您有用:
my $seqout = Bio::SeqIO->new(
-fh => $new3,
-format => "tab",
);
#or#
my $seqout = Bio::SeqIO->new(
-file => '>sequences_tmp.tab',
-format => "tab",
);
您的代码也可以使用进一步清理:
use strict;
和use warnings;
。use autodie;
。应用这些并从代码中删除可能的调试工件会将其减少为:
use strict;
use warnings;
use autodie;
use Getopt::Long;
use Bio::SeqIO;
GetOptions(
"in=s" => \my $infile,
) or die "Error in command line arguments\n";
my $outfile = "sequences_tmp.tab";
my $seqin = Bio::SeqIO->new(-file => $infile, -format => "Fasta");
my $seqout = Bio::SeqIO->new(-file => ">$outfile", -format => "tab");
while (my $seq = $seqin->next_seq()) {
$seqout->write_seq($seq);
}