初品BioPerl(第一篇:让BioPerl在你的电脑上安家)九月18,2010Perl的模块有两类,一类是内置在Perl中的,比如小驼书中提到的CGI,File::Basename等,所以你无须另外下载安装这些模块即可使用它们;另一类则是与Perl相分离的,所以你要下载并安装才可以使用它们。很不幸,BioPerl属于后者。而且,安装过程对某些人某些电脑来说不是很容易。首先,如果你恰巧跟上了因Ubuntu10.04的发行带来的Linux崇拜潮流,已经成功抛弃了WindowsXp转向Ubuntu的话,那么恭喜你,安装BioPerl和安装gimp之类的应用软件一样简单!打开新立德软件包管理器,输入BioPerl搜索,出现的第一项就是(目前的版本是1.6.1),然后右键点击选择“安装”,系统就会自动把所有依赖的软件包全部安装上。怎么样,是不是很方便呢?而且将来某一天若BioPerl有了更新,可以很方便地使用新立德来升级。当然,如果大家都这么方便的话,我就不用写这篇文章啦!对于使用其他Linux和Unix系统的人来说可能未必有这种软件包管理器(即使有,在软件源里也未必有BioPerl的安装文件)。但是所有的类Unix系统应该都支持“源代码编译安装”的方式(这是不少Linux高手自认为很酷的装软件方法,哪怕现在还有好多人在用。新手最好不要用,很容易出现问题)。对于这些类Unix系统的用户来说,安装BioPerl和安装一些普通的软件方法是一样的,步骤是:(1)下载BioPerl的源代码,并解压。我提供两个网址:://search.cpan.org/CPAN/authors/id/C/CJ/CJFIELDS/BioPerl-1.6.1.tar.gz(2)进入该目录,然后执行下列命令:$perlBuild.PL$./Buildtest#./Buildinstall注意:执行./Buildinstall时必须要有系统管理员权限。这种方法看起来好像挺简单的,但其实不太容易。因为BioPerl和许多其他模块有依赖关系,所以在安装过程中系统会反复询问你是否要安装XX模块。你最好要在连接Internet的情况下安装才行。如果你只想用BioPerl的核心模块,不想使用额外附加功能,可以选择不安装。但我不敢保证以后使用是否会出现问题。***********************分割线*******************************接下来要处理最麻烦的一种操作系统:Windows。因为在Windows上使用“源代码编译安装”并不容易(甚至可以说就是不行的!)。如果你的英文水平还不错,请阅读以下文章:如果你实在不想看英文,请跟着我走:相信大多数Windows用户应该是使用ActivestatePerl的版本,首先确保它是最新的。安装BioPerl有两种方式:(1)使用ActivestatePerl的PPM(Perl包管理器)来安装。这种方法速度很慢,如果你机器配置不够好的话只有等着死机。(2)使用命令行模式安装。这种方法经过我测试,很稳定,强力推荐。注意安装全过程必须要有稳定的Internet连接你需要执行的命令是:C:ppm-shell(回车出现下一行)ppmppmrepoadd注意看仔细了,别打错字母!根据小驼书的说法,判断系统上是否已经安装了一个模块,可以尝试使用perldoc命令查看模块的文档。如果能够查阅它的文档,说明已经安装成功了,否则呢,还是自己找一下原因吧!对于BioPerl来说,我们可以查看其中的一个模块的文档:perldocBio::Seq不要自作主张地写成perldocBioPerl!找不到的!因为并不存在BioPerl.pm这种模块,它只是一个统称而已。对于Ubuntu用户来说,perldoc这个命令默认没有安装,自己手动把它安装上去即可。BioPerl安家之后,我们就可以尽情地享受它带来的乐趣。初品BioPerl(第二篇:构造一条fasta序列)十月8,2010接下来我们就来讨论BioPerl的用法。根据一句经典名言,Perl的用途“90%与文本处理有关,10%与其它事务有关”(改编自小驼书),Perl语言的强项就在于文本处理(当然主要是纯文本,和许多Unix工具如grep,awk,sed等工具类似哦!),而恰好大多数生物信息学数据都是以纯文本的形式存放的(包括蛋白质、核酸等序列文件,序列比对文件,进化树文件等),所以BioPerl当初设计的初衷就是为了分析、处理这些文本数据文件。当然随着模块越来越多,BioPerl的功能也扩展了,现在也有人喜欢用BioPerl作为下载工具来下载序列,或者用来运行blast程序等。虽然不是不可以,但我并不建议这么做,因为通过BioPerl来运行的blast程序肯定没有直接运行的blast程序来得快,来得灵活。正如同想要删除一个文件,我们一般都会执行rmfile.txt,而不会另外编一个Perl程序说:perl-e'unlinkfile.txt'。进入正题啦!首先,生物信息学处理最多的问题是什么?当然就是蛋白质和核酸序列喽!生物大分子序列的书写有好多种格式,如Fasta,Genbank,EMBL,SwissProt等。其中Fasta是最简单的序列格式,所以我们先来学习使用BioPerl来构造fasta序列。当然这在实际工作上意义不大,因为大部分序列应该从数据库中下载得到(或者通过程序运算出来),而不是自己构造出来的。我们在下一篇会学习如何从文件中提取fasta序列。现在还是先打基础吧。^_^fasta格式的序列是这样的:也就是说,上面这条序列的“名称”是:gi|147605|gb|J01673.1|ECORHO“描述”是:E.colirhogenecodingfortranscriptionterminationfactor序列则是下面的一大段当然,这条序列的名称比较复杂,如果是自己“构造”序列,自然没必要用这么复杂的名称,可以只叫ECORHO或者叫Ecolirho都行。但千万注意。由于BioPerl一般是把从大于号开始一直到第一个空格出现的字段认为是“名称”,所以序列的名字中不要出现空格。如果你把序列的名字叫做E.colirho,把头字段写成这样:E.colirhoE.colirhogenecodingfortranscriptionterminationfactorBioPerl会认为“名称”是E.coli(从大于号开始到第一个空格出现),而“描述”是rhoE.colirhogenecodingfortranscriptionterminationfactor,结果会把你搞得稀里糊涂的,要想不引发岐义,可以这么写:E.coli_rhoE.colirhogenecodingfortranscriptionterminationfactor呵呵,只加上一条下划线,就对了。如果我们的序列是从NCBI这样的数据库里下载下来的,无须担心名称和描述的问题,但有时序列是通过其他程序运算出来,需转入下一道工序加工,这时取个好听的名字就很重要。知道了fasta序列的格式之后,我们可以用一般的Perl程序“编”出这样一条序列:#!/usr/bin/perl-w%a_fasta_seq=(“display_name”=“gi|147605|gb|J01673.1|ECORHO”,#这是序列的名称“desc”=“E.colirhogenecodingfortranscriptionterminationfactor”,#这是序列的描述“seq”=“AACCCTAGCACTGCGCCGAAATATGGCATCCGTGGTATCCCGACTCTGCTGCTGTTCAAAAACGGTGAAG”,)然后可以把它打印出来:printEOF;#这是根据fasta格式依次打印名称、描述和序列,使用了Here文档的写法,也可以拆分成多条print语句$a_fasta_seq{dispaly_name}\t$a_fasta_seq{desc}$a_fasta_seq{seq}EOF这种方法的优点是步骤十分清晰,只是太麻烦了一点。如果要构造一个GenBank序列,则得写N长的print。还有,如果要构造许多条fasta序列,也不方便。总不能写%fastaseq1,%fastaseq2,%fastaseq3吧?下面我们就来看看用BioPerl该怎么写:#!/usr/bin/perl-wuseBio::Seq;#加载Bio::Seq模块。$seq_obj=Bio::Seq-new;#调用Bio::Seq模块的new方法,可以建立一个序列对象,命名为$seq_obj。#给这个新建的$seq_obj对象赋予三个属性的值:dispaly_name(序列的名称),desc(序列的描述)以及seq(序列的内容)$seq_obj-display_name(“gi|147605|gb|J01673.1|ECORHO”);$seq_obj-desc(“E.colirhogenecodingfortranscriptionterminationfactor”);$seq_obj-seq(“AACCCTAGCACTGCGCCGAAATATGGCATCCGTGGTATCCCGACTCTGCTGCTGTTCAAAAACGGTGAAG”);第一句是模块的加载,会把相关的新函数(其实是“方法”)加载进来。第二句的语法其实在小驼书中已提到过:调用了Bio::Seq模块中的new方法。对于调用面向对象的模块的方法(以前说“函数”,在OO术语中称“方法”)要使用“全名”的方式来调用,语法是:模块名(Bio::Seq)+瘦箭头(-)+方法名(new)。顺便透露一个小秘密:所有面向对象的模块都有一个叫做“new”的方法,它的功能简单且重要:创建一个新的对象。会一点Perl的人都应该会创建一些所谓的“数据结构”,比如说:创建一个标量:$scalar;创建一个数组:@array;创建一个哈希:%hash;因为标量、数组和哈希都太“简单”啦,而且是Perl内置的数据结构,在标量、数组或哈希里以什么样的方式来组织数据都是Perl自己已经定好了的(注意是组织数据的方式而不是数据的内容哦!)。而对象则可以看成是自己定义的一种数据结构,我们可以给对象赋予一些属性来描述它(有点类似于在哈希中放入键值对来描述你创建的哈希)。但是创建的对象不像标量、数组或哈希那样有前缀($,@和%),在Perl中对象是用存放它的地址来表示的,而恰恰凑巧的是,地址(一般叫做“引用”)的前缀就是$。所以,创建一个Bio::Seq对象就是这样:$seq_obj=Bio::Seq-new;你可能还会为两个问题而困惑:(1)问:为什么要使用new函数来返回一个对象,而不是像创建标量那样直接写$seqobj就行了呢?答:因为对象是需要我们自定义的,所以我们需要写一个子程序来定义对象的结构(其实是它的属性和方法,只是空的白纸,还没有填入内容),而碰巧这个子程序的名称就叫new,并且别人已经帮我们写好且内嵌在Bio::Seq模块(以及以后我们要用的其他模块)里了。(2)问:对象的名称一定要以obj结尾吗?答:不需要。你完全可以写$seq=Bio::Seq-new;,这样也是创建了一个名字叫做seq的对象,但是到后来你会搞不清$seq究竟是一个存放序列字符串的标量标量呢还是一个存放(指向)整个序列信息的对象呢?所以,既然对象没有”前缀“,我们就自己给它加一个“后缀”上去。创建了一个seq_obj对象之