Perl

概述

Perl(Practical Extraction and Report Language)是一种脚本语言。 最初的设计者为拉里·沃尔(Larry Wall),它于1987年12月18日发表。Perl借取了Csedawk、shell scripting以及很多其它程序语言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN

Perl简介

Perl原名pearl。在这个语言官方发表前,拉里·沃尔发现已经有个程序语言“pearl”,便改变将这个程序语言的名字改成Perl。Perl这个名字,出现了一些backronym的建议,包括充满幽默感的“Pathologically Eclectic Rubbish Lister”。今日,“Practical Extraction and Report Language”出现了在很多有关Perl的资料里,包括官方的man pages。它的名字第一个字母大写(Perl)时就指这个程序语言,无大写字母(perl)时就指它的直译器。将Perl写成“PERL”是不适当的,因为它并非一个缩写字。

Perl语言的中心思想

Perl语言的中心思想可以集成为一句话'TMTOWTDI'(There's More Than One Way To Do It)[总有不只一种方法作这件事]。Perl的作者Larry Wall建议可以把这个缩写词念成[Tim Toady]。

另一个Perl程序员常常想起的Perl俗语是'Easy things should be easy, and hard things should be possible'。

优点

为了实现这样的目标,并且又因为Larry Wall本人也是一个语言学家,因为他设计Perl语言时使用了很多语言学的思维。相比C、Pascal这样的“高级”语言而言,Perl语言直接提供泛型变量、动态数组、Hash表等更加便捷的编程元素。Perl具有动态语言的强大灵活的特性,并且还从C/C++、Basic、Pascal等语言中分别借鉴了语法规则,从而提供了许多冗余语法。使得程序员可以忽略计算机内部资料存储、类型、处理方法、运算规则、甚至内存越界等等的细节,而将思考中心放在所需要的程序逻辑上。就这一点而言,很多Perl程序员认为目前Perl、Python泛型语言才能称为“高级”语言,而CPascal甚至C++这些只能称为“中高级”语言而已。可以说,在统一变量类型和掩盖运算细节方面,Perl做得比Python更为出色。

由于从其它语言大量借鉴了语法,使得从其它编程语言转到Perl语言的程序员可以迅速上手写程序并完成任务,这使得Perl语言是一门容易用的语言。但问题是这样写出来的“类xx语言”的Perl程序对不熟悉这种语言的程序员却如同天书,这使得Perl语言易写不易读。

缺点

也正是因为Perl的灵活性和“过度”的冗余语法,也因此获得了write-only的“美誉”,因为许多Perl程序的代码令人难以阅读,实现相同功能的程序代码长度可以相差十倍百倍。但Perl同样可以将代码书写得像Python等语言一样优雅。

Perl的语法

Perl的Hello World程序

下面是一个在标准输出设备上输出Hello World的简单程序,这种程序通常作为开始学习编程语言时的第一个程序:

<pre>

#!/usr/bin/perl 或 #!/usr/local/bin/perl

print “Hello, world!\n”;

</pre>

变量

Perl是一种泛型语言,换句话说,在语言层面上,Perl和大多数编程语言不同,不把变量分成整数字符浮点数等等,而只有一种能接受各种类型数据的“泛型”变量。Perl的变量以$字符开头。例如<tt>$a=5;</tt><tt>$b=“Hello”</tt>;<tt>$c=3.2;</tt>都是合法的Perl语句。

Perl中各种变量的运算也很自由,数和含有数的字符串是等效的,可以把数字字符串参与数学计算,也可以反之,让数字参与字符串的构成和操作。

除单个变量(Perl称为Scalar)之外,Perl还有两种集合类型,分别是数组(Array,用@字符开头)和关联数组(Associative array,或者成为Hash。类似C++STL map和Python的Dictionary,用%开头)。数组可以内含任意可变数目的变量。而Hash表,则可以在变量之间建立一一映像,就像字典一样,可以把不同的变量按照他们的逻辑关系组织起来。

判断语句

因为Perl大量的创造冗余的语法,并且从其它语言中大量的借鉴语法,使得Perl的语法极其丰富和灵活。Perl共有下列几种判断语句:

<tt>if</tt>模块

<pre>

if($hour>22) {

print "should sleep...\n";

}

</pre>

<tt>if</tt>语句

<pre>

print “hello” if $guest >= 1;

</pre>

<tt>unless</tt>模块

<pre>

unless($credit>100) {

print "You can not graduate!\n";

}

</pre>

<tt>unless</tt>语句

<pre>

print “eat\n” unless $food==0;

</pre>

由于逻辑运算符的作用,还可以写出不用关键字<tt>if</tt>或<tt>unless</tt>的判断语句,如常用的打开文件语句:

<pre>

open(DATA,”< $filename”) or die “Cannot open $filename\n”;

</pre>

循环语句

Perl中的循环语句也是非常的丰富。主要有:

Perl自己的for或者foreach循环:

<pre>

@group = 1..10;

for (@group) {

print "$_\n";

}

</pre>

从C语言借鉴来的for循环:

<pre>

for($i=0; $i<10; $i++) {

print "$group[$i]\n";

}

</pre>

while循环:

<pre>

$i=0;

while($i<10) {

print "$group[$i]\n";

$i++;

}

</pre>

do…while循环:

<pre>

$i=0;

do {

print "$group[$i]\n";

$i++;

}while($i<10);

</pre>

until循环:

<pre>

$i=0;

until($i==10) {

print "$group[$i]\n";

$i++;

}

</pre>

从PASCAL语言借鉴来的do…until循环:

<pre>

$i=0;

do {

print "$group[$i]\n";

$i++;

}until($i==10);

</pre>

甚至还有利用动态语言特性,用map关键字也可以做循环:

<pre>

print map { “$_\n” } @group;

</pre>

其实还有其它的循环方式。总而言之,就是TMTOWTDI

Perl的应用

Perl主要应用在Unix平台和网页中(PHP,CGI)。Perl拥有海量的模块支持,在解决问题时非常方便。CPAN是Perl模块的集中营。

Perl Data Language

Perl Data Language(简称PDL)是Perl的一个外接模块,也是对Perl功能的一个重要拓展。它使得Perl语言可以直接对2至多维的矩阵直接操作,进行快速的矩阵运算,完成基础的Perl所不能完成的运算,大大拓展了Perl的适用范围。所以PDL本身也是很多其它模块的基础。

而且PDL提供了与很多其它软件包的接口,例如'FFTW'(一个快速弗利叶变换的软件包]]),又或者是MesaLinux上的OpenGL三维图形渲染包),这些包原来往往仅提供C/C++语言接口。这一功能使PDL成为拓展Perl功能的一个中间层。

Perl诗经

和C一样,在Perl界,难以读懂的程序代码大赛是个有名的活动。近似难以读懂的程序代码,但方向不同,Perl Poetry是可以被perl编译的诗。新的诗经通常会在[http://www.perlmonks.org/index.pl?node=Perl%20Poetry Perl Monks]网站发表。

另一个Perl hackers的有趣活动是写JAPHs

竞争对手

因为许多Perl程序的代码难以阅读,加上它的面向对象功能被视为不是真正的面向对象,于是很多人拿Perl和其它动态语言来比较。

最常见是比较对象是Python,有人写了篇文章叫[http://www.garshol.priv.no/download/text/perl.html What's wrong with Perl],指出Perl的缺点,鼓励别人学Python。着名黑客埃里克·斯蒂芬·雷蒙写[http://www.linuxjournal.com/article.php?sid=3882 Why Python?],该文中一个重要的比较对象就是Perl。

Ruby的作者甚至直认他想Ruby作为Perl的后继者。

Perl的历史

1987/10/18发表Perl 1.0

1994年发表Perl 5 始具有OOP的作法

5.8.0 版开始, Perl 具备了Unicode (万国码) 支持

将 Big5 编码的档案转成 Unicode, 祗需键入下列指令:

perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8

Perl 也内附了 ``piconv'', 一支完全以 Perl 写成的字码转换工具程序, 用法如下:

piconv -f big5 -t utf8 < file.big5 > file.utf8

piconv -f utf8 -t big5 < file.utf8 > file.big5

2003年发表了Perl 6

Perl 6

Perl 6正在开发中,它将会与现在的Perl版本有很大不同,但相信还要开发一段长时间。

外部链接

20 余款 Perl 开发工具与资源

Perl.com

dmoz on Perl

Perl.org

Perl 6 的开发网页

Perl Mongers, 全球各地的使用者组织

Perl Monks, 一个很活跃的Perl社区

ActiveStateMicrosoft Windows上的Perl

CPAN - Comprehensive Perl Archive Network,Perl程序的集中地

CPAN检索

中国Perl协会

香港Perl推广组

member.perlchina.org PerlChina.org 会员中心 - 通过标签和地域聚合人

wiki.perlchina.org PerlChina.org 的 wiki 站点,中文翻译