| 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 |
| 網站: | www.Perl.org |
Perl是一種腳本語言。 最初的設計者為拉里·沃爾(Larry Wall),它於1987年12月18日發表。Perl借取了C、sed、awk、shell scripting 以及很多其他程式語言的特性。其中最重要的特性是他內部集成了正則表達式的功能,以及巨大的第三方代碼庫 CPAN。
目錄 |
Perl原名pearl,但是在這個語言官方發表前,拉里·沃爾發現已經有個程式語言「pearl」,便將這個程式語言的名字改成Perl。對於Perl這四個字母,有一些解釋,包括充滿幽默感的「Pathologically Eclectic Rubbish Lister」。「Practical Extraction and Report Language」曾經出現在很多有關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.
Perl駱駝是歐萊禮媒體(O'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 等語言一樣優雅。
下面是一個在標準輸出設備上輸出 Hello World 的簡單程式,這種程式通常作為開始學習程式語言的第一個範例:
#!/usr/bin/perl print "Hello, world!\n";
這個程序將輸出一行字元串:「Hello,world!」,以及一個回車換行符。
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 ($hour > 22) { print "should sleep...\n"; }
print "hello" if $guest >= 1;
unless ($credit > 100) { print "You can not graduate!\n"; }
print "eat\n" unless $food == 0;
由於邏輯運算元的作用,還可以寫出不用關鍵字if或unless的判斷語句,如常用的打開文件語句:
open(DATA, "< $filename") or die "Can'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主要應用在Unix平台和網頁中(PHP,CGI)。Perl擁有海量的模塊支持,在解決問題時非常方便。CPAN是Perl模塊的集中營。
Perl Data Language(簡稱PDL)是Perl的一個外接模塊,也是對Perl功能的一個重要拓展。它使得Perl語言可以直接對2至多維的矩陣直接操作,進行快速的矩陣運算,完成基礎的Perl所不能完成的運算,大大拓展了Perl的適用範圍。所以PDL本身也是很多其他模塊的基礎。
而且PDL提供了與很多其他軟體包的介面,例如FFTW(一個快速傅立葉變換的軟體包),又或者是Mesa(Linux上的OpenGL三維圖形渲染包),這些包原來往往僅提供C/C++語言介面。這一功能使PDL成為拓展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的作者(松本行弘,Matz)甚至直認他想Ruby作為Perl的後繼者。[1]
perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8
piconv -f big5 -t utf8 < file.big5 > file.utf8 piconv -f utf8 -t big5 < file.utf8 > file.big5
Perl 6正在開發中,它將會與現在的Perl版本有很大不同,但相信還要開發一段長時間。
|
檢 • 論 • 編 • 歷
|
|
|---|---|
| 工業程式語言 | A+ - Ada - 組合語言 - B - Brainfuck - COBOL - Curl - D - Eiffel - Erlang - FORTRAN - IronPython - Java - Jython - LISP - Lua - SCILAB - MATLAB - MATHEMATICA - Nuva - Oberon - OCaml - Perl - PHP - PostScript - Powerbuilder - Python - R - REXX - Ruby - Self - Smalltalk - Tcl/Tk - C# - F# - J# - Microsoft Visual C# |
| C/C++語言 | C - C++ - Turbo C++ - Borland C++ - C++ Builder- C++/CLI - Objective-C - Microsoft Visual C++ |
| BASIC語言 | BASIC - BASICA - GW-BASIC - QBASIC - QuickBASIC - True BASIC - Turbo BASIC - PowerBASIC - DarkBASIC -ETBASIC Visual Basic .NET - Visual Basic - VBScript - VBA |
| Pascal/Delphi語言 | Pascal語法:(Pascal - Turbo Pascal - Object Pascal - Free Pascal) Pascal+Delphi語法:(Delphi) |
| ECMAScript方言 | ActionScript - DMDScript - JavaScript - JScript |
| GPU用著色器語言 | Cg - GLSL - HLSL |
| 學術程式語言 | APL/J - Clean - Haskell - Logo - ML - Prolog - Scheme - SAC |
| 資料庫相關程式語言 | Clipper - Visual FoxPro - SQL - SQL預存程序 |
| 其他程式語言 | ALGOL - Forth - Modula-2/Modula-3 - MUMPS - PL/I - Simula |
Why are we here?
All text is available under the terms of the GNU Free Documentation License
This page is cache of Wikipedia. History