Perl
概述
Perl(Practical Extraction and Report Language)是一种脚本语言。 最初的设计者为拉里·沃尔(Larry Wall),它于1987年12月18日发表。Perl借取了C、sed、awk、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等泛型语言才能称为“高级”语言,而C、Pascal甚至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'(一个快速弗利叶变换的软件包]]),又或者是Mesa(Linux上的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版本有很大不同,但相信还要开发一段长时间。
外部链接
Perl Mongers, 全球各地的使用者组织
Perl Monks, 一个很活跃的Perl社区
ActiveState,Microsoft Windows上的Perl
CPAN - Comprehensive Perl Archive Network,Perl程序的集中地
member.perlchina.org PerlChina.org 会员中心 - 通过标签和地域聚合人
wiki.perlchina.org PerlChina.org 的 wiki 站点,中文翻译