百科解釋
目錄·Perl簡(jiǎn)介·Perl 的語(yǔ)法·函數(shù)·Perl的應(yīng)用·競(jìng)爭(zhēng)對(duì)手·Perl的歷史·注釋·參見(jiàn)·外部鏈接 Perl是一種腳本語(yǔ)言。 最初的設(shè)計(jì)者為拉里·沃爾(Larry Wall),它于1987年12月18日發(fā)表。Perl借取了C、sed、awk、shell s cripting 以及很多其他編程語(yǔ)言的特性。其中最重要的特性是他內(nèi)部集成了正則表達(dá)式的功能,以及巨大的第三方代碼庫(kù) CPAN。 Perl簡(jiǎn)介 Perl原名pearl,但是在這個(gè)語(yǔ)言官方發(fā)表前,拉里·沃爾發(fā)現(xiàn)已經(jīng)有個(gè)編程語(yǔ)言“pearl”,便將這個(gè)編程語(yǔ)言的名字改成Perl。對(duì)于Perl這四個(gè)字母,有一些解釋,包括充滿幽默感的“Pathologically Eclectic Rubbish Lister”!癙ractical Extraction and Report Language”曾經(jīng)出現(xiàn)在很多有關(guān)Perl的資料里,包括官方的主頁(yè)。不過(guò)事實(shí)上這個(gè)長(zhǎng)名字是后來(lái)湊出來(lái)的。它的名字第一個(gè)字母大寫(Perl)時(shí)就指這個(gè)編程語(yǔ)言,無(wú)大寫字母(perl)時(shí)就指它的直譯器。將Perl寫成“PERL”是不適當(dāng)?shù),因(yàn)樗⒎且粋(gè)縮寫字。 Perl 語(yǔ)言的中心思想 Perl 語(yǔ)言的中心思想可以集成為一句話“TMTOWTDI”: <blockquote class="toccolours" style="float: none; padding: 0.3em 1em;"> There&#39;&#39;s More Than One Way To Do It.(不只一種方法來(lái)做這件事。) </blockquote> Perl 的作者 Larry Wall 建議可以把這個(gè)縮寫詞念成“Tim Toady”。 另一個(gè) Perl 程序員常常想起的 Perl 俗語(yǔ)是: <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)設(shè)計(jì)給Perl編程語(yǔ)言的圖標(biāo)。它也是一種黑客的象征,出現(xiàn)在某些T-shirt和其他衣服標(biāo)簽上。 優(yōu)點(diǎn) 為了實(shí)現(xiàn)這樣的目標(biāo),并且又因?yàn)?Larry Wall 本人也是一個(gè)語(yǔ)言學(xué)家,他設(shè)計(jì)Perl語(yǔ)言時(shí)使用了很多語(yǔ)言學(xué)的思維。相比 C、Pascal 這樣的“高級(jí)”語(yǔ)言而言,Perl語(yǔ)言直接提供泛型變量、動(dòng)態(tài)數(shù)組、Hash表等更加便捷的編程元素。Perl 具有動(dòng)態(tài)語(yǔ)言的強(qiáng)大靈活的特性,并且還從C/C++、Basic、Pascal 等語(yǔ)言中分別借鑒了語(yǔ)法規(guī)則,從而提供了許多冗余語(yǔ)法。使得程序員可以忽略計(jì)算機(jī)內(nèi)部資料存儲(chǔ)、類型、處理方法、運(yùn)算規(guī)則、甚至內(nèi)存越界等等的細(xì)節(jié),而將思考中心放在所需要的程序邏輯上。就這一點(diǎn)而言,很多 Perl 程序員認(rèn)為目前只有 Perl、Python等泛型語(yǔ)言才能稱為“高級(jí)”語(yǔ)言,而 C、Pascal 甚至 C++ 這些只能稱為“中高級(jí)”語(yǔ)言而已。可以說(shuō),在統(tǒng)一變量類型和掩蓋運(yùn)算細(xì)節(jié)方面,Perl 做得比 Python 更為出色。 由于從其他語(yǔ)言大量借鑒了語(yǔ)法,使得從其他編程語(yǔ)言轉(zhuǎn)到 Perl 語(yǔ)言的程序員可以迅速上手寫程序并完成任務(wù),這使得 Perl語(yǔ)言是一門容易用的語(yǔ)言。但問(wèn)題是這樣寫出來(lái)的“類xx語(yǔ)言”的 Perl 程序?qū)Σ皇煜み@種語(yǔ)言的程序員卻如同天書,這使得 Perl 語(yǔ)言易寫不易讀。 缺點(diǎn) 也正是因?yàn)?Perl 的靈活性和“過(guò)度”的冗余語(yǔ)法,也因此獲得了 write-only 的“美譽(yù)”,因?yàn)樵S多 Perl 程序的代碼令人難以閱讀,實(shí)現(xiàn)相同功能的程序代碼長(zhǎng)度可以相差十倍百倍。 但 Perl 同樣可以將代碼書寫得像 Python 或 Ruby 等語(yǔ)言一樣優(yōu)雅。 Perl 的語(yǔ)法 Perl 的 Hello World 程式 下面是一個(gè)在標(biāo)準(zhǔn)輸出設(shè)備上輸出 Hello World 的簡(jiǎn)單程式,這種程式通常作為開(kāi)始學(xué)習(xí)編程語(yǔ)言的第一個(gè)范例: #!/usr/bin/perl print "Hello, world! "; 這個(gè)程序?qū)⑤敵鲆恍凶址骸癏ello,world!”,以及一個(gè)回車換行符。 變量 Perl 是一種 泛型語(yǔ)言,換句話說(shuō),在語(yǔ)言層面上,Perl 和大多數(shù)編程語(yǔ)言不同,不把變量分成整數(shù)、字符、浮點(diǎn)數(shù)等等,而只有一種能接受各種類型數(shù)據(jù)的“泛型”變量。Perl的變量以$字符開(kāi)頭。例如<tt>$a=5;</tt><tt>$b="Hello"</tt>;<tt>$c=3.2;</tt>都是合法的 Perl 語(yǔ)句。 Perl中各種變量的運(yùn)算也很自由,數(shù)和含有數(shù)的字符串是等效的,可以把數(shù)字字符串參與數(shù)學(xué)計(jì)算,也可以反之,讓數(shù)字參與字符串的構(gòu)成和操作。 除單個(gè)變量(Perl 稱為 Scalar)之外,Perl 還有兩種集合類型,分別是數(shù)組(Array,用@字符開(kāi)頭)和關(guān)聯(lián)數(shù)組(Associative array,或者稱為Hash,用%開(kāi)頭。類似 C++ 的 STL map 和 Python 的 Dictionary)。數(shù)組可以內(nèi)含任意可變數(shù)目的變量。而Hash表,則可以在變量之間建立一一映射,就像字典一樣,可以把不同的變量按照他們的邏輯關(guān)系組織起來(lái)。 判斷語(yǔ)句 因?yàn)镻erl大量的創(chuàng)造冗余的語(yǔ)法,并且從其他語(yǔ)言中大量的借鑒語(yǔ)法,使得Perl的語(yǔ)法極其豐富和靈活。Perl共有下列幾種判斷語(yǔ)句: <tt>if</tt>模塊 if ($hour > 22) { print "should sleep... "; } <tt>if</tt>語(yǔ)句 print "hello" if $guest >= 1; <tt>unless</tt>模塊 unless ($credit > 100) { print "You can not graduate! "; } <tt>unless</tt>語(yǔ)句 print "eat " unless $food == 0; 由于邏輯算子的作用,還可以寫出不用關(guān)鍵字<tt>if</tt>或<tt>unless</tt>的判斷語(yǔ)句,如常用的打開(kāi)文件語(yǔ)句: open(DATA, "< $filename") or die "Can&#39;&#39;t open $filename: $! "; 循環(huán)語(yǔ)句 Perl中的循環(huán)語(yǔ)句也是非常的豐富。主要有: Perl自己的for或者foreach循環(huán): @group = 1 .. 10; for (@group) { print "$_ "; } foreach (@group) { print "$_ "; } 從C語(yǔ)言借鑒來(lái)的for循環(huán): for ($i = 0; $i < 10; $i++) { print "$group[$i] "; } while循環(huán): $i=0; while ($i < 10) { print "$group[$i] "; $i++; } do...while循環(huán): $i = 0; do { print "$group[$i] "; $i++; } while ($i < 10); until循環(huán): $i = 0; until ($i == 10) { print "$group[$i] "; $i++; } 從PASCAL語(yǔ)言借鑒來(lái)的do...until循環(huán): $i = 0; do { print "$group[$i] "; $i++; } until ($i == 10); 甚至還有利用動(dòng)態(tài)語(yǔ)言特性,用map關(guān)鍵字也可以做循環(huán): print map { "$_ " } @group; 其實(shí)還有其他的循環(huán)方式?偠灾,就是TMTOWTDI。 函數(shù) Perl提供了可以直接調(diào)用的、數(shù)目眾多的函數(shù)?梢詫(duì)以下對(duì)象進(jìn)行操作: * 數(shù)組: chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values * 數(shù)據(jù)庫(kù): 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 * 主機(jī): endhostent, gethostbyaddr, gethostbyname, sethostent * 輸入: getc, read, sysread * 處理器間通訊: msgctl, msgget, msgrcv, msgsnd, pipe, semctl, semget, semop, shmctl, shmget, shmread, shmwrite * 數(shù)學(xué): abs, atan2, cos, exp, hex, int, log, oct, rand, sin, sqrt, srand * 消息隊(duì)列: msgctl, msgget, msgrcv, msgsnd * 其他: bless, defined, do, eval, formline, import, ref, scalar, syscall, tie, tied, undef, untie, wantarray * 網(wǎng)絡(luò): endnetent, getnetbyaddr, getnetbyname, getnetent, setnetent * 輸出: die, print, printf, syswrite, warn, write * 口令: endpwent, getpwent, getpwname, getpwuid, setpwent * 進(jìn)程: alarm, die, dump, exec, exit, fork, getlogin, getpgrp, getppid, getpriority, kill, setpriority, sleep, system, times, umask, wait, waitpid * 協(xié)議: endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent * 正則表達(dá)式: grep, pos, quotemeta, reset, split, study * 范圍: caller, local, my * 服務(wù): endservent, getservbyname, getservbyport, getservent, setservent * 套節(jié)字: 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 * 時(shí)間: 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函數(shù)用法。 Perl的應(yīng)用 Perl主要應(yīng)用在Unix平臺(tái)和網(wǎng)頁(yè)中(PHP,CGI)。Perl擁有海量的模塊支持,在解決問(wèn)題時(shí)非常方便。CPAN是Perl模塊的集中營(yíng)。 Perl Data Language Perl Data Language(簡(jiǎn)稱PDL)是Perl的一個(gè)外接模塊,也是對(duì)Perl功能的一個(gè)重要拓展。它使得Perl語(yǔ)言可以直接對(duì)2至多維的矩陣直接操作,進(jìn)行快速的矩陣運(yùn)算,完成基礎(chǔ)的Perl所不能完成的運(yùn)算,大大拓展了Perl的適用范圍。所以PDL本身也是很多其他模塊的基礎(chǔ)。 而且PDL提供了與很多其他軟件包的接口,例如FFTW(一個(gè)快速傅立葉變換的軟件包),又或者是Mesa(Linux上的OpenGL三維圖形渲染包),這些包原來(lái)往往僅提供C/C++語(yǔ)言接口。這一功能使PDL成為拓展Perl功能的一個(gè)中間層。 Perl詩(shī)經(jīng) 和C語(yǔ)言一樣,在Perl界,難以讀懂的程式碼大賽是個(gè)有名的活動(dòng)。近似難以讀懂的程式碼,但方向不同,Perl Poetry是可以被perl編譯的詩(shī)。新的詩(shī)經(jīng)通常會(huì)在Perl Monks網(wǎng)站發(fā)表。 另一個(gè)Perl hackers的有趣活動(dòng)是寫JAPHs。 競(jìng)爭(zhēng)對(duì)手 因?yàn)樵S多Perl程序的代碼難以閱讀,加上它的面向?qū)ο蠊δ鼙灰暈椴皇钦嬲拿嫦驅(qū)ο螅谑呛芏嗳四肞erl和其他動(dòng)態(tài)語(yǔ)言來(lái)比較。 最常見(jiàn)是比較對(duì)象是Python,有人寫了篇文章叫What&#39;&#39;s wrong with Perl,指出Perl的缺點(diǎn),鼓勵(lì)別人學(xué)Python。著名黑客埃里克·斯蒂芬·雷蒙寫Why Python?,該文中一個(gè)重要的比較對(duì)象就是Perl。 Ruby的作者(松本行弘,Matz)甚至直認(rèn)他想Ruby作為Perl的后繼者。[1] Perl的歷史 1987/10/18發(fā)表Perl 1.0 1994年發(fā)表Perl 5 始具有OOP的作法 5.8.0 版開(kāi)始, Perl 具備了Unicode(萬(wàn)國(guó)碼)支援 將 Big5 編碼的檔案轉(zhuǎn)成 Unicode, 祗需鍵入下列指令: perl -Mencoding=big5,STDOUT,utf8 -pe1 < file.big5 > file.utf8 Perl 也內(nèi)附了 ``piconv, 一支完全以 Perl 寫成的字碼轉(zhuǎn)換工具程式, 用法如下: piconv -f big5 -t utf8 < file.big5 > file.utf8 piconv -f utf8 -t big5 < file.utf8 > file.big5 2003年發(fā)表了Perl 6 Perl 6 Perl 6正在開(kāi)發(fā)中,它將會(huì)與現(xiàn)在的Perl版本有很大不同,但相信還要開(kāi)發(fā)一段長(zhǎng)時(shí)間。 注釋 ^ “我認(rèn)為 Ruby 這個(gè)名字作為 Perl 之后的一門語(yǔ)言的名字真是再恰當(dāng)不過(guò)了!--摘錄自O(shè)&#39;&#39;Reilly 訪問(wèn) Matz。 參見(jiàn) CPAN Parrot 外部鏈接 Perl.com(O&#39;&#39;REILLY) Perl.org Perl 6 的開(kāi)發(fā)網(wǎng)頁(yè) CPAN - Comprehensive Perl Archive Network:Perl 程式的集中地 CPAN 檢索 dmoz on Perl Perl Mongers:全球各地的使用者組織 Perl Monks:一個(gè)很活躍的 Perl 社區(qū) ActiveState:Microsoft Windows 上的 Perl Perl6::Perl5::Differences 中文 中國(guó) Perl 協(xié)會(huì) 香港 Perl 推廣組 Perl@Taiwan Perl 學(xué)習(xí)手札 中國(guó) Perl 協(xié)會(huì)會(huì)員中心(通過(guò)標(biāo)簽和地域聚合人) 中國(guó) Perl 協(xié)會(huì)的 wiki(中文翻譯)
移動(dòng)通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊(duì)博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助