bioperl提供序列模块(Seq和SeqIO)的使用


在对序列进行读写操作的时候需要对序列进行格式化,不同格式之间的转换往往是非常复杂的过程,虽然这些是perl程序的长项,即模式匹配和字符操作,但在写一个较长的程序的时候怎样提供一个规范化的接口,不仅使得输入变得轻松,在不同输出要求的时候通过修改一两个参数完全适应不同的情况。

其实这样的接口很多,很多程序包例如emboss、cgc都有这样的功能,当然也可以在perl程序中调用,但bioperl提供的可能是最强大也是最简单的解决方案。

一个简单的例子,我有一个文件,genebank的格式,需要输出为fasta格式,用于序列比对,(或者需要其他格式是用于其他的操作,例如需要genewise的输入格式等等,或者是直接就是大量的abi测序的trace data或是solexa测序文件,以及来自不同数据库的不同格式的文件),大道至简的方法如下:

#!/bin/perl -w
use BIO::SeqIO;

$seq_input=Bio::SeqIO->new(-file =>"sequence.fasta",-alphabet=>"dna");

#输入,变量=模块->命令(-参数 =>值),看起来比open复杂?

#但中间需要进行的格式转换全部省略了,而且甚至不告诉他是蛋白还是dna序列,

#该模块自动会判断的,如果你确信格式可以告诉他输入的是某种格式,方法是 -format =>格式,

#当然不告诉他判断出来基本也没什么问题。

$seq_obj=$seq_input->next_seq;

#使用 变量=变量->参数,直接调用该变量的不同参数对应的值;

#next_seq是个非常常用的命令,可以调用下一条序列,接着往下看就知道了;

while($seq_obj){

print "$seq_obj->seq\n";

#在这个循环中调用了上面的next_seq,一直取到空为止,

#当然可以把上面的写到括号里减少行数,这里的->参数是直接输出序列,

#你也可以选择输出其他参数,如名称、位置等

}

这是bioperl里最简单也是最常用的一个模块,似乎自己多写几行也可以达到同样的效果,而且不用打哪么多“:”,但是,这个模块因为其通用性和规范性,在各个程序间转换显得轻而易举,完全可以写个百行以内的程序实现目前ncbi的blast和entrze的功能,成为database的IO接口。

(bioperl提供了几乎所有生物软件包的调用,以往写perl程序的时候是为了在软件包之间转换,用bioperl只要简单的告诉他你用各个软件包的顺序和调用参数,转换就完全免了)

转自: Vanilla’s sky