Perl
维基百科,自由的百科全书
| Perl | |
|---|---|
| 多重编程范式 | |
|
发行时间
|
1987年 |
|
設計者
|
拉里·沃尔 |
| 最新发行时间 | 5.10.0 (2007年12月18日) |
| Dynamic | |
|
啟發語言
|
AWK, BASIC, BASIC-PLUS, C語言, C++, LISP, Pascal, sed, Unix shell |
|
影響語言
|
Python, PHP, Ruby, ECMAScript |
| 跨平台 | |
| GNU通用公共许可证, Artistic License | |
| http://www.perl.org | |
Perl是一种脚本语言。最初的设计者为拉里·沃尔(Larry Wall),它於1987年12月18日發表。Perl借取了C、sed、awk、shell scripting以及很多其他程式語言的特性。其中最重要的特性是他内部集成了正则表达式的功能,以及巨大的第三方代码库CPAN。
目录 |
[编辑] Perl简介
Perl原名pearl,但是在這個語言官方發表前,拉里·沃尔發現已經有個程式語言“pearl”,便將這個程式語言的名字改成Perl。对于Perl这四个字母,有一些解釋,包括充滿幽默感的“Pathologically Eclectic Rubbish Lister”。“Practical Extraction and Report Language”曾經出現在很多有關Perl的資料裏,包括官方的首頁。不过事实上这个长名字是后来凑出来的。它的名字第一個字母大写(Perl)時就指這個程式語言,無大写字母(perl)時就指它的直譯器。將Perl寫成“PERL”是不適當的,因為它並非一個縮寫字。
[编辑] Perl语言的中心思想
Perl语言的中心思想可以集成为一句话「TMTOWTDI」:
Perl的作者Larry Wall建议可以把这个缩写词念成「Tim Toady」。
另一个Perl程序员常常想起的Perl俗语是:
Easy things should be easy, and hard things should be possible.
[编辑] Perl的駱駝圖案
Perl駱駝是歐萊禮媒體(O'Reilly Media)設計給Perl程式語言的圖標。牠也是一種駭客的象徵,出現在某些T-shirt和其他衣服標籤上。
歐萊禮擁有此圖像之商標,並且宣稱,唯有在捍衛「符號之完整性」時,才會行使其法律上的權力。[1]歐萊禮允許此商標在非商業目的之前提下被使用,並同時供了Programming Republic of Perl的圖像以及Powered by Perl的按鈕圖。[2]然而,駱駝其實從未被考慮成為Perl的官方識別符號,真要說有的話,其識別符號其實是洋蔥。[3]
[编辑] 优点
为了实现这样的目标,并且又因为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的簡單程式,這種程式通常作為開始學習程式語言的第一個範例:
这个程序将输出一行字符串:“Hello,world!”,以及一个回车换行符。
[编辑] 变量
Perl是一种无类型语言(untyped),换句话说,在语言层面上,Perl和大多数编程语言不同,不把变量分成整数、字符、浮点数等等,而只有一种能接受各种类型数据的“无类型”变量。Perl的变量以$字符开头。例如$a=5;$b="Hello";$c=3.2;$d='\n这里并不换行'都是合法的Perl语句。
Perl中各种变量的运算也很自由,数和含有数的字符串是等效的,可以把数字字符串参与数学计算,也可以反之,让数字参与字符串的构成和操作。
除单个变量(Perl称为Scalar)之外,Perl还有两种集合类型,分别是数组(Array,用@字符开头)和关联数组(Associative array,或者称为Hash,用%开头。类似C++的STL map和Python的Dictionary)。数组可以内含任意可变数目的变量。而Hash表,则可以在变量之间建立一一映射,就像字典一样,可以把不同的变量按照他们的逻辑关系组织起来。
[编辑] 判断语句
因为Perl大量的创造冗余的语法,并且从其他语言中大量的借鉴语法,使得Perl的语法极其丰富和灵活。Perl共有下列几种判断语句:
- if模块
- if语句
- unless模块
- unless语句
由于逻辑運算元的作用,还可以写出不用关键字if或unless的判断语句,如常用的打开文件语句:
[编辑] 循环语句
Perl中的循环语句也是非常的丰富。主要有:
Perl自己的for或者foreach循环:
从C语言借鉴来的for循环:
while循环:
do...while循环:
until循环:
从PASCAL语言借鉴来的do...until循环:
甚至还有利用动态语言特性,用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, hmread, 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程序的代碼難以閱讀,加上它的面向对象功能被視為不是真正的面向对象,於是很多人拿Perl和其他動態語言來比較。
最常見是比較對象是Python,有人寫了篇文章叫What's wrong with Perl,指出Perl的缺點,鼓勵別人學Python。著名黑客埃里克·斯蒂芬·雷蒙寫Why Python?,該文中一個重要的比較對象就是Perl。
Ruby的作者(松本行弘,Matz)甚至直認他想Ruby作為Perl的後繼者。[4]
[编辑] 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
[编辑] Perl 6
Perl 6正在开发中,它将会与现在的Perl版本有很大不同,但相信還要開發一段長時間。 其中最主要的改變是,Perl 6會是完全物件導向的,有專用於宣告類別的語法
[编辑] 注释
- ^ O'Reilly—The Perl Camel Usage and Trademark Information
- ^ Index of /images/perl
- ^ Perl Trademark, User Logos, Perl Marks and more
- ^ 「我認為Ruby這個名字作為Perl之後的一門語言的名字真是再恰當不過了。」--摘錄自O'Reilly訪問Matz。
[编辑] 參見
[编辑] 外部链接
- Perl.com(O'REILLY)
- Perl.org
- Perl 6的開發網頁
- CPAN - Comprehensive Perl Archive Network:Perl程式的集中地
- CPAN检索
- dmoz on Perl
- Perl Mongers:全球各地的使用者組織
- Perl Monks:一个很活跃的Perl社区
- ActiveState:Microsoft Windows上的Perl
- Strawberry Perl:由Perl社群所提供之Microsoft Windows版Perl
- Perl6::Perl5::Differences
[编辑] 中文資源、社群
- Perl@Taiwan(正体中文)
- Perl學習手札(正体中文)
- 香港Perl推廣组(繁體中文)
- 中国Perl协会(简体中文)
- 中国Perl协会的wiki(简体中文)
- GB18030軟件Source code filter to escape GB18030(英文)
- Big5Plus軟件Source code filter to escape Big5Plus(英文)
|
|||||||||||||||||||||||||||||||||||||||