如果你曾经使用过linux,无论时间长短,都必定听说过perl;甚至可能在不知道的情况下运行了不少perl的脚本。很多服务程序,象 “inews”、“mirror”、“debconf”、“majordomo”、“sirc”等等,都是纯粹用perl写的。在Debian区域的 “Packages.gz”文件里做一个简单的的“zgrep”,你就可以知道有382个包需要perl的支持(也就是意味着这些包都至少有一部分是用 perl写的。),其它28个软件包也建议或推荐使用perl支持。
但是Perl语言有什么出色之处呢?
"Perl语言在文本处理方面非常突出,它把不同的内容联成一个整体。对于这种脚本语言来说所有的那些不同的元素,看起来都是一样的。”——John Ousterhout,Tcl脚本语言的作者
Perl即“Practical Extraction and Report Language”(实用析取报表语言)。是的,比较粗,但是我想那就是你所得到的——如果你打算确信$HUNN NGOUS CORP并且使用它的话。事实上,Larry Uall< Larry@wall org >(Perl的创立者)在Perl的帮助手册页里提出:“Perl实际上代表的是Pathologically Edectic Rubbish Lister,但不要告诉任何人我这样说过。”唔,他是Larry,对此我又能再说些什么呢?
Perl已经被广泛的认为是“一种拥有各种语言功能的梦幻脚本语言”、“Unix 中的王牌工具”。以及其他的一些类似的称呼,这些都是赞誉之辞,Perl被用来写单行脚本,快速执行程序,大的规划项目(Amazon.com的所有评论产品和控制系统,Netscape的内容策划管理和传送系统,人类整组基因工程的DNA排序以及计划管理等等)。还有数以百万计的令我们惊讶的各种各样的事情的高速程序。Perl还能够实现许多UNIX的公共系统工具的功能(提示:如果你正在学或必须学awk, sed, grep和 tr,我建议你以Perl来代替它们。所有的功能,更快的执行效率,相信你将永远不会因为它的性能发展太快而不适应它。)
就像你对所有的现代语言所期望的那样,Perl允许你建立面向对象的程序。它也可以进行网络操作(例如socket等等),并且有良好的可移植性(一个写得好的脚本可以在Linux,BSD,Solaries,Dos,Win9x,NT,MacOS,OS/2, AnugaOS,VMS等操作系统中不需要任何修改的运行),编写和调试周期很短——由于没有编译的要求,你只需将变化的部分写出,就可以运行脚本。还有数目庞大的可适用于执行任何一项任务的模块(即预建立Perl的例程),Comprehensive Perl Archiue Network (CPAN)就是每一个Perl程序员所能拥有的最好的模块库之一。
哦,但那是真的吗?
问得好,我希望在你使用Perl大约一年之后,就能告诉我答案。一样东西的描述就像一个容器……,我仍旧在试图寻找一个适合Perl的足够大的容器(要是带有能锁的盖子就更好了)。
那Perl不适用的方面呢?
我不会用Perl去写一个GUI文字处理程序,一个图形游戏,或者一个图形浏览器。Perl能通过与许多其他语言的接口真正的交互,所以你可以实现刚才所说的全部程序。但在我看来,在其它编程语言里有许多更有效的方法去做那些事情。“对一个拿着锤子的人来说,所有的问题看上去都像是钉子”——程序员们小心了。
值得注意的是,Perl本身并不是用Perl写成的,也不是Linalx的内核。那些底层的事务用C/C++来处理会更好的。“用最适合的工具去做最适合的工作”应成为每个程序员的座佑铭。
在拉开跳伞索之前的最后一次告诫。
如果你对Perl有一点了解,或者看过《Aint The Way I Learned It》系列内容的话,一定记得Perl的口号:“做事总有不止一种办法(There's More Than One Way To Do It)”。这常被缩写为TMTOMDI,并称为“tim-today”,是Perl的核心观点之一。当然,任何对明显的错误的订正都非常欢迎。
那些看过我早些时间写的关于Shell脚本的丛书的人也许记得,一个脚本开始都有被称作hash-bang或shebang的行:
#!/bin/ bash
这行告诉外壳(shell)派生一个subshell(子shell),随后的代码将被这个特定的subshell程序解释执行。Perl脚本也一样,第一行必须是:
#!/usr/bin/Perl
或者任何一个正确的Perl解释器的路径。
注意到Hash-bang的必要条件:
1) 它必须是在脚本中的第一行。
2) #号必须是本行的第一个字母,并且在#号和!号之间不能有任何字母或符号。
3) 必须使用绝对的路径,而不是只有可执行程序的名称。
下面,让我们试着写出我们的第一个 Perl脚本:
#!/ usr/bin/Perl
# "goodbye" - a modern, high-angst replacement for "Hello World"
print "Goodbye, cruel world!
";
unlink $0;
嗯,至少在离开以前说了“再见”;礼貌夫人都会为此骄傲的。我们在这个脚本里做了什么呢?有几件事情是相当明显的:第一,“hash-bang”,第二,一行告诉我们脚本要做什么的说明—从shell脚本发展出来的另一个东东,并且这是个不错的想法(在代码中并没有过多的解释!)。第三,我们用 “print”函数打印出所要的信息。注意,在一串字符末尾的“ ”:Perl不会自动为你提供一个换行,所以你必须自己决定要还是不要。还要注意,在每一行代码末尾的分号:就像C语言,Perl也有同样的要求,不幸的是这常被编程者所忘记。实际上,由于有着相对易懂的信息,Perl的错误检查十分容易,作为代码语句的分隔标志,分号常被认为是下一行的前导符。如果你注意到这个问题,并不麻烦,最好记住使用分号。
最后一行的意思是删除 “goodbye cruel world”文件,符号“$0”仅仅是被运行堵塞的脚本的名字的引用,“unlink”做了和“rm”一样的事。注意,“$0”比“goodbye”甚至是“/goodbye”有用的多,不管文件是什么名字,“$0”将返回这个文件名。