Perl 语言编程
第三版 作者:Larry Wall, Tom Christiansen, and Jon Orwant 译者:何伟平
第一部分 概述
第零章 前言
第一章 Perl 概述
第二部分 细节
第二章 集腋成裘
第三章 单目和双目操作符
第四章 语句和声明
第五章 模式匹配
第六章 子过程
第七章 格式
第八章 引用
第九章 数据结构
第十章 包
第十一章 模块
第十二章 对象(上)
第十二章 对象(下)
第十三章 重载
第十四章,捆绑(tie)变量上
第十四章,捆绑(tie)变量下
第三部分 做为技术的Perl
第十五章 Unicode
第十六章 进程间通信
第十七章 线程
第十八章 编译
第十九章 命令行接口
第二十章 Perl调试器
第二十一章 内部和外部
第四部分 做为文化的Perl
第二十二章 CPAN
第二十三章 安全
第二十四章 普通实践
第二十五章 可移植的 Perl
第二十六章 简单旧文档
第二十七章 Perl 文化
第五部分 参考资料
第二十八章 特殊名字
第二十九章 函数(A-D)
第二十九章 函数(E-N)
第二十九章 函数(O-R)
第二十九章 函数(S-Z)
第二十九章的所有函数单页版(A-Z)
第三十章 标准 Perl 库
第三十一章 用法模块
第三十二章 标准模块
第三十三章
诊断信息
第零章 Perl 前言
第零章 Perl 前言
1. 追求幸福
2. 这个版本有什么新东西
3. 标准的发布版
4. 在线文档
5. 阅读标准手册页
6. 搜索手册页
7. 非 Perl 手册页
8. 离线文档
9. 其它资源
9.1 Web 上的 Perl
9.2 Usenet 新闻组
10. 臭虫报告
11. 这本书里用的习惯
12. 感谢
1. 追求幸福
Perl 是一种能完成任务的语言。
当然,如果你的工作就是写程序,那么从理论上来讲,你可以使用任何“完整”的计算机 语言来完成任务。但是从我
们的经验来看,计算机语言的区别很大程度上不在它能干什么 ,而是在它做事情的时候是否简单。从一个极端来
说,那些所谓的第四代语言做某些事情 的时候相当容易,但是做其它一些事情的时候几乎不可能。从另外一个极端
来看,那些所 谓的工业级的语言在做任何事情的时候都几乎一样困难。
Perl 是不同的语言。从一开始,Perl 就设计成可以把简单工作简单化,同时又不失去处 理困难问题能力的语言。
那什么是“简单工作”呢?当然就是那些你每天都要干的。你需要一种可以很容易操作数 字,文本,文件和目录,计
算机和网络,特别是程序的语言。这种语言应该很容易运行外 部的程序并且扫描这些程序的输出获取感兴趣的东
西。而且它还应该很容易能把这些你感 兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任
何现代的操作 系统上可以移植地编译和运行。
Perl 做到了上述所有需求,甚至更多。
Perl 最初是当做一种 Unix 的胶水语言设计的,但是她早就移植到大多数其它操作系统里 了。因为 Perl 几乎可以
在任何地方运行,所以 Perl 可以说是当今最具有移植性的编程环 境。要想写可移植的 C/C++ 程序,你得在程序
里加上一大堆 #ifdef 标签来区分不同的系 统。要想写可移植的 Java 程序,你必须理解每种新的 Java 实现的特
质。要想写可移植的
shell,你可能要记住每条命令在每种操作系统上的语法,走运的时候你可能可以找到一 些公共的东西。而要想写可
移植的 Visual Basic 程序,那么你只需要对“移植”有个更灵 活的定义就可以了。
我们很高兴的是 Perl 避免了所有这些问题,同时还保留了这些语言中的许多优点,同时 还有一些自己的特
色。Perl 的特色来自许多方面:它的特性集的工具,Perl 社区的创造 性,以及开源运动的大环境。不过,许多这
些特性都是混合的东西;Perl 的身世复杂,它 总是把事物看成是优点的不同方面,而不是弱点。Perl 是“背黑锅我
来”的语言。如果你 觉得自己陷入一团乱麻之中,非常渴望自由,那么请使用 Perl。
Perl 是跨文化的。Perl 的爆炸性增长很大程度上是因为那些前 Unix 系统程序员的渴望, 他们希望从他们的“老
家”带着尽可能多的东西。对于他们而言,Perl 是可移植的 Unix 文化蒸馏器,是"此路不通"的沙漠中的绿洲。从
另外一个角度来看,Perl 还可以从另外一 个方向运转:在 Windows 上工作的 web 设计者通常会非常开心地发
现他们的 Perl 程序可 以不加修改地在 Unix 服务器上跑。
尽管 Perl 在系统程序员和 web 设计师中间非常流行,但这只是因为是他们最早发现 Perl 的,Perl 可以用于更广
泛的用途。从 Perl 最早的文本处理语言开始,它已经发展成为一 种非常复杂的,通用的编程语言,以及完整的开
发环境,包括调试器,调节器,交叉引用 ,编译器,库,语法提示编辑器,以及所有其它“真正”的编程语言所具有
的所有挂勾, 只要你需要。当然这些东西都是让我们可能处理难的问题的东西,而且很多其它语言也可 以做到这
一点。Perl 之所以成为 Perl 是因为它从来不会因为保持简单事情简单化而丢失 其他方面的特性。
因为 Perl 既强大又好用,所以它被广泛地用于日常生活的方方面面,从宇航工程到分子 生物学,从数学到语言
学,从图形处理到文档处理,从数据库操作到网络管理。很多人用 Perl 进行快速处理那些很难分析或转换的大批量
数据,不管你是处理 DNA 序列,网页, 还是猪肚皮的未来都无所谓。实际上,在 Perl 社区有一个笑话就是,下
次股市大崩盘就 很有可能是呢个家伙写的脚本里头有臭虫造成的。(不过,乐观点来看就是,任何还在失 业的股
票分析师仍然有可以利用的技巧。)
Perl 的成功有许多原因。Perl 早在开源软件的名字出现之前就已经是一个成功的开源项 目了。Perl 是自由的,并
将永远自由下去。你可以在任何合适的场合使用 Perl,只需要 遵守一个非常自由的版权就可以了。如果你在从事商
业活动并且还想使用 Perl,那么用 就是了。你可以把 Perl 嵌入到你写的商业软件中而不需要支付任何费用也没有
任何限制 。如果你碰上一个 Perl 社区解决不了的问题,那你也还有最后的一招:源程序本身。 Perl 社区不会
在“升级”的伪装下租给你它们的商业秘密。而且 Perl 社区也不会“停业 ”,更不会让你孤立无援。
Perl 是自由软件这一点无疑对它是有帮助的。但这一条并不足以解释 Perl 现象,因为许 多自由软件包没有能繁荣
起来。Perl 不仅自由;而且好玩。人们觉得自己在 Perl 里可以 有创造力,因为它们有表达的自由:他们可以选择
是为计算机速度优化还是为程序员的速 度优化,是冗长还是简洁,是选择可读性还是可维护性,或者选择复用性,
移植性,接受 性和传授性等等。假如你进入一次模糊的 Perl 比赛,甚至你还可以为模糊性做优化。
Perl 可以给予你所有这些自由,因为它是一门有着分裂人格的语言。Perl 同时是很简单 并且很富有的语言。Perl
从其它地方拿来好主意,然后把它们安装到易用的框架里面。对 于只是喜欢她的人来说,Perl 是实用抽取和报表语
言(Practical Extractoin and Report Language)。对那些热爱她的人而言,她是变态电子垃圾制造者
(Pathologically Electric Rubbish Lister)。在少数人眼里,Perl 是毫无意义的重复练习。不过世界需要一 点
点冗余。精简主义者总是想把事物分隔开。而我们则总是企图把它们合并到一起。
Perl 之所以是简单的语言是有很多原因的。比如你用不着知道什么特殊的指令就可以编译 Perl 程序--只要把它当
做批处理或者 shell 脚本执行就可以了。Perl 的类型和结构很容易 使用和理解。Perl 对你的数据没有任何限制-
-你的字串和数组可以要多长就多长(只要你 有足够的内存),而且它们都会自动增长。Perl 不会强迫你学习新的
语法和语意,Perl 改从许多其它你已经熟悉的语言里(比如 C, awk, BASIC 和 Python, 英文,希腊语等)借 来
语法。实际上,任何程序员都可以从书写良好的 Perl 代码段中读懂它的含义。
最重要的是,你不用先学习所有 Perl 的东西就可以开始写有用的程序。你可以写很小的 Perl 程序。你也可以象小
孩那样写 Perl 程序,我们保证不会笑话你。或者更准确地说是 ,我们绝不会笑话小孩做事情的创造性。Perl 里的
许多观点都是从自然语言中借来的,其 中一条最好的观点就是只要你能把自己的意思表述清楚,那么你就可以使用
这些语言的一 个子集。Perl 文化可以接受任何熟练程度的成员。我们不会在你背后放个语言警察。如果 你的老板
不炒你,而且你的 Perl 脚本也能完成工作,那么它就是“正确”的。
尽管 Perl 很简单,但它仍然是一种特性很丰富的语言,如果你想用那些特性的话,那你 就要学习一些东西。这也
是把难题变简单的学费。虽然你要想把所有 Perl 能做的事情吸 收还需要一些时间,但到你需要这些功能的时候你
就会非常开心地发现 Perl 已经可以做 这些事情了。
由于 Perl 的继承性,就算它只是用做数据归纳语言的时候也有丰富的特性,Perl 一开始 就设计成可以浏览文件,
扫描大量文本并且生成动态数据以及打印出这些数据的良好格式 化的报表。不过,随后 Perl 就开始风行,于是它
就成了可以操作文件系统,进程管理, 数据库管理,进行 C/S 编程和安全编程,web 信息管理,甚至可以进行面
向对象和面向功 能的编程的语言。而且这些功能并非只是在 Perl 这边,每种新功能都和其它东西交流得 很好,别
忘了 Perl 从一开始就是设计成胶水语言的。
而且 Perl 并不仅仅只能黏合它自己的特性。Perl 是设计成可以用模块扩展的语言。你可 以用 Perl 快速设计,编
写,调试和部署 Perl 应用,并且你还可以在需要的时候很方便地 扩展这些应用。你可以在其它语言里嵌入 Perl,
而且你也可以在 Perl 里嵌入其它语言。 通过模块输入机制,你可以把这些外部的扩展当做内置于 Perl 的特性。
那些面向对象的 外部库在 Perl 内部仍然保持面向对象的特征。
Perl 还在许多其它方面协助你。和严格的每次执行一条命令的命令文件和 shell 脚本不同 的是,Perl 先把你的程
序快速编译成一种内部格式。和其它任何编译器一样,这个时候还 进行各种优化,同时把碰到的任何问题反馈给
你。一旦 Perl 的编译器前端对你的程序表 示满意了,它就把这些中间代码交给解释器执行(或者是给其它的能生
成 C 或者字节码的 模块后端)。听起来挺复杂,不过 Perl 的编译器和解释器干这些活效率相当高,我们的 编
译-运行-修改的过程几乎都是以秒计。再加上 Perl 的许多其他开发特性,这种快速的 角色转换很适合做快速原型
设计。然后随着你的程序的成熟,你可以逐步拧紧身上的螺母 ,减少散漫增强记律。如果你做得好,Perl 也能帮你
这个忙。
Perl 还可以帮你写更安全的程序。除了其它语言提供的典型的安全接口之外,Perl 还通 过一种跟踪数据的机制给
你提供预防意外安全错误的保护,这样就可以在灾害发生之前预 防其发生。最后,Perl 还可以让你设置一个特殊的
防护隔段运行那些来源不明的 Perl 代 码,以此来杜绝危险操作。
不过,偏执一点儿说,Perl 帮你的大部分内容和 Perl 本身没有什么关系,而是和使用 Perl 的人有关。坦率地
说,Perl 社区的人们可以说是地球上最热心的人了。如果 Perl 运 动里面有那么一点点宗教色彩的话,那么这就是
它的核心了。Larry 希望 Perl 社区像一小 片天堂那样运转,目前看来他的愿望基本上是实现了。我们也请你为此
做出自己的努力。
不管你是想拯救地球,还是觉得新鲜,或是你老板命令你学习,这本书都将告诉你一些基 本的和复杂的东西。虽然
我们没有故意教你写程序,但是如果你观察力足够强地话,你还 是能找到一些编程的艺术以及一些编程的科学。我
们鼓励你培养下面三条程序员的优点: 懒惰,急躁,和傲慢。看书的同时,我们也希望你能从中找到一些有趣的地
方(以及其它 一些更有趣的地方)。如果这样还不能让你保持清醒,那么就不停提醒自己学习 Perl 可 以增加你的
简历的分量。坚持读下去吧。
2. 这个版本有什么新东西
几乎全部都是新的。
即使是那些以前版本中的相当不错的地方(我们得说有相当不少这样的地方),我们也带 着一些目的做了大量的修
改。首先,我们希望增加本书对那些有着非计算机科学背景的人 士们更有吸引力。我们对读者已知的东西做出的假
设更少了。同时,我们把许多演示做得 更生动,以防那些已经有一定了解的朋友们看着看着就睡着了。
其次,我们希望展示 Perl 本身开发的最新进展。在这个问题上,我们丝毫不因表现我们 当前的工作为耻,即使我
们展现给你的仍然是试验性的东西。尽管 Perl 的核心部分已经 是久经考验的战士了,但是有些开发中的试验性部
分仍然偶尔会非常烫手。在这里我们要 老实告诉你,我们认为在线文档比我们在这里描述的东西更可靠。Perl 是蓝
领阶层的语言 ,所以我们不会因为把铁锹叫成铁铲而觉得脸红。
第三,我们希望你更能自如地往来与书中的各个章节,因此,我们把这个版本分裂成了更 小,更连贯的章节并且把
它们重新组织成有意义的部分。下面是新版本的布局:
第一部分,概述
迈出第一步总是最困难的部分。这一部分向你展现了 Perl 的基本概念,我们尽可能地把 门槛放得更低一些。这一
部分不是完整的教程,只是一个快速入门,这样便可以满足所有 人的需要。你可以看看“离线文档”一节获取那些可
能更适合你的学习习惯的书。
第二部分,活生生的细节
这一部分包含对这门语言各个层次抽象的深入的讨论,从数据类型,变量,正则表达式, 到子过程,模块和对象。
在这里你可以对这门语言如何工作有更好的了解,同时还可以得 到一些好的程序设计的经验。(如果你从来没有用
过带模式匹配的语言,那么我们就得对 你另眼相看了。)
第三部分,作为技术的 Perl
你用 Perl 本身可以干很多事情,但这一部分带你到一个更高的境界。在这里你可以学到 如何将 Perl 和那些你的
计算机里的东西联系起来,从处理 Unicode,进程间通讯,以及多 线程,到编译,调用,调试和调谐 Perl,最后