Programming Perl》 第三版从最开始就令人深为震撼。它的页数几乎是第二版的两倍。除了右上角的座右铭(TMTOWTDI,"There's More Than One Way To Do It")以及作者外,它们的封面基本相同。然而只要认真看一下目录,您就会发现这并不仅仅是简单的修正版本。因为这里面包含了几乎所有自 5.003 版以来 Perl 语言的变化情况。在增添新内容的前提下,还尽量保持了全文的一致性。
编辑 Linda Mui 和技术编辑 Nathan Torkington 也为这一版书做了很大贡献。本书中几乎没有任何错误。对于这么厚的一本书而言,这简直就是个奇迹。此外,O'Reilly 站点上也给出了一个最新的勘误表(参看 资料)。
这次修订主要针对两个方面。它不但修订原有内容,还大致介绍了自 5.003 版本以来 Perl 语言的变化(虽然比较粗略)。它只是介绍这些变化,并不比较这些新版本中的特性有何异同。这给读者带来了一些困难,因为不同版本之间的差异不小,那些运行 5.005 版本的站点就需要知道在 5.6.0 版本中又发生了什么样的变化。
运行 "perldoc perldelta" 命令可以看到新版本与上一版本之间的区别。也就是说,如果系统中安装了 5.6.0 版,运行此命令就可以看到该版本与 5.005 之间的区别。类似的,"perldoc perl5004delta" 命令可以看到与 5.004 版本之间的区别。这些信息也可以在 atPerl.com 站点上找到(参看 资料)。当然,本书中也有这些内容的详细归纳,您完全可以从这里获得足够的技术知识。
有什么新的东西?
在 5.003 版发布之后,Perl 又新添了许多特性,包括新的语言结构、模块、语法以及功能。下面是根据 perldoc 中相关内容归纳出来的一些变化。由于这里省略了一些比较微小但也许很有用的变化,在必要的时候您可以自行查阅 perldoc 帮助文档。
5.003 to 5.004 5.004 to 5.005 5.005 to 5.6.0
- 更好的子程序引用语法($ref->{parameters))
- 减少哈希散列切片的工作量
- printf 和 sprintf 操作在内部实现
- 预先分配散列的大小 (keys %hash = 2000)
- 在控制结构中使用 my 关键字 (foreach my $i (1..5) {})
- use VERSION 来指定需要的 Perl 版本或模块版本
- 新的面向对象方法和功能 (isa, can)
- 模块半自动地测试卸载版本
- 常量 (use constant A => 5)
- CGI 模块
- CPAN 模块
- UNIVERSAL 模块
- Math::Complex, Math::Trig modules, 再次肯定 Perl 在数学工作方面所做出的承诺
- pod2html
- 大量新 perldocs 文档
- 加强正则表达式的功能 (lookahead, code execution, conditional parts)
- 伪哈希(和哈希散列一样重要,和数组操作一样快)
- EXPR 支持
- 对正则表达式预编译支持更好
- 更好的子串功能 (还可以取代匹配)
- 接合功能更好
- 一行的循环和逻辑语句
- Data::Dumper (一个不可缺少的调试工具)
- File::Spec (可移植的文件操作)
- Test (用于编写测试内容)
- 大量新 perldocs 文档
- Unicode 和 UTF-8 的支持
- 内插的 named character 和二进制数
- 版本字符串(version strings,v-strings, e.g. 'v5.6.0')
- 子程序的一些新语法特性
- 支持大文件(文件大小可以大于 2GB)
- POSIX 字符集
- exists() 和 delete() 操作可用于数组元素
- 更好用的伪哈希散列
- 更好的 Benchmark module
- 引入 Java Perl Lingo
- Term::ANSIColor (可以支持彩色输出)
- 大量新 perldocs 文档
概述和一些隐秘的细节
本书的概述部分与第二版仅有少许不同,只是在介绍 Perl 语言的同时,适当添加了一些有趣的东西。
在第 2 章和第 4 章中将更详尽地阐述 Perl 语言的发展。所有应当修改的地方都做了更新,包括 "use constant" 语法等。当然,这两章与第二版中的内容也有少许不同。
模式匹配
模式匹配这一章是新添的。第二版中关于这个话题的内容不超过 35 页,而第三版里却大约有 80 页。它对所有的特性都给出例子,尤其是那些先进的新功能更是不遗余力地深入剖析。从哪里开始? Look ahead、cloistered modifiers、conditional sections、named characters, 所有的东西都被提到了。其中 named characters 和字符集是支持 Unicode 的,书中还举出若干例子来展示这些特性。此外,还叙述了 POSIX 字符集的相关内容。
模式匹配这章足以让您掌握 Perl 的这一令人心醉的特性。“不要试图用正则表达式做所有的事情”,这是 Perl 新手应当尽量避免的问题。然而,并不可能在一章里就看到所有关于正则表达式的应用,对于那些希望在 Jeffrey E.F.Friedlis 的 Mastering Regular Expressions 中看到更深入内容的读者,无疑是一种赌注(参看 资料)。
子程序、引用和数据结构
子程序这章主要针对新的语法(原型和属性),以及左值属性(5.6.0)。想象一下可以修改子程序的返回值!直到目前为止,修改对象属性时需要费一些特别的心思,例如使用左值子程序,你就可以直接操作子程序返回的标量。原型则是另一个重要的新特性,任何可能的时候都可以使用(但是并不需要将原有函数翻新成原型)。这一章虽然不长,但却很重要。
对于那些需要用 Perl 来学习数据结构或传递值的读者而言,引用是很有用的。指针这一章主要陈述匿名数据(数组、散列和子程序)、伪哈希散列 (pseudohash)、closures、散列切片、以及引用等内容。对于那些既要编写类又要讲究速度的程序员,伪哈希散列这部分内容是很有帮助的。
由 Jon Orwant, Jarkko Hietaniemi 和 John Macdonaldis 编著的 Mastering Algorithms with Perl
,对于每位试图用 Perl 实现复杂数据结构的程序员都是必须的(参看资料部分)。但
Programming Perl 中数据结构这一章仍然很有用。因为它相当详细完整,并且通过大量的实际例子使得内容更加清楚易懂。此外,它还提到了必不可少的 Data::Dumper 模块(该模块主要用于保存和修复数据)。
格式
在格式 (format) 这一章所阐述的 Perl 特性目前已经不是很通用了。该特性结合了 FORTRAN 的输出格式关键字、BASIC 的输出格式规范、以及 nroff 的特点。如果您曾经用过这三种语言,就会发现 Perl 的格式特性很有用。这一章实际上并没有什么新内容,只不过被抽出来作为独立的章节。仅有 6 页就当成一章可能的确没有什么好理由。
包,模块,对象,重载,绑定变量
在 Programming Perl
的第二版中,没有强调面向对象编程,只用少量内容来介绍它。对于那些希望深刻理解 Perl 中面向对象方法的人而言,是远远不能满足要求的。在第三版中,这一点得到了很大的改观。尽管它在全书的内容中仍处于一种略为受忽略的地位,但它比原先用更长的篇幅更加详细地介绍了 Perl 中的面向对象编程。例如 UNIVERSAL 类的 isa() 和 can() 方法,Class::Struct 以及 lvalue 类方法等在书里都有详细解释。
包和模块对于所有 Perl 程序员而言是很重要的。本书中对这些特性做了更进一步的叙述。不过这两章的内容都不是很多,也许合成一章更好些。如果您希望重用曾编写过的代码(事实上,这是非常必要的),这两章是很有帮助的。尽管它们和第二版中的内容大体上一致,但根据新的特性增添了相应的例子和解释,例如模块版本 (use MODULE VERSION) 等。
操作符重载是全新的一章。因为它是 Perl 语言的一个巨大进步,在第二版中 Perl 还没有重载操作符的能力。本书中有大量的例子,从简单(加减操作符的重载)到复杂(重载数值常量以及运行时间等)一应俱全。
绑定变量 (tied variables) 这章涵盖了这一项有用技术中的所有要点,并更新了绑定文件句柄的方法,以及 CPAN 库中的 Tiemodules 模块列表。此外还举了大量的实例来说明绑定标准标量、数组和散列的方法。
Unicode
要支持 Unicode 是相对困难的,本章解释了难点所在。UTF-8 是 Perl 实现得较好得编码方式。Unicode 协会还规定了其他一些编码方式(如 UTF-16, UTF-32),但 UTF-8 是国际字符集支持得最好的一种。本章末给出了若干 Unicode 资源,其中 Perl, Unicode, 和 I18N FAQ 将更具体地给出在 Perl 5.6.0 版中做了那些关于编码方式的工作,没有做那些工作。需要注意的是,在本书中 Unicode、字符映射表和 UTF-8 编码这三个概念没有细加区分。
在采用 UTF-8 编码的 Perl 程序例子中,你会看到变量的名字可以是非 ASCII 字符。当 Perl 能做到说各种语言的时候,更多的人将会被吸引到 Perl 的世界中来。
Perl 5.6.0 中对 Unicode 的支持无疑是向正确的方向迈进了一步。但它还没有完全成功,还需要注意很多事情。CPAN 中的 Unicode 模块在 5.6.0 以及更老的版本中都可正确运行,如果需要,可以直接使用这些模块。此外,给 Linux 的一些简单应用(如 xterm、mutt)加上 UTF-8 编码支持,也是一项很有趣的挑战。UTF-8 是一个较新的标准,软件中对它的支持也刚刚开始进行。Perl 现在在 Unicode 的支持上落后于 Java。但这也是无可厚非的,因为 Java 最初设计时就考虑了对 Unicode 的支持。
IPC 和线程
IPC(inter-process communications)这一章主要是对第二版中的内容做了一些扩充和修订。提供了一些更好的新例子,并展示采用 IO::Socket::INET 等模块能让您如此轻松地编写网络服务器程序。同时还给出了一个精巧的例子,演示如何采用 v-strings 来发送 CR/LF。
Perl 5.6.0 中线程已经是一个比较稳定比较完善的特性了。线程这部分内容对于那些初次接触线程的程序员是很好的入门参考。这一章简要地概述了线程的算法思想,调整 UNIX 中大家又爱又恨的基于 fork 线程模型。此外还有一些相当好的例子,包括使用 lock 函数和子程序属性。不幸的是,您只有做出明确指定之后,Perl 解释器才能持 Perl 线程程序。因为 Perl 的线程解释器比不支持线程的解释程序要慢。
CLI 和调试
CLI(command-line interface,命令行界面)这章是必读的。因为无论您明智地采用了 -p 控制参数,或是采用 PERL5LIB 变量,这些信息都能够保证将来编写 Perl 程序的时候节省时间。所以请一定要认真地琢磨本章内容。它主要是从第二版中的相关内容扩展而来的,并在此基础上添加了那些影响 Perl 解释器的环境变量信息。
关于 Perl 调试的内容部分,缺憾在于有些东西被略过不提。尽管 Perl 自带的调试器功能强大,但它和 CPAN 库中的 ptkdb 调试器并不亲近。ptkdb 是一种非常好的工具,之所以被忽略,是因为它并不是在所有平台上都能运行的(它需要 Tk 模块)。不过作为一个功能如此强大的工具,无论如何还是应该稍微介绍一下。如果您钟情于自带的调试器,或者因为平台的关系不得不舍弃 ptkdb,则本章将十分有帮助。本书的调试部分比第二版多了大约 10 页,主要增加一些技术信息和例子。此外,还提到了与 Emacs 的结合使用。最后一部分是作者简介,以及若干悬而未决的 NBC 诉讼事件。天知道 Larry Wall 居然还这么喜欢看电视?
编译与 Perl 内幕
编译实际上是 Perl 的内部家务事。通过阅读此章,您可以学到许多有用的技术思想,更易于理解 BEGIN/END/CHECK/INIT 子程序是如何工作、模块是如何运用的。
Perl 内幕这部分内容实际上应该与编译合成一章。对所有的 Perl 用户而言,这些内容很好地介绍了若干不可思议的技术:例如将 Perl 嵌入您的程序,或是用 C 代码来扩充 Perl 语言。不幸的是这章太简短了,不过也许是考虑到本书是入门到中等层次的读物罢。
Perl 文化
第三版中最令人欣喜的莫过于 Perl 文化 (Perl as Culture) 这一章。它详细地介绍了关于 Perl 的种种,远远超出了语言本身。这是从第二版中的一小部分内容扩展而来的,相信会给您带来醉人的感受。
对那些对 Perl 开发由衷感兴趣的人,关于 CPAN 的章节是一个很好的起点。CPAN 是 Perl 模块的最佳资源,值得用一章的篇幅来详细描述它。
关于安全性的部分也做了相当的扩展和修改。从第二版的 4 页变成现在的大约 25 页,增添了许多实用建议以及有用的例子,每一行内容都不容错过。对于 CGI 程序(包括 CGI 模块等)而言,这一章的信息尤为重要。
关于通用操作,编写可移植 Perl、POD (Plain Old Documentation)、和 Perl 文化的内容,都从各方面得到了一定程度的修改与更新。那些渴望参与到 Perl 团体中的人,无论是主动地还是被动地,都一定要仔细阅读这部分的内容。毕竟我们可以从 "Black Perl" 之类的瑰宝之内学到很多有用信息。
特殊名字、函数、语法和标准模块
本章全面地介绍了一些特殊名字、函数、语法以及标准模块,针对 Perl 5.6.0 的新特性括中了新内容,并提供了大量将 Perl 5.6.0 应用于生活的实际例子。并且将参考资料集中放到了本书末尾,便于读者查阅。(在第二版中将这些资料与 Perl as Culture 等零碎内容混在一起,显得稍有些凌乱。)
如果您对每个函数或模块的依赖型有兴趣,则对那些能够支持 Unicode 的模块和函数展开讨论是有用的。但在讲述 Unicode 的章节中可以看到,如果只是在任何东西前面写上一个 "use utf8" 就能够获得 Unicode 支持,那将是极其方便的。
结论
总而言之,本书的第三版无疑是 Perl 发展历史的重大事件。Perl 5.6.0 版本的发布令 Perl 社区的软件大幅度改善,同时也让第二版变得有些不合时宜。现在,这些鸿沟却被第三版的问世所弥补了。它并不仅仅只是原书的升级,而是增添许多全新的内容,或是对某些要点的陈述扩展了几乎两倍之多。新的模块、语法、函数以及功能都通过例子来展示给读者。无论如何,它都值得 Perl 程序员去购买,毕竟它是目前 Perl 语言最好最明确的参考书。