Web Analytics
Privacy Policy Cookie Policy Terms and Conditions Perl - Wikipedia

Perl

维基百科,自由的百科全书

PerlPractical Extraction and Report Language)是一种脚本语言。 最初的设计者为拉里·沃尔(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的資料裏,包括官方的主頁[1]。不过事实上这个长名字是后来凑出来的。它的名字第一個字母大写(Perl)時就指這個程式語言,無大写字母(perl)時就指它的直譯器。將Perl寫成“PERL”是不適當的,因為它並非一個縮寫字。

[编辑] Perl语言的中心思想

Perl语言的中心思想可以集成为一句话TMTOWTDIThere'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 or ruby 等语言一样优雅。

[编辑] Perl的语法

[编辑] Perl的Hello World程序

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

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


[编辑] 变量

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

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

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

[编辑] 判断语句

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

if模块

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

if语句

print "hello" if $guest >= 1;

unless模块

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

unless语句

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

由于逻辑运算符的作用,还可以写出不用关键字ifunless的判断语句,如常用的打开文件语句:

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

[编辑] 循环语句

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

Perl自己的for或者foreach循环:

@group = 1..10;
for (@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
* 哈希表: 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(一个快速傅立叶变换的软件包]]),又或者是MesaLinux上的OpenGL三维图形渲染包),这些包原来往往仅提供C/C++语言接口。这一功能使PDL成为拓展Perl功能的一个中间层。

[编辑] Perl诗经

和C一樣,在Perl界,難以讀懂的程式碼大賽是個有名的活動。近似難以讀懂的程式碼,但方向不同,Perl Poetry是可以被perl編譯的詩。新的詩經通常會在Perl Monks網站發表。

另一個Perl hackers的有趣活動是寫JAPHs。

[编辑] 競爭對手

因為許多Perl程序的代碼難以閱讀,加上它的面向对象功能被視為不是真正的面向对象,於是很多人拿Perl和其他動態語言來比較。

最常見是比較對象是Python,有人寫了篇文章叫What's wrong with Perl,指出Perl的缺點,鼓勵別人學Python。著名黑客埃里克·斯蒂芬·雷蒙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版本有很大不同,但相信還要開發一段長時間。

[编辑] 注释

  1. Perl主頁

[编辑] 外部链接

工业编程语言: A+ | Ada | 汇编语言 | B | Brainfuck | C | C++ | C++/CLI | COBOL | Delphi | Eiffel | Erlang | FORTRAN | IronPython | Java | JRuby | Jython | LISP | Nuva | Oberon | Objective-C | OCaml | Pascal | Powerbuilder | QBASIC | R | REXX | Self | Smalltalk | SQL | Visual Basic | PHP | C# | F# | J# | Visual Basic .NET

脚本编程语言: ActionScript | JavaScript | JScript | Lua | Nuva | Perl | PostScript | Python | Ruby | Tcl/Tk | VBScript

GPU用著色器語言: Cg | HLSL

学术编程语言: APL/J | Haskell | Logo | ML | Prolog | Scheme | SAC

其他编程语言: ALGOL | BASIC | Clipper | Forth | Modula-2/Modula-3 | MUMPS | PL/I | Simula

THIS WEB:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -

Static Wikipedia 2007:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu

Static Wikipedia 2006:

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - be - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - closed_zh_tw - co - cr - cs - csb - cu - cv - cy - da - de - diq - dv - dz - ee - el - eml - en - eo - es - et - eu - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gd - gl - glk - gn - got - gu - gv - ha - haw - he - hi - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mg - mh - mi - mk - ml - mn - mo - mr - ms - mt - mus - my - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - rm - rmy - rn - ro - roa_rup - roa_tara - ru - ru_sib - rw - sa - sc - scn - sco - sd - se - searchcom - sg - sh - si - simple - sk - sl - sm - sn - so - sq - sr - ss - st - su - sv - sw - ta - te - test - tet - tg - th - ti - tk - tl - tlh - tn - to - tokipona - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu