友情提醒:学习 Perl

BioPerl 是 Perl 的扩展模块,所以在学习 BioPerl 之前自然应该了解 Perl 语言。哦,错了,不只是了解,应该熟练掌握!

至少就我们国家的情况来看,Perl 作为一门编程语言在计算机程序员中还不是很流行(相比较而言 C 或 C++ 之类的编译型语言更受欢迎),但幸运的是介绍 Perl 语言的教材却不少,可见以 Perl、Python 为代表的“解释型”语言在IT界也是越来越有活力了。在此我向大家隆重推荐由 O'Reilly Media, Inc 出版,Randal L.Schwartz, Tom Phoenix 和 brian d foy 编著的入门教材 Learning Perl,写得相当精彩有趣。基本上掌握了这本书的内容就相当于掌握了 Perl 编程的基础。我们都亲切地称之为 “小驼书”。

关于模块

BioPerl 就是一组 Perl 的模块,所以在学习 BioPerl 之前了解一下 Perl 的模块知识也是十分重要的。

来看“小驼书”中的一个例子:在变量 $name 中存放了一个文件路径名,请取出它的文件基名(basename)和目录名(dirname),再把它们重新连接成完整的文件名(咋一看这个操作很无聊,没关系,这只是个例子而已)。

如果不用模块,就得这么写:

                    my $name = "/usr/local/bin/perl";
                    (my $basename = $name) = ~s%.*/%%;         # 取出文件基名$basename
                    (my $dirname = $name) = ~s%(.*)/.*$%$1%;   # 取出目录名$dirname
                    my $filename = "$dirname/$basename";       # 将文件基名和目录名连接起来
                

第二句和第三句实在是很令人困惑,看了半天才能想清楚 s%(.*)/.*$%$1% 是要干什么。如果改用模块写,就稍微清楚一些:

                    use File::Basename;
                    use File::Spec;
                    my $name = "/usr/local/bin/perl";
                    my $basename = basename $name;
                    my $dirname = dirname $name;     # 现在是动听的名字basename和dirname,
                                                     # 而非枯燥的s%.*/%%
                    my $filename = File::Spec->catfile($dirname,$basename);
                

模块 FAQ

详细的模块知识需要参考《Intermediate Perl》(俗称羊驼书)。由于这本书目前尚无中文翻译版,故没有小驼书那么普及。不过,如果你只想用一用 BioPerl,那么不看羊驼书也没关系。

(1)use File::Basename; 这句代码为什么中间有两个冒号?

答:这是告诉 Perl 你需要使用的模块的名称和路径。我们要用的模块名称叫做 Basename.pm(后缀名 .pm 不写),它是存放在 File 这个 文件夹里。那么 File 这个文件夹是存放在什么地方呢?这就要提到 Perl 里面一个很重要的特殊数组:@INC。你不妨可以在终端键入这条命令(其实是一条非常简短的 Perl 程序,打印出数组 @INC 的内容)

                    perl -e 'print "@INC\n"';
                

我的结果是这样的:

                    /etc/perl /usr/local/lib/perl/5.10.1 /usr/local/share/perl/5.10.1
                    /usr/lib/perl5 /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10 
                    /usr/local/lib/site_perl .
                

一共显示了 9 个目录!(包括一个当前目录,就是最后那个点号.)当 Perl 看到了 use 语句之后,就会依次沿着这 9 个目录去寻找 File 这个文件夹。现在你应该明白这是怎么一回事了吧?

(2)我如何知道自己需要使用那些模块?还有模块的位置?

答:这个就没有捷径了,只能自己勤查文档。

(3)我如何知道系统上是否已经安装了某个模块?

答:使用 perldoc 命令(后面跟上模块名就行了,比如 perldoc File::Basename), 可以查看模块的文档。只要能打开它的文档,当然就说明已经安装了对应的模块。(在“小驼书”上亦有有对应的说明,仔细找找吧~)

(4)如果系统上恰好没有安装我需要的模块,我该怎么自己安装?

答:方法有以下几种

我怎样安装 BioPerl?

有些 Linux 发行版会在软件源中提供 bioperl,安装就比较方便。比如 Ubuntu,在自己的“软件中心”中就可以找到 bioperl 这个软件包,相当方便。

bioperl package in Ubuntu
图1.1 Ubuntu 软件中心里的 bioperl 软件包

对于没有专门提供 bioperl 软件包的操作系统,或者对于 Windows 操作系统来说,安装会稍微麻烦一些。BioPerl的官方网站给出了详细的安装说明:

此外上面说到的“懒人方法”也是适用的,就是把 .pm 文件下载下来,扔到某个 @INC 里面。(注意如果是 A::B::C 这种类型的,就要小心目录结构了)

面向对象

BioPerl 的大部分模块都是面向对象的!“面向对象”是一个听起来既时髦又悬乎的词语。

您可能会说,我从来没听说过 Perl 语言是面向对象的呀。 其实,所谓的“面向对象”和“面向过程”不过是一种编程的思路而已,与具体语言无关。我们开始学习编程时无一例外地接触的是面向过程。那么两者之间的差别在哪儿呢?差别非常大,但是又很有趣。请听下回分解。