为什么Perl在生物研究中被广泛使用?

28

我是一名学生,在生物研究所担任技术支持人员,似乎到处都在使用Perl。虽然并非每个项目都需要使用Perl,但是这里超过一半的人都在办公室或桌子上放着几本Perl书。

为什么Perl在生物学中被如此广泛地使用?


2
可能是因为它是一种功能强大的解释型语言,而且它的存在比Python久吧?就像很多科学代码都是用Fortran编写的一样-在那个时候它就是编译型语言 - Cascabel
2
你有问过你一起工作的人吗? - Peter Alexander
@Poita_:好决定。当然,他们可能会说类似于Paul和我所说的话——这只是我们使用的东西,所有的程序都是用它编写的... - Cascabel
这是真的 - 我应该问我互动的人。我会这样做。今天,我和一位研究员谈论她的汇编程序,她告诉我他们快要完成用Java重写它了。第一个版本是用Perl编写的,她说那是一团糟。 - Kevin
4
其他科学使用FORTRAN,游戏开发者使用C++的原因是:现有的库。 - jrockway
2
@Kevin:她应该使用perltidy和perlcritic。 - Alexandr Ciornii
12个回答

47

林肯·斯坦(Lincoln Stein)在他的文章中强调了Perl语言在生物信息学中的一些优势:《Perl如何拯救人类基因组计划》

从他的分析中可以得知:

我认为有几个因素起到了作用:

  1. Perl非常适合切片、切割、扭曲、压平、汇总和其他文本操作。虽然现在生物科学涉及大量数字分析,但大多数原始数据仍是文本:克隆名称、注释、评论和参考文献。即使DNA序列也很类似于文本。将不兼容的数据格式互相转换就需要进行文本操作并结合创造性的猜测。Perl强大的正则表达式匹配和字符串操作运算符可以简化这个工作,这是其他现代语言无法比拟的。

  2. Perl具有宽容度。生物数据经常是不完整的,字段可能缺失,或者预期出现一次的字段却出现了多次(例如,由于实验重复运行),或者数据是手动输入的,不太符合预期的格式。如果一个值为空或包含奇怪的字符,Perl并不会特别介意。可以编写正则表达式来检测和纠正数据输入中的各种常见错误。当然,这种灵活性也可能是一种诅咒。我在下面将更多地讨论Perl的问题。

  3. Perl以组件为导向。Perl鼓励人们使用小模块编写软件,可以使用Perl库模块或经典Unix工具导向方法。外部程序可以轻松地通过管道、系统调用或套接字并入Perl脚本。Perl5引入的动态加载器使人们能够使用C例程扩展Perl语言,或者使整个编译库可供Perl解释器使用。目前正在进行一个名为“BioPerl”的模块集的努力,旨在收集有关生物数据的全球智慧(在稍后发表的Perl期刊文章中详细讨论)。

  • Perl易于编写且开发速度快。解释器不要求您提前声明所有的函数原型和数据类型,新的变量会在需要时自动创建,对未定义的函数的调用仅在需要该函数时才会引发错误。调试器与Emacs良好配合,并允许舒适的交互式开发风格。

  • Perl是一种很好的原型设计语言。因为Perl开发迅速,经常有意义将新算法先在Perl中进行原型设计,然后再将其移植到较快的编译语言中。有时候Perl已经足够快,这样算法就无需移植;更常见的情况是,在C中编写算法的小核心部分,将其编译为动态加载模块或外部可执行文件,并将应用程序的其余部分留在Perl中(例如使用此方式实现的复杂基因组映射应用程序,请参见http://waldo.wi.mit.edu/ftp/distribution/software/rhmapper/)。

  • Perl是一种很好的Web CGI脚本语言,并随着越来越多的实验室开始利用网络发布数据而变得越来越重要。


  • 1
    @mobrule:关于第6点,你的分析是来自2010年还是从一本旧书中得到的??? - Philippe
    1
    该分析摘自链接文章,该文章来自1996年夏季。 - mob
    抱歉我没有看源代码...我在想今天还有谁在为大型网站编写CGI脚本 😉 - Philippe
    @Philippe:这已经很老了。Bioperl 很久以前就出现了,而且被广泛使用。我自己也因为同样的原因使用 Python。 - Chinmay Kanchi

    16

    真正的答案可能与Perl无关,很多事情都是历史的偶然性。当时,Perl非常流行,Java越来越受欢迎,Python并没有引起太多人的注意,而Ruby刚刚开始崭露头角。

    那些需要完成工作的人使用Perl编写了一些库,并且其他人开始使用这些库。一旦人们开始使用某个对他们有用的东西,他们倾向于不更改(经济学家称之为“转换成本”)。从那里开始,更多的人开始使用它,因为许多其他人正在使用它。

    今天可能不会出现相同的演变。我认为Perl、Python和Ruby都完全足够胜任。所有Lincoln Stein在mobrule中引用的话今天都适用于这三个语言中的任何一个。如果每个人今天都必须从零开始,其中任何一种语言都可能成为每个人使用的语言。

    我注意到,从我的客户群体中(生物科技公司的一个非常小而不具代表性的样本),推动大部分生物技术编程的人似乎至少是支持科学家的兼职系统管理员。科学家担心科学,做一些轻度的编程,但IT支持人员为非科学部分提供了大量的支持。Perl非常适合作为系统管理员工具,因为它是互联网的“胶带带子”。


    4
    我倾向于不同意这里的观点。Perl确实非常表达性强,因此如果您的主要关注点不是编程,而是完成工作并回到真正的工作上,那么语言的表达力可以帮助计算机像您一样思考,而更典型的语言则更有助于您像计算机一样思考。 - singingfish
    4
    虽然Ruby和Python与Perl非常相似,但它们的正则表达式引擎不如Perl好。 它们运行速度较慢,也不能做太多“疯狂”的事情。通常这不是问题,因为如果你要做一些非常疯狂的事情,语法可能更适合,但是你必须教所有那些生物学家语法、递归下降解析等。 - mpeters
    1
    尽管Perl可能更强大,但我发现大多数人在学习Perl时几乎不使用其中的所有功能。 - brian d foy
    @briandfoy:这对几乎所有编程语言都是正确的。 对于C ++,它比Perl更加正确。 - slebetman
    1
    我同意@singingfish。 - hepcat72

    12

    也许是因为Perl擅长操作字符串,而遗传学中的许多研究涉及对非常长的 "ACTGCATG..." 字符串进行操作。我只是猜测...


    什么使得Perl在操作字符串方面非常出色? - Kevin
    10
    他们拥有一个非常出色的正则表达式引擎,并且一直如此。(Larry Wall是RE引擎之神之一,字符串操作的肖似尼格拉斯)。 - Donal Fellows
    1
    @Kevin:这是拉里·沃尔(Perl的创始人)最初的意图 - 成为一种病态折中的垃圾列表器。 :) - Ether
    @Donal:嘿,我们俩同时提到了Larry :) - Ether
    @Ether:你应该去查一下“古神夏布-尼古拉”是什么类型的神灵,确保房间光线充足。;-) - Donal Fellows

    9

    我经常使用Perl处理社会科学研究中的定性和定量数据。在快速完成任务(主要是文本)方面,通过在CPAN上查找库(一个不错的集中位置),通常可以更快地完成任务,这是无可比拟的。

    此外,Perl也是很好的“胶水”,因此如果您有一些仪器记录,并且需要将它们与数据分析程序粘合在一起,则Perl是您的语言。


    8

    3
    没错!但为什么呢? :) 或许我会试着找一本那本书的副本,因为它可能有介绍性的章节来解答我的问题。 - Kevin

    5
    Perl非常强大,特别是在处理文本方面,几乎存在于每个Linux/Unix发行版中。在生物信息学中,不仅序列数据很容易通过Perl进行操作,而且大多数生物信息学算法都会输出某种文本结果。
    因此,像EBI这样的最大生物信息学中心拥有伟大的人物Ewan Birney,他领导了BioPerl项目。该库有许多解析器,适用于各种流行的生物信息学算法结果,并用于操作主要序列数据库中使用的不同序列格式。
    然而,如今Perl不再是生物信息学家唯一使用的语言:随着实验室产生越来越多不同类型的数据类型,其他语言在这些领域中更加普遍地使用。

    例如,R 统计编程语言被广泛用于微阵列和qPCR数据的统计分析(等等)。我们为什么这么多人使用它呢?因为它有非常适合那种数据的库(请参见bioconductor项目)。

    现在,当涉及到Web开发时,CGI 今天不是最先进的技术,但是知道Perl的人可能会坚持使用它。然而,在我的公司里,它已经不再使用了...

    我希望这可以帮到你。


    3

    Perl基本上强制要求非常短的开发周期。这种开发方式可以完成工作。

    这足以抵消Perl的缺点。


    1
    Perl如何强制短的开发周期? - Kevin
    2
    我认为他的意思是“允许”。它如何允许短开发周期?通过使用库和最小化样板文件。你编写的代码解决了你的问题;它不会重新发明轮子或存在于安抚编译器(你好,Java)的目的。 - jrockway
    好的,“允许”通常意味着您进行编辑并立即运行结果。没有先验需要编译、链接等。 - brian d foy

    2

    生物信息学主要涉及文本解析,而Perl是最适合此工作的编程语言,因为它是专门用于字符串解析的。正如O'Reilly的书(Beginning Perl for Bioinformatics)所说:“由于[Perl]在数据中高度发展的模式检测能力,Perl已成为生物数据分析最流行的语言之一。”


    1

    人们错过了DBI,这是一个Perl抽象数据库接口,使得使用生物信息学数据库变得非常容易。

    还有一行代码的角度。您可以编写一个单行代码来重新格式化Perl中的数据,并只需使用-pe标志将其嵌入命令行即可。许多使用AWKsed的人转向了Perl。即使在完整程序中,文件I/O也非常容易和快速地编写,并且与任何工程语言相比,文本转换具有更高级别的表达能力。使用Java甚至Python进行一次性文本转换的人只是懒得学习另一种语言。尤其是Java对JVM实现及其I/O性能具有高度依赖性。

    至少你知道Perl在各个地方的速度快慢,比C I/O稍微慢一点。不要学习grep, cut, sedAWK;只需将Perl作为您的命令行工具学习,即使您不使用它生成大型程序。关于CGI,Perl有很多更好的Web框架,例如CatalystMojolicious,但是CGI和生物信息学肯定是最早使用互联网的重度用户。


    1

    这似乎是一个相当全面的回答。然而,可能有一件事情被遗漏了,那就是大多数生物学家(直到最近,也许)根本没有太多编程经验。Perl的学习曲线比编译语言(如C或Java)低得多,但在文本处理方面,Perl仍然提供了大量功能。那么,如果运行时间更长怎么办?生物学家们绝对可以应对。实验室实验通常需要一个小时或更长时间才能完成,所以等待几分钟来完成数据处理并不会对他们造成影响!

    请注意,我在这里谈论的是出于必要而编程的生物学家。我知道有一些非常熟练的程序员和计算机科学家也使用Perl,这些评论可能不适用于他们。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接