您正在查看: 2015年12月

perl调用系统命令的3种方式

Overview

有很多时候,我们需要在perl脚本中调用系统命令,比如调用系统的某个软件做一件事。也可以说是在perl脚本中调用外部命令,比如在一个perl脚本中调用另一个perl脚本。

有很多种方式可以实现这个目的,这里我列出来3中常见的方式,并以一个例子说明这三种方式的不同之处。

1. 被调用的perl脚本

我们在一个perl脚本(取名为testSystemCall.pl)中调用另一个脚本(取名为printCallInfo.pl)。printCallInfo.pl中内容如下:

#!/usr/bin/perl -w

# usage: perl printCallInfo.pl number
# number: an Integer

use strict;
use warnings;

my $countNumber = $ARGV[0] or die "Need to input an integer on the command line\n";
print "This perl script is called $countNumber times\n";

使用方法已经在脚本中说明,比如使用:

perl printCallInfo.pl 5

屏幕上就会显示:

This perl script is called 5 times

2. 调用脚本testSystemCall.pl

我们在脚本中分别查看使用以下三种方式调用printCallInfo.pl

  • system("command");
  • exec("command");
  • `command`;

testSystemCall.pl脚本内容如下:

#!/usr/bin/perl -w

# usage: perl testSystemcall.pl number
# number : an enum number
#        1: use system("command")
#        2: use exec("command")
#        3: use `command`;

use strict;
use warnings;

my $exceType = $ARGV[0] or die "Need to input an integer(1,2,3) on the command line\n";

print "Begin loop to invoke system call: \n";
for(my $i=1; $i<=5;$i++)
{

    ($exceType == 1) and system("perl printCallInfo.pl $i");
    ($exceType == 2) and exec("perl printCallInfo.pl $i");
    ($exceType == 3) and `perl printCallInfo.pl $i`;
}
print "End loop.\n";

这个脚本需要指定一个1或者2或者3的整数,指定1代表执行system("perl printCallInfo.pl $i"),指定2或者3以此类推。

这里注意orand的使用,也可以分别使用||&&代替。巧妙使用这种方式可以节省很多if else语句。

2.1 system("command") (推荐)

使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码。

使用命令:

perl testSystemCall.pl 1

执行了system("perl printCallInfo.pl $i");,得到下面的结果:

Begin loop to invoke system call:
This perl script is called 1 times
This perl script is called 2 times
This perl script is called 3 times
This perl script is called 4 times
This perl script is called 5 times
End loop.

结果在意料之中。

2.2 exec("command");

效果同system命令类似,区别是不会开启子进程,而是取代父进程,因此执行完引号中的命令后进程即结束。一般和fork配合使用。

使用命令:

perl testSystemCall.pl 2

执行了exec("perl printCallInfo.pl $i");,得到下面的结果:

Begin loop to invoke system call:
This perl script is called 1 times

结果出乎意料,如果你刚才还不太理解这一小节引用的那句话,现在应该明白了。exec命令取代了父进程,执行一次结束之后进程结束,因为这个进程就是父进程本身,因此父进程也跟着结束了。testSystemCall.pl脚本中的后续内容也就不会执行了。

3. `command`

使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车。反引号中的变量在编译时会被内插为其值。

好像更不好理解了。先执行一下:

perl testSystemCall.pl 3

执行了`perl printCallInfo.pl $i`;这句代码,显示如下:

Begin loop to invoke system call:
End loop.

什么都没打印,好像没执行一样。其实已经执行了,只是`perl printCallInfo.pl $i`没有把printCallInfo.pl中的输出直接输出到屏幕上,而是返回给了testSystemCall.pl,只是我们在testSystemCall.pl中并没有接收这个返回值。

我们修改一下testSystemCall.pl,将

($exceType == 3) and `perl printCallInfo.pl $i`;

改成:

($exceType == 3) and print `perl printCallInfo.pl $i`;

我们将`perl printCallInfo.pl $i`返回的内容再重新打印出来,重新执行:

perl testSystemCall.pl 3

显示如下:

Begin loop to invoke system call:
This perl script is called 1 times
This perl script is called 2 times
This perl script is called 3 times
This perl script is called 4 times
This perl script is called 5 times
End loop.

显示内容是不是更符合我们的期望了~

3. 参考资料

SCRATCH的预测结果格式

Overview

最近在预测蛋白质序列的二级结构,结构性区域,水溶性等特征时,使用了不同的软件,发现不同软件预测结果中对同一特征的表示方式略有不同,所以在这里一并总结。

1. SCRATCH中的输出格式

我们在 SCRATCH的安装和使用 介绍了SCRATCH的安装和使用,直接使用

./run_SCRATCH-1D_predictors.sh input_fasta  out_prefix  [num_threads]

就可以得到四个结果,分别是SSpro(后缀为.ss)SSpro8(后缀为.ss8)ACCpro(后缀为.acc)ACCpro20(后缀为.acc20)

以下面一段氨基酸为例:

MQIFVKTLTGKTITLEVEPSDTIENVKAKI

产生的结果格式如下:

SSpro预测产生的二级结构序列(.ss文件):
CEEEEEEECCCEEEEEECCCCCHHHHHCCC

SSpro8预测产生的二级结构序列 (有8个种类,.ss8文件):
CEEEEEEEESEEEEEEECCCSHHHHEECCC

ACCpro预测产生的水溶性 (exposed threshold为25%,.acc文件):
ee---ee-eeee-e-e-eeeee-ee-eeee

ACCpro20预测产生的水溶性 (.acc20文件):
0%   eeeeeeeeeeeeeeeeeeeeeeeeeeeeee
5%   eeeeeeeeeeeeeeeeeeeeeeeeeeeeee
10%  eeeeeeeeeeeeeeeeeeeeeeeeeeeeee
15%  eee--eeeeeee-e-eeeeeeeeeeeeeee
20%  eee--ee-eeee-e-eeeeeeeeee-eeee
25%  eee--ee-eeee-e-e-eeeeeeee-eeee
30%  ee---ee-eeee-e-e-eeeee-ee-eeee
35%  ee---ee-eeee-e-e-eeeee-ee-eeee
40%  ee---ee-eeee-e-e-eeeee-ee-eeee
45%  ee---e--eee----e---ee--ee-eeee
50%  ee--------e--------e---ee-eeee
55%  e----------------------e---eee
60%  e--------------------------eee
65%  e---------------------------ee
70%  -----------------------------e
75%  ----------------------------e
80%  -----------------------------e
85%  -----------------------------e
90%  ------------------------------
95%  ------------------------------
100% ------------------------------

上面是 官方的帮助文档 给出的输出格式,实际上我算出来的结果.acc20文件与这个不一样,其他都一致。

2. SCRATCH输出格式说明

这里重点说明SSpro(后缀为.ss)SSpro8(后缀为.ss8)ACCpro(后缀为.acc)这三个,以及 DISpro(没在SCRATCH安装包中,需要单独装)的输出格式,并列出了其他同类软件的不同表示。

2.1 SSpro(后缀为.ss)

输出的蛋白质二级序列有三种类别:

  • H = helix
  • E = strand
  • C = the rest

PSIPRED(参见 PSIPRED的安装和使用 )产生的二级序列类别一致。

2.2 SSpro8(后缀为.ss8)

输出的蛋白质二级序列有八种类别:

  • H: alpha-helix
  • G: 310-helix
  • I: pi-helix (extremely rare)
  • E: extended strand
  • B: beta-bridge
  • T: turn
  • S: bend
  • C: the rest

2.3 ACCpro(后缀为.acc)

水溶性的表示如下:

  • - : the residue is buried
  • e : the residue is exposed

也见过如下形式的表示:

  • b : the residue is buried
  • e : the residue is exposed

2.4 DISpro

非结构性区域的表示方式为:

  • O : the residue is ordered
  • D : the residue is disordered

DISOPRED(参见 DISOPRED的安装和使用)中的表示方式为:

  • . : the residue is ordered
  • * : the residue is disordered

3. 参考资料

BioPerl(三):巧用BioPerl格式化fasta文件

Overview

在处理fasta格式序列的过程中,我们经常会发现得到的fasta格式并不是很标准,比如有一个fasta文件中有多条这样形式的序列:

>gi|28898692|ref|NP_798297.1| hypothetical protein VP1918 [Vibrio parahaemolyticus RIMD 2210633]|1
MKKTTLMSAVVATLSLVGCQSTTGSSDAQPEQTSHISQAVYEVEFHAAQSFLSQASQLEQSFADFCLAPK
NDVEPVQQQWHSTMLAWMALQGQERGPATALEQSWNVQFWPDKKNTTGRKMSALTKADKVWTVEEISTQS
VTVQGLGALEWLLYDDASTLNTNSNVCASGVAIAENLHDKAQIIANSWAENPWKSLQKTEWESEYISLLS
NQLEYSMKKLSRPLAKIGHPRPYFSESWRSETSLSNLKANLESLHQLYFANGKGLDALLRAQGKTQLADR

它的序列内容并不是一行,而是四行,尽管这是被允许的,但是有的时候出于一些目的,我们想要序列的内容是一行,而不是多行。

我自己写了一个脚本用来将每一行的换行符去掉,并保留最后一行的换行符,代码看起来很丑陋。既然BioPerl可以帮我们自动处理序列的很多信息,那是否也能帮我们格式化序列的内容,我抱着试试看的态度试了一下,真的可以...

1. BioPerl格式化fasta序列

其实复用了 BioPerl(二):使用BioPerl读取fasta文件 中的脚本:

#!/usr/bin/perl -w
use strict;
use warnings;
use Bio::SeqIO;
use Bio::Seq;

my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"unFormatedFastaFile.fasta", -format=>'fasta');

# 在这儿处理每个序列的信息
while(my $seq_obj = $catchseq_seqio_obj->next_seq)
{
    # ...
    my $seq = $seq_obj->seq; 
    # ... 
    # 重新拼成fasta格式
    # 注意,$display_name中是不包含fasta的标识符>的,所以拼接时要手动加上>
    my $seqContent = ">".$display_name.$desc."\n".$seq."\n";                   
}
# 省略了将 $seqContent重新写到文件..

只需要使用BioPerl把不标准的Fasta格式文件读取到,再写到新的文件中就可以了,重写之后,格式为:

>gi|28898692|ref|NP_798297.1| hypothetical protein VP1918 [Vibrio parahaemolyticus RIMD 2210633]|1
MKKTTLMSAVVATLSLVGCQSTTGSSDAQPEQTSHISQAVYEVEFHAAQSFLSQASQLEQSFADFCLAPKNDVEPVQQQWHSTMLAWMALQGQERGPATALEQSWNVQFWPDKKNTTGRKMSALTKADKVWTVEEISTQSVTVQGLGALEWLLYDDASTLNTNSNVCASGVAIAENLHDKAQIIANSWAENPWKSLQKTEWESEYISLLSNQLEYSMKKLSRPLAKIGHPRPYFSESWRSETSLSNLKANLESLHQLYFANGKGLDALLRAQGKTQLADR

可以看到序列中的换行符已经去除了。既然可以格式化序列内容,也可以顺便做点别的,比如读取一个fasta序列时,去除那些序列长度过小的序列,不然使用有些特征提取算法时会出现异常。

2. 使用BioPerl去除fasta文件中长度过短的序列

这里给出一个完整点的例子,写一个叫removeShortFastaEntries.pl,内容如下:

#!/usr/bin/perl -w

# usage: perl removeShortFastaEntries.pl original.fasta formatedEntries.fasta [50]

use strict;
use warnings;
use Bio::SeqIO;
use  Bio::Seq;

# 在命令行设置要处理的fasta文件名字
my $input_file = $ARGV[0] or die "Need to input fasta file on the command line\n";
# 在命令行设置处理后的fasta文件名字
my $output_file = $ARGV[1] or die "Need to input output file name on the command line\n";
# 在命令行设置序列长度阈值,只有大于这个长度的序列才保留,默认是50
my $length_threadhold = ($ARGV[2] or 50);

print "The sequence whose length is no more than $length_threadhold will be removed!\n";

my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"$input_file", -format=>'fasta');
# 创建一个文件句柄,准备写入处理后的序列
open (O,">$output_file");
while(my $seq_obj = $catchseq_seqio_obj->next_seq)
{
    # 处理每个序列的信息
    my $display_name = $seq_obj->display_name; 
    my $desc = $seq_obj->desc;                                
    my $seq = $seq_obj->seq;                                 
    my $seq_type = $seq_obj->alphabet;                   
    my $seq_length = $seq_obj->length;
    # 长度大于$length_threadhold,就写出新的文件。
    if($seq_length > $length_threadhold)
    {
        my $seqContent = ">".$display_name." ".$desc."\n".$seq."\n";
        # 打印到屏幕的提示信息
        print "Writing formated data to $output_file\n";
        print $seqContent;
        # 写入文件
        print O $seqContent;
        print "success!\n";
    }
}
#关闭文件
close O;

用法如下:

perl removeShortFastaEntries.pl original.fasta formatedEntries.fasta 60

这里的original.fasta,不是一定要后缀名是.fasta,只要文件里面的内容是fasta格式的序列就可以了,名字可以是original.outoriginal.txt等。最后的数字是可选参数,如果不指定,默认是50。

BioPerl(二):使用BioPerl读取fasta文件

Overview

BioPerl(一):安装BioPerl 中我们不只安装了BioPerl,还给出了一个使用BioPerl的手动构造了一个Bio::Seq对象的例子,这个对象中包含了我们手动填入的fasta格式的信息。既然可以手动构造,那么也就可以从fasta文件中读取序列信息,由BioPerl自动填充成Bio::Seq对象。

1. 使用BioPerl读取单条fasta序列

我们有一个名字叫做singleEntry.fasta的文件,里面有一条序列内容:

>gi|28898513|ref|NP_798118.1| hypothetical protein VP1739 [Vibrio parahaemolyticus RIMD 2210633]|1
MTSQKNIEEQDEVVVIEERDKRTHIYIAIAAVLGLAFGGLAGSVLTANKWESTYQVLEDKYQALAQDKTALVSQVKTREESLDKEIQEKVDALLAEKDAAHQKALKKLQTQLTEVEKVNLSLESQVKQQNDKLSSSKTENEKLTRQADMQATMFERSREVFQKELKISQDLEALEKEREKLLPKIDKLKKECDVFLEGKSWDVKSDACDKHDEANSRLSQIDQLIEVYKMDLKQIKEITSDMGL

这是一个标准的fasta格式的序列,一共有两行,第一行是序列的各种标识,第二行是序列内容,注意,整个序列是一行,只是因为序列太长显示不下,才会自动换行。

我们写了一个名叫readSingleFastaByBioPerl.pl的脚本,内容如下:

#!/usr/bin/perl -w
use strict;
use warnings;
# Bio::SeqIO类用来读取文件
use Bio::SeqIO;
# Bio::Seq类用来存储fasta序列,一条fasta序列对应一个Bio::Seq对象
use Bio::Seq;

# 读取fasta文件,文件名可以用单引号,也可以用双引号,
# -format指定了文件的内容是fasta格式,注意这里的文件不一定是.fasta后缀名,只要内部序列是fasta格式就可以了,文件名可以是.txt或者.out等后缀。
my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"singleEntry.fasta", -format=>'fasta');
# Bio::SeqIO读取一个文件,会创建一个Bio::SeqIO对象,这里名字叫$catchseq_seqio_obj,有多少条序列,就会有多少个Bio::Seq对象
#下面这句取Bio::Seq对象的方法看起来像是一个典型的迭代器的遍历方法,只是我们这里只有一条序列,所以取一次就可以了。
my $seq_obj = $catchseq_seqio_obj->next_seq;

# Bio::Seq对象($seq_obj)只能改包含了很多序列相关的属性,使用下面的方式取出来。
#  序列名字
my $display_name = $seq_obj->display_name; 
#  序列的描述
my $desc = $seq_obj->desc; 
#   序列字符串                  
my $seq = $seq_obj->seq;    
#   序列的类型(dna还是蛋白质?)                           
my $seq_type = $seq_obj->alphabet; 
#   序列的长度                   
my $seq_length = $seq_obj->length;                   

#使用双引号时,$display_name会显示为$display_name存储的内容,如果想显示$display_name这几个字符,需要使用\$display_name,去掉$的引用含义。
#使用单引号时,$display_name会显示为这几个字符本身
print "\$display_name:\n$display_name\n";
print "\$desc:\n$desc\n";
print "\$seq:\n$seq\n";
print "\$seq_type:\n$seq_type\n";
print "\$seq_length:\n$seq_length\n";

运行脚本readSingleFastaByBioPerl.pl

perl readSingleFastaByBioPerl.pl

显示如下:

$display_name:
gi|28898513|ref|NP_798118.1|
$desc:
hypothetical protein VP1739 [Vibrio parahaemolyticus RIMD 2210633]|1
$seq:
MTSQKNIEEQDEVVVIEERDKRTHIYIAIAAVLGLAFGGLAGSVLTANKWESTYQVLEDKYQALAQDKTALVSQVKTREESLDKEIQEKVDALLAEKDAAHQKALKKLQTQLTEVEKVNLSLESQVKQQNDKLSSSKTENEKLTRQADMQATMFERSREVFQKELKISQDLEALEKEREKLLPKIDKLKKECDVFLEGKSWDVKSDACDKHDEANSRLSQIDQLIEVYKMDLKQIKEITSDMGL
$seq_type:
protein
$seq_length:
244

可以看出,Bio::Seq对象帮我们解析了序列信息并按照指定的格式存储起来。第一行的序列标志被分成了两部分,以第一个空格为分割,前面是序列名称,存在属性display_name中,后面是属性描述,存在属性desc中。序列被完整地存在了seq属性中,除了这些序列中包含的信息之外,Bio::Seq对象还分析了序列的其他属性,如序列类型,序列长度等。

其实Bio::Seq对象不只有这些属性,参考HOWTO:Beginners,可以找到这个对象所有的属性。

BioPerl(一):安装BioPerl 中构造Bio::Seq对象的例子比较不难发现,每个属性都有一个get和set方法。以display_name属性为例,当我们构造Bio::Seq对象时,我们使用display_name属性的set方法$seq_obj->display_name("gi|147605|gb|J01673.1|ECORHO");为该属性赋值,当我们读取Bio::Seq对象的display_name时,我们使用该属性的get方法$seq_obj->display_name,这是一个通用的方式,可以以JAVA的get/set方式类比这种存取变量的方式。

2. 使用BioPerl读取多条fasta序列

在实际过程中,我们读取的文件中通常包含了多条fasta序列。其实前面已经提到了,一个Bio::SeqIO对象对应一个读取的文件,里面有多少fasta序列,Bio::SeqIO对象中就有多少个Bio::Seq对象,因此只要循环取一下就可以了:

#!/usr/bin/perl -w
use strict;
use warnings;
use Bio::SeqIO;
use Bio::Seq;

my $catchseq_seqio_obj = Bio::SeqIO->new(-file=>"multipleEntry.fasta", -format=>'fasta');

#  在这儿处理每个序列的信息

#更像Iterator了,$catchseq_seqio_obj->next_seq返回一个Bio::Seq对象,当读取完所有的Bio::Seq对象之后,$catchseq_seqio_obj->next_seq就会返回undef,循环结束。
while(my $seq_obj = $catchseq_seqio_obj->next_seq)
{
    # 序列名字
    my $display_name = $seq_obj->display_name; 
    # 省略下面的...               
    print "\$display_name:\n$display_name\n";
    # 省略下面的...
}

3.参考资料

BioPerl(一):安装BioPerl

Overview

今天闲暇之余,看到了一篇关于BioPerl的博客 初品BioPerl(第三篇:从本地文件中获取fasta序列),发现BioPerl可以让很多事变得简单,fasta格式处理起来也事半功倍。 其实宋老师之前已经跟我提过BioPerl了,只不过我一直以任务为导向,觉得perl脚本就够处理,所以一直也没去了解。好东西自然马上就要用起来,我也马上装上了BioPerl,这里记录下来BioPerl的安装,以后有需要,就把BioPerl相关的东西持续写下去。

1. BioPerl的安装

直接查看BioPerl的文档 BioPerl Main Page,提供了从安装到快速入门等各种文档,这里我参考的是Installing BioPerl on Unix,实际上,无论你用的是Mac还是各种版本的Linux,都可以参考这个页面,因为这里提供了一种通用形式的安装方式:Installing using CPAN

1.1 perl的版本

使用

perl -version

查看你系统中的perl版本号,我的系统中perl版本信息为:

This is perl 5, version 16, subversion 3 (v5.16.3) built for darwin-thread-multi-2level

Young说使用perl 6没办法安装BioPerl,可能是因为perl 6版本太新了,还没有对应的BioPerl模块,所以这里我们安装前要确保使用的perl版本号是perl 5

1.2 CPAN是什么?

百度百科关于CPAN的解释清晰明了:

CPAN(Comprehensive Perl Archive Network)中译为“Perl综合典藏网”,“Perl综合档案网”或者“Perl程序库”。它包含了极多用Perl写成的软件和其文件。
CPAN亦是一支Perl程序的名字,其作用是让使用者容易从CPAN下载、安装、更新及管理其他在CPAN上的Perl程式。
CPAN的成功引来很多其他编程语言社群的模仿。CTAN和CRAN都参考了CPAN的命名方式。另外PEAR(PHP Extension and Application Repository)也是类似CPAN的PHP程式网站。

你也可以通过 CPAN官网 查看CPAN相关的各种信息,比如CPAN中的模块,CPAN的镜像等。

其实不止PHP,如果有使用R语言的经验,就会马上想起到R语言的程序库CRAN,当你使用R语言的install.packages函数去安装包时,实际上R语言就是去CRAN中找到这个包,然后下载下来并安装到你的本地环境中。

CPAN安装BioPerl只需要几句命令就可以了,perl会自动把BioPerl放在指定的位置并配置到路径,完全不需要手动参与。

1.3 升级CPAN

既然CPANperl的在线程序库,那么CPAN中的内容就是一直不停更新的,所以安装一个perl库之前,先升级一下CPAN总是好的。

假设你的电脑上已经安装配置好了perl,使用下面的命令更新CPAN

perl -MCPAN -e shell

执行了这条命令,命令行就会进入CPAN的执行环境,等待你输入新的指令,输入

install Bundle::CPAN

执行CPAN升级,注意这句命令的名字是install,如果你本地还没有CPAN,那么就会下载配置最新的CPAN到本地,如果已经有了CPAN,那么更新到最新。

安装或者更新完CPAN之后,使用

q

退出CPAN的执行环境。

1.4 安装/升级Module::Build,并设置为默认安装器

使用

cpan

进入CPAN的执行环境,并依次输入下面几条指令:

install Module::Build
o conf prefer_installer MB
o conf commit
q

上面几条执行依次完成了安装,配置,提交配置,退出CPAN的执行环境。

1.5 安装expat库 (Optional)

其实我装BioPerl的时候并没有装这个库,而是在写这篇blog的时候才装,如果你需要处理xml文件,可能你需要安装expat库,

  • 如果使用的是Ubuntu,可以直接使用下面的命令安装:

    sudo aptitude install libexpat-dev

  • 如果使用的是别的linux系统或者mac,使用下面的方式:

    1. 使用wget下载expat

       wget http://sourceforge.net/projects/expat/files/expat/2.0.1/expat-2.0.1.tar.gz
      

      或者直接在浏览器中输入

       http://sourceforge.net/projects/expat/files/expat/2.0.1/expat-2.0.1.tar.gz/download
      

      下载。

    2. 解压expat-2.0.1.tar.gz并进入

       tar  -zxvf expat-2.0.1.tar.gz
       cd expat-2.0.1
      
    3. 配置expat

       ./configure --prefix=/usr/bin
      
    4. 如果你没有将expat库安装在/usr/bin这样的系统目录,而是安装在了自己的自定义目录,比如/non-standard这个目录,你需要告诉CPAN,进入CPAN的执行环境:

       cpan
      

      输入下面的指令:

       o conf makepl_arg "EXPATLIBPATH=/non-standard/lib EXPATINCPATH=/non-standard/include"
       o conf commit
       q
      

    不过不推荐这种方式。

1.6 使用CPAN安装BioPerl

使用

perl -MCPAN -e shell

或者直接使用

cpan

进入CPAN的执行环境,输入:

d /bioperl/

会显示出来下面的信息:

cpan[1]> d /bioperl/
Reading '/Users/wangjiawei/.cpan/Metadata'
Database was generated on Fri, 25 Dec 2015 03:17:02 GMT
Distribution    BOZO/Fry-Lib-BioPerl-0.15.tar.gz
Distribution    CDRAUG/Dist-Zilla-PluginBundle-BioPerl-0.20.tar.gz
Distribution    CJFIELDS/BioPerl-1.6.901.tar.gz
Distribution    CJFIELDS/BioPerl-1.6.923.tar.gz
Distribution    CJFIELDS/BioPerl-1.6.924.tar.gz
Distribution    CJFIELDS/BioPerl-DB-1.006900.tar.gz
Distribution    CJFIELDS/BioPerl-Network-1.006902.tar.gz
Distribution    CJFIELDS/BioPerl-Run-1.006900.tar.gz
Distribution    CJFIELDS/Bundle-BioPerl-2.1.9.tar.gz
Distribution    CJFIELDS/Dist-Zilla-PluginBundle-BioPerl-0.23.tar.gz
Distribution    RBUELS/Dist-Zilla-PluginBundle-Bioperl-0.01.tar.gz
11 items found

每个人的电脑显示的信息可能稍有不同,依然是在CPAN的执行环境中,安装CJFIELDS/BioPerl-1.6.924.tar.gz

force install CJFIELDS/BioPerl-1.6.924.tar.gz

注意:这里必须添加force,因为在安装了BioPerl之后,会默认执行大量的test,测试BioPerl的每一个函数,而这些函数依赖很多其他库,如果这些依赖库没有安装在你的电脑里,那么这个测试就会被skip,最后的测试报告就是有大量测试不通过,默认就不会安装BioPerl。但实际上,我们不可能把所有的依赖库都安装上,不安装这些库,依然不影响我们使用BioPerl的常用功能。并且,如果我们用到了一个BioPerl函数依赖某个没安装的库,我们再安装就可以了。使用force就可以忽视这些不通过的测试,依然将BioPerl安装到我们的电脑上。

1.7 运行一个例子

我们采用一个例子(来自 初品BioPerl(第二篇:构造一条fasta序列 )来检查下BioPerl是否已安装:

#!/usr/bin/perl -w

#加载Bio::Seq模块。
use Bio::Seq;  

#调用Bio::Seq模块的new方法,可以建立一个序列对象,命名为$seq_obj。
$seq_obj = Bio::Seq->new; 

#给这个新建的$seq_obj对象赋予三个属性的值:dispaly_name(序列的名称),desc(序列的描述)以及seq(序列的内容) 
$seq_obj->display_name("gi|147605|gb|J01673.1|ECORHO");
$seq_obj->desc("E.coli rho gene coding for transcription termination factor");
$seq_obj->seq("AACCCTAGCACTGCGCCGAAATATGGCATCCGTGGTATCCCGACTCTGCTGCTGTTCAAAAACGGTGAAG");

#创建了三个普通的标量变量来存放三个属性值
my ($fasta_name,$fasta_desc,$fasta_seq); 

#调用对象的display_name方法来得到名称
$fasta_name = $seq_obj->display_name; 
#调用对象的desc方法来得到描述
$fasta_desc = $seq_obj->desc; 
#调用对象的seq方法来得到序列        
$fasta_seq = $seq_obj->seq;     

#现在可以打印三个属性值了 
print "NAME:\t$fasta_name\nDESCRIBE:\t$fasta_desc\nSEQUENCE:\t$fasta_seq\n";

执行这个perl脚本,打印出来下面的结果:

NAME:   gi|147605|gb|J01673.1|ECORHO
DESCRIBE:   E.coli rho gene coding for transcription termination factor
SEQUENCE:   AACCCTAGCACTGCGCCGAAATATGGCATCCGTGGTATCCCGACTCTGCTGCTGTTCAAAAACGGTGAAG

可以看到,已经可以正常使用BioPerl了。