第7章 Perl
04-13Ctrl+D 收藏本站
Perl
Perl在本书中的分量很重,这样安排有充分的理由。Perl很流行,提供的正则表达式特性很丰富,容易下载到,也很容易入门,而且在Windows、Unix和Mac等各种平台上都有提供。
Perl的某些程序结构看上去类似C和其他传统编程语言,但也只是看上去像而已。Perl解决问题的方式——Perl之道(The Perl Way)——是不同于传统语言的。Perl程序的设计通常使用传统的结构化和面向对象的概念,但是数据处理通常严重依赖正则表达式。我认为完全可以这么说:正则表达式在所有的Perl程序中都不可或缺。无论这个程序是100 000行,还是一行:
%perl-pi-e's{([-+]?\d+(\.\d*)?)F\b}{sprintf "%.0fC",($1-32)*5/9}eg'*.txt这个程序检查所有的.txt文件,将其中的华氏温度转换为摄氏温度(还记得第2 章开头的例子吗)。
本章内容
本章讲解Perl的正则表达式的方方面面(注1),包括正则流派的细节,和使用正则表达式的运算符。本章从基础开始介绍相关的细节,但我还是假设读者对 Perl 有基本的理解(如果你看过第2章,看本章就没多大问题)。那些没有详细讲解的细节,我会一笔带过,也不会费工夫来讲解语言中与正则表达式不相关的细节。在手边准备一本 Perl 的文档会很有帮助,或者O’Reilly的Programming Perl也行。
即使你目前对 Perl 还不够了解也不要紧,重要的是要有进一步学习的欲望。从任何方面来说,阅读本章都不是件轻松的事情。我的目的不是带读者入门,而是教给读者其他 Perl 的书中没提供的有用知识:为了保持本章内容的整体性和连贯性,我不会忽略一些重要的细节。某些问题很复杂,细节很多,如果不能马上理解也不必担心。我推荐读者第一遍阅读时只要了解全面的图景,需要的时候再返过来查阅。
下面列出了本章的结构作为指导:
●“Perl 的正则流派”(☞286)考察了Perl 的正则表达式提供的丰富的元字符,以及正则文字提供的附加特性。
●“正则相关的 Perl 教义(Perlism)”(☞293)考察了在 Perl 中使用正则表达式的一些重要问题。详细介绍了“动态作用域(dynamic scoping)”和“表达式应用场合(expression context)”,并解释了它们与正则表达式之间的紧密联系。
●正则表达式必须与应用方式结合起来才有价值,所以下面各节讲解了Perl中神奇的正则表达式控制结构:
qr/…/运算符和Regex对象(☞303)
Match运算符(☞306)
Substitution运算符(☞318)
Split运算符(☞321)
●“巧用Perl的专有特性”(☞326)介绍了Perl独具的正则改良功能,包括在正则表达式的应用过程中执行任意Perl代码的功能。
●“Perl 的效率问题”(☞347)详细讲解了每个 Perl 程序员关注的问题。Perl 使用传统型NFA引擎,所以我们可以充分利用第6章介绍的各种技巧。当然,还有一些专属于Perl的问题会强烈地影响到Perl应用正则表达式的方式和速度。这些都会有所涉及。
前几章出现的Perl
本书的大部分内容中都出现过Perl:
●第2章 包括Perl的入门知识,给了许多例子。
●第3章 介绍了Perl的历史(☞88),用Perl语言介绍了许多应用正则表达式的问题,例如字符编码(包括Unicode☞105)、匹配模式(☞110),以及元字符(☞113)。
●第4章 解密了Perl使用的传统型NFA引擎。对Perl用户来说这一章非常重要。
●第5章 承接第4章,包含许多讨论过的例子。其中许多是以Perl给出的,即使有些例子不是以Perl给出的,它们的原理也适用于Perl。
●第6章 对效率感兴趣的Perl程序员应该仔细阅读。
为了照顾不熟悉Perl的读者,前几章我都简化了Perl的例子,使用容易看懂的伪码。本章我会使用Perl风格的代码来举例。