Perl

目录·Perl简介
·Perl 的语法
·函数
·Perl的应用
·竞争对手
·Perl的历史
·注释
·参见
·外部链接




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



Perl简介

Perl原名pearl,但是在这个语言官方发表前,拉里·沃尔发现已经有个编程语言“pearl”,便将这个编程语言的名字改成Perl。对于Perl这四个字母,有一些解释,包括充满幽默感的“Pathologically Eclectic Rubbish Lister”。“Practical Extraction and Report Language”曾经出现在很多有关Perl的资料里,包括官方的主页。不过事实上这个长名字是后来凑出来的。它的名字第一个字母大写(Perl)时就指这个编程语言,无大写字母(perl)时就指它的直译器。将Perl写成“PERL”是不适当的,因为它并非一个缩写字。

Perl 语言的中心思想
Perl 语言的中心思想可以集成为一句话“TMTOWTDI”:
<blockquote class="toccolours" style="float: none; padding: 0.3em 1em;">
There&#39;&#39;s More Than One Way To Do It.(不只一种方法来做这件事。)
</blockquote>
Perl 的作者 Larry Wall 建议可以把这个缩写词念成“Tim Toady”。
另一个 Perl 程序员常常想起的 Perl 俗语是:
<blockquote class="toccolours" style="float: none; padding: 0.3em 1em;">
Easy things should be easy, and hard things should be possible.
</blockquote>

Perl的骆驼图案
Perl骆驼是欧莱礼媒体(O&#39;&#39;Reilly Media)设计给Perl编程语言的图标。它也是一种黑客的象征,出现在某些T-shirt和其他衣服标签上。

优点
为了实现这样的目标,并且又因为 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 或 Ruby 等语言一样优雅。

Perl 的语法


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


#!/usr/bin/perl
print "Hello, world!\n";

这个程序将输出一行字符串:“Hello,world!”,以及一个回车换行符。

变量
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>模块



if ($hour > 22) {
print "should sleep...\n";
}


<tt>if</tt>语句



print "hello" if $guest >= 1;


<tt>unless</tt>模块



unless ($credit > 100) {
print "You can not graduate!\n";
}


<tt>unless</tt>语句



print "eat\n" unless $food == 0;

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


open(DATA, "< $filename") or die "Can&#39;&#39;t open $filename: $!\n";


循环语句
Perl中的循环语句也是非常的丰富。主要有:
Perl自己的for或者foreach循环:


@group = 1 .. 10;
for (@group) {
print "$_\n";
}

foreach (@group) {
print "$_\n";
}

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


for ($i = 0; $i < 10; $i++) {
print "$group[$i]\n";
}

while循环:


$i=0;
while ($i < 10) {
print "$group[$i]\n";
$i++;
}

do...while循环:


$i = 0;
do {
print "$group[$i]\n";
$i++;
} while ($i < 10);

until循环:


$i = 0;
until ($i == 10) {
print "$group[$i]\n";
$i++;
}

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


$i = 0;
do {
print "$group[$i]\n";
$i++;
} until ($i == 10);

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


print map { "$_\n" } @group;

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

函数

Perl提供了可以直接调用的、数目众多的函数。可以对以下对象进行操作:

* 数组: chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values


* 数据库: dbmclose, dbmopen


* 目录: chdir, closedir, mkdir, opendir, readdir, rewinddir, rmdir, seekdir, telldir


* 文件: binmode, chdir, chmod, chown, chroot, close, eof, fnctl, fileno, flock, getc, glob, ioctl, link, lstat, open,
print, printf, read, readdir, readlink, rename, rmdir, seek, select, stat, symlink, sysopen, sysread, syswrite, tell,
truncate, umask, unlink, utime, write


* 组: endgrent, getgrent, getgrgid, getgrname, getpgrp, setgrent, setpgrp


* 哈希表(Hash;雜湊表): delete, each, exists, keys, values


* 主机: endhostent, gethostbyaddr, gethostbyname, sethostent


* 输入: getc, read, sysread


* 处理器间通讯: msgctl, msgget, msgrcv, msgsnd, pipe, semctl, semget, semop, shmctl, shmget, shmread, shmwrite


* 数学: abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand


* 消息队列: msgctl, msgget, msgrcv, msgsnd


* 其他: bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray


* 网络: endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent


* 输出: die, print, printf, syswrite, warn, write


* 口令: endpwent, getpwent, getpwname, getpwuid, setpwent


* 进程: alarm, die, dump, exec, exit, fork, getlogin, getpgrp, getppid, getpriority, kill, setpriority, sleep, system,
times, umask, wait, waitpid


* 协议: endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent


* 正则表达式: grep, pos, quotemeta, reset, split, study


* 范围: caller, local, my


* 服务: endservent, getservbyname, getservbyport, getservent, setservent


* 套节字: accept, bind, connect, gethostbyaddr, gethostbyname, gethostent, getpeername, getservbyname, getservbyport,
getservent, getsockname, getsockopt, listen, recv, select, send, setsockopt, shutdown, socket, socketpair


* 字符串: chop, chr, crypt, hex, index, join, lc, lcfirst, length, oct, Ord, pack, q, qq, quotemeta, qw, qx, reverse,
rindex, split, sprintf, substr, uc, ucfirst, unpack, vec


* 时间: gmtime, localtime, time


* UNIX: chmod, chown, chroot, dump, endgrent, endhostent, endnetent, endprotent, endpwent, endservent, fnctl, fork,
getgrent, getgrgid, getgrname, gethostent, getlogin, getnetent, getpgrp, getppid, getpriority, getprotobyname,
getprotobynumber, getprotoent, getpwent, getpwname, getpwuid, getservbyname, getservbyport, getservent, ioctl, link,
lstat, readlink, select, setgrent, sethostent, setnetent, setpgrp, setpriority, setprotoent, setpwent, setservent,
sleep, syscall, times, umask, wait, waitpid

这里可以按字母序查找Perl函数用法。

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编译的诗。新的诗经通常会在Perl Monks网站发表。
另一个Perl hackers的有趣活动是写JAPHs。

竞争对手

因为许多Perl程序的代码难以阅读,加上它的面向对象功能被视为不是真正的面向对象,于是很多人拿Perl和其他动态语言来比较。
最常见是比较对象是Python,有人写了篇文章叫What&#39;&#39;s wrong with Perl,指出Perl的缺点,鼓励别人学Python。著名黑客埃里克·斯蒂芬·雷蒙写Why Python?,该文中一个重要的比较对象就是Perl。
Ruby的作者(松本行弘,Matz)甚至直认他想Ruby作为Perl的后继者。[1]

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版本有很大不同,但相信还要开发一段长时间。

注释



^ “我认为 Ruby 这个名字作为 Perl 之后的一门语言的名字真是再恰当不过了。”--摘录自O&#39;&#39;Reilly 访问 Matz。



参见


CPAN
Parrot


外部链接


Perl.com(O&#39;&#39;REILLY)
Perl.org
Perl 6 的开发网页
CPAN - Comprehensive Perl Archive Network:Perl 程式的集中地
CPAN 检索
dmoz on Perl
Perl Mongers:全球各地的使用者组织
Perl Monks:一个很活跃的 Perl 社区
ActiveState:Microsoft Windows 上的 Perl
Perl6::Perl5::Differences


中文

中国 Perl 协会
香港 Perl 推广组
Perl@Taiwan
Perl 学习手札
中国 Perl 协会会员中心(通过标签和地域聚合人)
中国 Perl 协会的 wiki(中文翻译)






相关词条:
超级网管(SuperLANadmin)V5.3  HIPERLAN  
 
自定义分类:
程序设计语言Perl
 
贡献者:
风元素
Copyright © 1999-2024 C114 All Rights Reserved | 联系我们 | 沪ICP备12002291号-4