前 言
在编程圈子里有一句著名的俗语,一个优秀的Fortran程序员可以用任何语言写Fortran程序。然而,让人悲哀的是,不管他们是否愿意,Fortran程序员用任何语言写Fortran程序。类似地,作为Perl程序员,我们也在用Perl写C程序,不管我们是否愿意。这让人羞愧,因为Perl是一门比C更富有表现力的语言。我们本可以做得更好,以C程序员梦想不到的方式使用Perl,但是我们没有那样做。
怎么会这样呢?Perl的设计初衷是一方面作为C的替代品,另一方面作为UNIX脚本语言(如Bourne Shell和awk)的替代品。Perl最初的主要拥护者是UNIX系统管理员,他们熟悉C和UNIX脚本语言,因此自然地倾向把Perl程序写成类似于C和awk的程序。Perl的发明人(Larry Wall)来自这个系统管理员社区,还有Randal Schwartz,与Perl合著了《Programming Perl》,本书是第一本也仍然是最重要的一本Perl参考著作。其他重要的早期贡献者还包括Tom Christiansen,也是古董级C与Unix专家。即使Perl程序员不是来自Unix系统管理员社区,他们也被其中的人或者其中的人训练的人训练成那样。
大约在1993年我开始阅读关于Lisp 的书,我有一个重要的发现:Perl更像Lisp而不是C。如果你拿起一本优秀的Lisp书,其中会有一段文字描述Lisp的优秀特点。例如,《Paradigms of Artificial Intelligence Programming》,作者Peter Norvig,有一节标题是“是什么让Lisp与众不同”,其中就描述了Lisp的七个特点。Perl分享了其中六个,C一个也没有分享。这些是巨大的、重要的特点,如头等函数、符号表的动态访问以及自动存储管理。Lisp程序员自1957年以来就在使用这些特点。他们知道如何高效使用这些语言特点的许多方法。如果Perl程序员能发现这些Lisp程序员已经知道的事情,那么他们将学到许多使Perl编程工作更轻松的方法。
说比做容易。几乎没有人愿意听Lisp程序员的。Perl人对Lisp心存芥蒂,就像Larry Wall 的著名评论所表明的,Lisp与混合了剪下的指甲碎屑的燕麦看起来一样。Lisp程序员经常制造像“cons”与“cooder”的滑稽噪声,他们还讨论像PC loser-ing问题的东西。他们相信Lisp比其他语言更好,他们也是这么说的,这让人不快。但是现在一切都好了,因为现在你不必听Lisp人的了。你可以听我的。我将制造一些轻缓的关于散列和存储以及glob的噪声,并讨论流行的和令人鼓舞的软引用与变量销毁问题。与其告诉你Lisp有多么好,不如告诉你Perl有多么好,到最后你将不会对Lisp有任何认识,但是对Perl知道得将会更多。
然后你可以停止用Perl写C程序了。我认为你将发现这是一个很好的改变。Perl就是Perl的样子,比一个慢版本的C好得多。当你写Perl程序而不是C程序时,你将惊喜于所能够做到的。
目 录
[第1章 递归与回调
1.1 十进制到二进制的转换](/)
1.2 阶乘
1.2.1 为什么私有变量是重要的
1.3 汉诺塔
1.4 层次化数据
1.5 目录遍历的应用和变化
1.6 函数式编程与面向对象式编程
1.7 HTML
1.7.1 更灵活的选择
1.8 当递归膨胀时
1.8.1 Fibonacci数
1.8.2 划分
[第2章 分配表
2.1 配置文件处理](/)
2.1.1 表驱动配置
2.1.2 分配表的优势
2.1.3 分配表策略
2.1.4 默认行为
2.2 计算器
2.2.1 再访HTML处理
第3章 缓存与记忆术
3.1 缓存修正递归
3.2 内联缓存
3.2.1 静态变量
3.3 好主意
3.4 记忆术
3.5 MEMOIZE模块
3.5.1 作用域和有效期
3.5.2 词法闭包
3.5.3 再谈记忆术
3.6 CAVEATS
3.6.1 返回值不依赖参数的函数
3.6.2 有边界效应的函数
3.6.3 返回引用的函数
3.6.4 带记忆的时钟
3.6.5 非常快的函数
3.7 键的生成
3.7.1 用户提供的键生成器的更多应用
3.7.2 内联的参数归一化的缓存管理
3.7.3 带有引用参数的函数
3.7.4 划分
3.7.5 为非纯函数定制的键生成
3.8 对象方法里的缓存
3.8.1 对象方法的记忆术
3.9 持续的缓存
3.10 可供选择的记忆术
3.11 传播福音
3.12 速度的好处
3.12.1 剖析和性能分析
3.12.2 自动剖析
3.12.3 钩子