使用BioPerl打印FASTA文件的序列

时间:2014-06-12 10:29:34

标签: perl bioperl

我有这段代码

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。但是,此代码打印一个空文件。你知道发生了什么吗?

2 个答案:

答案 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 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);
}