在对序列进行读写操作的时候需要对序列进行格式化,不同格式之间的转换往往是非常复杂的过程,虽然这些是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