PERLFAQ1(7) Perl Programmers Reference Guide PERLFAQ1(7)

perlfaq1 - 有关 Perl 的一般问题 (2003/11/23 08:02:29)

有关 Perl 的一般的,非技术层次的问题

What is Perl? 什么是 Perl

Perl是一个高阶程式语言,由 Larry Wall和其他许多人所写,融合了许多语言的特性。它主要是由无所不在的 C语言,其次由 sed、awk,UNIX shell 和至少十数种其他的工具和语言所演化而来。Perl对 process、档案,和文字有很强的处理、变换能力,因此举凡有关快速原型设计、系统工具、软体工具、系统管理、资料库连结、图像程式设计、网路连结,和 WWW程式设计等之类的任务,都特别 适合用 Perl来做。这些特长不但使 Perl成为系统维护管理者和 CGI作者的宠儿,就连数学家、遗传学家、新闻从业者,甚至企业管理者也都用 Perl,所以或许您也该用。

谁对 Perl 提供支持?谁开发了它?为什么它是自由的?

Perl自由开放的发行方式要归功于发烧前的 Internet的传统文化及其作者 Larry Wall。Perl是由使用者提供支援。现在 Perl的核心、标准程式库、选择性安装的模组,以及您现在正在阅读的使用说明都出自于义务者之手。详情请见 perl原始码发行版中所附的 README档案底部的私人注记。

值得一提的是,核心发展小组(称为 Perl Porters)的成员是一群高度热情奉献的人仕,全心投入发展出比您所能想像、用钱能买得到还要更好的免费软体。您可经由 http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/http://archive.develooper.com/perl5-porters@perl.org/ 或者新闻服务器 nntp://nntp.perl.org/perl.perl5.porters 或它的 web 界面 http://nntp.perl.org/group/perl.perl5.porters , 也可以订阅邮件列表 perl5-porters-request@perl.org (没有主题的空消息也是可以的) 取得关于新近发展计画 的信息。

尽管 GNU计画将 Perl囊括在它的发行中,但是没有叫「GNU Perl」这样的东西。 Perl既非自由软体基金会所创,亦非由其负责维护。Perl的发行条款同时也较 GNU软体更来得开放。

如果您愿意,您可以购买商业性的 Perl支援。但对大多数使用者来说,非正式性的支援通常已相当足够。详情请见「到哪里可买到商业性的 Perl支援」一问的回 答。

Which version of Perl should I use? 我该用哪一个版本的 Perl?

您绝对该用第五版。第四版不但老旧、功能较局限,而且已经不再维护了。它最后一次的修正 (4.036)是在 1992年。Perl最新的量产发行版本是5.8.2 (但是 5.005_03 和 5.6.2 也被支持)。等到您读这篇文章时,我们可能已经又发行了几个正式的除错版本,同时大概又会有些替下一版 路的实验版出来。本文由此开始凡提及 Perl语言,皆以目前的量产发行为准,除非另外特别注明。所有 5.004 之前的版本都有 buffer 溢出漏洞,是非常严重的问题。

perl4 和 perl5 各代表什么?

perl4 和 perl5 是对 Perl程式语言的两个不同版本的非正式称呼,因为说「perl5」要比说「第 5(.004)版的 Perl」要来得简单。但是有些人误将其会意为:perl5是一个单独的语言;这是不正确的。perl5只不过是对第五个主要发行版本(1994年 10 月)常用的称呼罢了。就像 perl4是指第四个主要发行(1991年 3 月),还有 perl1(1988年 1月)、perl2(1988年 6 月),以及 perl3(1989年 10 月)。

5.0的发行基本上是从零开始,所有程式码完全重新写过的版本。它已经被模组化、物件导向化、微调、精简化,及效率化,以致程式码几乎已变得和原来的不相同了。尽管如此,使用介面大致上仍然相同,而且和先前的版本之间保持了很高的 一致性。参见 perltrap 中的 "Perl4 to Perl5 Traps" .

为了避免「perl5是什么语言?」这类的混淆,有些人索性完全避免「perl5」,而单用「perl」来指称最近的 perl版本。其实用不着这么累就是了。

参见 perlhist 中 Perl 版本的历史

What is Ponie? 什么是 Ponie

At The O'Reilly Open Source Software Convention in 2003, Artur Bergman, Fotango, and The Perl Foundation announced a project to run perl5 on the Parrot virtual machine named Ponie. Ponie stands for Perl On New Internal Engine. The Perl 5.10 language implementation will be used for Ponie, and there will be no language level differences between perl5 and ponie. Ponie is not a complete rewrite of perl5.

For more details, see http://www.poniecode.org/

What is perl6?

At The Second O'Reilly Open Source Software Convention, Larry Wall announced Perl6 development would begin in earnest. Perl6 was an oft used term for Chip Salzenberg's project to rewrite Perl in C++ named Topaz. However, Topaz provided valuable insights to the next version of Perl and its implementation, but was ultimately abandoned.

If you want to learn more about Perl6, or have a desire to help in the crusade to make Perl a better place then peruse the Perl6 developers page at http://dev.perl.org/perl6/ and get involved.

Perl6 is not scheduled for release yet, and Perl5 will still be supported for quite awhile after its release. Do not wait for Perl6 to do whatever you need to do.

"We're really serious about reinventing everything that needs reinventing." --Larry Wall

Perl的发展已稳定了吗?

融合了除错和新功能的量产发行在推出前皆经过广泛的测试。自 5.000发行以来,我们平均一年才出版一次量产发行。

Larry 和 Perl发展小组有时候会修改语言的核心部分,但总是尽一切力量让新版 和旧版保持一致。因此,尽管不是所有的 perl4 scripts都能在 perl5 之下跑得天衣无缝,因升级而导致按照先前版本的 perl所写的程式无法使用的情形几乎不曾发生(除非该程式倚赖已经被去除的 bugs,或使用了极少数新加入的指令来 命名)。

Perl难学吗?

Perl不但容易上手,也容易继续学下去。它看起来和大多数您可能已接触过的语言一样。所以如果您只写过 C 程式、或 awk script、shell script,或甚至只是 Excel的 macro 宏,您已经在半路了。

大多数的任务只需要 Perl语言的一小部分即可完成。发展 Perl程式的座右铭即是「不只一种方法可以达到」(TMTOWTDI; There's More Than One Way To Do It, 有时读作「time today」)。因此,Perl的学习曲线是既平(易学)且长的(如果您要的话,有一大堆够您学的)

最后,Perl(通常)算是解释执行的语言。也就是说您写了程式后不需经由一道中间的编码过程即可测试;这让您可以很快、很容易地测试及除错。这个方便试验的特性又让学习曲线变得更加平坦。

有助于修习 Perl 的一些事:UNIX经验、对几乎是任何一种程式语言的经验、了解 regular expressions(正规表示法),以及看得懂旁人写的程式的能力。如果您有什么想用 Perl来做的事,那么可能已经有前人做过了,而且实例通常可免费取得。还有别忘了新的 Perl模组。模组在这份 FAQ 的第叁部分有详细的讨论,还有【别忘了您的好朋友】 CPAN,这会在第二部分谈到。

How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?

Perl在某些地方比较好,某些地方较差。精确地说到底哪些方面好或坏通常视个人偏好而定,所以在新闻讨论群中问这种问题很可能会掀起一场毫无建设性的圣战。

要比较各语言的异同最好的方法是试着用不同的语言写功能相同的程式。各程式语言都各有属于它们各自的新闻讨论群,您可从中学习(但希望您不是去和人辨论吵 架的)。

如果还是不听劝告的话,可以去看 http://language.perl.com/versus/ 的语言比较

我可以用 Perl来做【某种差事】吗?

Perl有足够的弹性和扩充性,从只需要写短短一行的档案处理工作到复杂的系统,几乎没有什么做不到的。对有些人来说,Perl的是拿来做写 shell程式的理想替代品。其他人则用高阶的 Perl来替代处理许多原先需要用 C或 C++ 一类的低阶语言来达到的程式。哪些差事决定要用 Perl来处理,这一切都得看您(或许还有您的经理...)。

如果您有一个提供 API的程式库的话,您可用 C或 C++来写一个 Perl 延伸,然后便可透过它将程式库中的任何一部分动态载入您的 Perl主程式中。您也可以 反过来,用 C或 C++来写主程式,然后以即时动态载入的方式插入一些Perl程式码,产生一个威力强大的应用程式。参见 perlembed.

话虽如此,对解决某些特定的问题,使用小型、专精,专为特殊用途设计的语言总 是比较方便的。 Perl的设计是尽力地满足各种不同人的需要,因而不特别偏颇任何人。至于特殊功能语言的例子,随便举两个,譬如 prolog 和 matlab 便是。

哪些场合下不适合用 Perl?

当您的主管禁止的时候 -- 不过请务必考虑把他们换掉 :-)。

说真的,如果您已经有用另一个语言写成的应用程式(而且写得很好)的时候,或者是已经有替某些特定的工作设计的语言(例如:prolog, make),这个时候就不需要用 Perl。

由于种种因素,Perl大概不太适合拿来做即时内嵌式系统、属于低层级的作业系统发展工作,例如周边设备的 drivers或环境转换码、复杂的多线共用记忆体应用程式,或非常大的应用程式。您会发现 Perl 本身便不是以 Perl写成的。

刚出炉的 Perl纯码编译器或许可帮忙去除一些上述的限制,但您要了解:Perl在本质上仍是一活性变数语言 (dynamically typed language),而非固性变数 (statically typed)。只要您不将核电厂或脑科手术监视器所用的程式放心地用 Perl来写,您自然就不会闯祸遭殃。这样 Larry晚上也可以睡得安稳些了 :-)。

「perl」和「Perl」有什么不同?

二者差一个位元。喔,您不是说在 ASCII上的差别啊? :-) Larry现在用「Perl」来代表语言本身,而以「perl」来表示该语言的体现,即目前的解译器。因此,作者有句幽默小语说:「只有 perl可以解译 Perl」。要不要遵照这个用法是您的自由。举一反叁的话,我们可依样画葫芦地说「awk 和 perl」还有「Python 和 Perl」,但却不可将「awk 和 Perl」或是「Python 和 perl」摆在一起。

Perl程式应算是 program还是 script?

都无所谓。他半开玩笑地说,"脚本 script 是你让演员来演的。程序 program 是你给观众的。"

最初,脚本是打包的普通的交互的命令序列,-- 也就是说,一个对话脚本,类似 UUCP 或 PPP 对话脚本或者一个 expect 脚本,可以很好地处理一些小事,类似在应用程序启动之前进行一些俄设置等等,类似 .cshrc.ircrc。对话脚本仅仅是驱动已有的程序,并不是独立的程序。

计算机专家会解释说,所有程序都是解释执行的,但是问题是从哪个层次去考虑。如果你问一个不是计算机专家的人,他们可能告诉你,一个 program 是已被编译为机器码,一次编译多次运行的东西,而一个 script 在每次使用时都必须首先翻译为 program

Perl 程序通常不是严格的编译或解释执行的。它们可以被编译为字节码形式 (可以在 Perl 虚拟机中运行) 或者完全不同的其他语言,例如 C 或汇编。你不能仅仅从源程序推断它是否应当被一个纯解释器,一个分析树解释器,一个字节码解释器或者一个本地代码编译器来运行,因此在这里很难给出一个确定的答案

现在 script 和 scripting 已成为被不慎重的人和无知的商人为了自己恶毒的目的而用到的两个词,它们开始拥有奇怪的,贬义的含义,类似 "不严谨 non serious" 或 "不是真正的编程". 因此,一些 Perl 程序员选择不把它们同时比较。

JAPH 是什么?

这是过去一些在讨论群中自称 ``just another perl hacker'' 的人的签名档,Randal Schwartz 开了这样的先河。约有一百个比较早期的版本,可在 http://www.cpan.org/misc/japh 获得。

到哪儿可拿到 Larry Wall 的智慧讽语 (witticisms)?

一百多条 Larry的讽语,源自他【在讨论群】的 posts或原始码,可在 http://www.cpan.org/misc/lwall-quotes.txt.gz 获得

我要如何取信、说服我的系统管理者/上司/属下使用第 5/5.8.3 版的 Perl,而不去用其他的语言?

如果您的管理阶层或属下对没有支援的软体,或是未正式包含在所购买的作业系统中的软体存有戒心的话,您可以试着从有助他们自身利益这方面下手。因为如果程式设计师能由善加利用 Perl的结构、功能性、简单性,和威力而获得更大的生产力的话,那么典型的管理者/上司/员工或许便可因而加以说服。此外,使用 Perl,总的来讲,和其他语言相较,或许也有助于减少交件的时间。强调这个论 点或许对说服他们会有帮助。

如果您的专题碰到瓶颈,特别是有关转译或测试方面的问题,那么 Perl可以说绝对会是一个既可行且快的解决之道。您在当说客的时候,千万别忘了要提:Perl已被世界上许多大型的软硬体公司广泛、大量地使用,极为可靠、有效。事实上,现 Perl已成为许多 Unix业者所售的作业系统的标准配备了。而且如果您无法在 详尽的使用说明,包括这份 FAQ之中为您的问题找到解答的话,送封 post 到新闻讨论群即可。

参见 http://www.perl.org/advocacy/

如果您面对反对 perl升级的声音,那么告诉他们 Perl发展小组已经完全不再维护或支援第四版的 perl了。perl5的另一个大卖点是它有大量的模组和延伸,可大大减少计画的发展时间。还有,告诉他们第四和第五版 Perl之间的差异就如 awk 和 C++的差别一样(嗯,或许没有差得那么明显,但您知道我的意思就好)。如果您想得到支援而且想确保您现在所发展的软体在未来能继续工作的话,那么您得跑有支援的版本。在 2003 年 12 月,这大概也就是说要跑 5.8.2 版的,或者稍微旧一些的版本如5.6.2 (November 2003 发布; 一个修正发行,使得 perl 5.6 在新系统中可以编译,因为 5.6.1发行早在 April 2001) 或 5.005_03 (March 1999 发行), 如果你一定要一个旧版本来保持兼容性,使用 5.004_05 也不坏。比 5.004_05 更旧的版本坚决不能再用

Of particular note is the massive bug hunt for buffer overflow problems that went into the 5.004 release. All releases prior to that, including perl4, are considered insecure and should be upgraded as soon as possible.

In August 2000 in all Linux distributions a new security problem was found in the optional 'suidperl' (not built or installed by default) in all the Perl branches 5.6, 5.005, and 5.004, see http://www.cpan.org/src/5.0/sperl-2000-08-05/ Perl maintenance releases 5.6.1 and 5.8.0 have this security hole closed. Most, if not all, Linux distribution have patches for this vulnerability available, see http://www.linuxsecurity.com/advisories/ , but the most recommendable way is to upgrade to at least Perl 5.6.1.

Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen and Nathan Torkington. All rights reserved.

This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.

Irrespective of its distribution, all code examples here are in the public domain. You are permitted and encouraged to use this code and any derivatives thereof in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit to the FAQ would be courteous but is not required.

译者

萧百龄,两只老虎工作室

本页面中文版由中文 man 手册页计划提供。
中文 man 手册页计划:https://github.com/man-pages-zh/manpages-zh

2003-11-25 perl v5.8.3