MysunshineSy 2010-07-21
本文和大家重点讨论一下Perl文本处理模块的用法,Perl是用于文本分析的一种出色语言。内置的操作符使得文本搜索、替换和模式匹配轻而易举。
Perl文本处理模块
Perl的主要目标之一是解析文本。这里主要讨论用于文本解析的CPAN模块,并展示了如何在程序中方便地使用它们。通过使用一些正确的工具,可以使分析代码注释、改编现有记载文法和许多其它任务变得容易。考虑到实际编程,给出了每个任务的示例。
Perl是用于文本分析的一种出色语言。内置的操作符使得文本搜索、替换和模式匹配轻而易举。
CPAN(综合Perl档案网络(ComprehensivePerlArchiveNetwork))汇集了大量模块,有些模块把编程从文本和数据分析的困境中解救出来。
◆Perl文本处理模块-将Perl模块用于解析、记载和分析
DamianConway开发的Parse::RecDescent是一个对文本进行记载和解析的功能强大的工具。KimRyan开发的Lingua::EN::Fathom可以分析一个文件或一个文本块,并产生有关其输入的各种统计信息。
Parse::RecDescent
缺点:
由于它使用可扩展文法规则并且实时地进行记载和解析,所以比较慢。如果没有正确使用该模块,性能就会降低。
优点:
擅长记载和解析。记载总是比任何其它工具更好地执行任务。
◆Perl文本处理模块-改编现有的记载文法
JohnHagerman的SwedishChef记载文法是出色的简单文本过滤器示例。它还非常有趣,会给许多计算机科学与工程专业的学生在毕业前夕带来欢乐。我将展示一个使用Parse::RecDescent模块将chef.l文法移植到Perl中的示例(Parse::RecDescent模块并不是实现这一任务的理想选择DParse::Lex模块会更好些)。这一节只准备介绍构建Parse::RecDescent语法的规则,将包括操作、记忆状态、拒绝产品和对文本进行记载。请记住,自己试一试chef.pl脚本D您很可能会对此着迷。
chef.pl脚本几乎是chef.l记载文法完全一样的副本。$niw变量在启动时设置为0,因为许多规则测试它来判断它们应该被接受还是被拒绝。$niw表示“不在文字中(notinword)”,而当解析器在文字内时,它设置为1。如果Parse::RecDescent的伪指令中指定的变量非零,则该伪指令会拒绝该规则。因此,请牢记$niw=0意味着解析器不在文字内。
skip变量设置为''(空字符串),所以所有输入(包括空格)都转至标志伪指令。此外,chef规则以\z结束,\z表示字符串的结束。通常使用\Z,但那还可以匹配Perl中的换行,它们也都可以在输入中。