百科解釋
目錄·Perl簡介·Perl 的語法·函數(shù)·Perl的應用·競爭對手·Perl的歷史·注釋·參見·外部鏈接 Perl是一種腳本語言。 最初的設計者為拉里·沃爾(Larry Wall),它于1987年12月18日發(fā)表。Perl借取了C、sed、awk、shell s cripting 以及很多其他編程語言的特性。其中最重要的特性是他內(nèi)部集成了正則表達式的功能,以及巨大的第三方代碼庫 CPAN。 Perl簡介 Perl原名pearl,但是在這個語言官方發(fā)表前,拉里·沃爾發(fā)現(xiàn)已經(jīng)有個編程語言“pearl”,便將這個編程語言的名字改成Perl。對于Perl這四個字母,有一些解釋,包括充滿幽默感的“Pathologically Eclectic Rubbish Lister”!癙ractical Extraction and Report Language”曾經(jīng)出現(xiàn)在很多有關(guān)Perl的資料里,包括官方的主頁。不過事實上這個長名字是后來湊出來的。它的名字第一個字母大寫(Perl)時就指這個編程語言,無大寫字母(perl)時就指它的直譯器。將Perl寫成“PERL”是不適當?shù),因為它并非一個縮寫字。 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編程語言的圖標。它也是一種黑客的象征,出現(xiàn)在某些T-shirt和其他衣服標簽上。 優(yōu)點 為了實現(xiàn)這樣的目標,并且又因為 Larry Wall 本人也是一個語言學家,他設計Perl語言時使用了很多語言學的思維。相比 C、Pascal 這樣的“高級”語言而言,Perl語言直接提供泛型變量、動態(tài)數(shù)組、Hash表等更加便捷的編程元素。Perl 具有動態(tài)語言的強大靈活的特性,并且還從C/C++、Basic、Pascal 等語言中分別借鑒了語法規(guī)則,從而提供了許多冗余語法。使得程序員可以忽略計算機內(nèi)部資料存儲、類型、處理方法、運算規(guī)則、甚至內(nèi)存越界等等的細節(jié),而將思考中心放在所需要的程序邏輯上。就這一點而言,很多 Perl 程序員認為目前只有 Perl、Python等泛型語言才能稱為“高級”語言,而 C、Pascal 甚至 C++ 這些只能稱為“中高級”語言而已。可以說,在統(tǒng)一變量類型和掩蓋運算細節(jié)方面,Perl 做得比 Python 更為出色。 由于從其他語言大量借鑒了語法,使得從其他編程語言轉(zhuǎn)到 Perl 語言的程序員可以迅速上手寫程序并完成任務,這使得 Perl語言是一門容易用的語言。但問題是這樣寫出來的“類xx語言”的 Perl 程序?qū)Σ皇煜み@種語言的程序員卻如同天書,這使得 Perl 語言易寫不易讀。 缺點 也正是因為 Perl 的靈活性和“過度”的冗余語法,也因此獲得了 write-only 的“美譽”,因為許多 Perl 程序的代碼令人難以閱讀,實現(xiàn)相同功能的程序代碼長度可以相差十倍百倍。 但 Perl 同樣可以將代碼書寫得像 Python 或 Ruby 等語言一樣優(yōu)雅。 Perl 的語法 Perl 的 Hello World 程式 下面是一個在標準輸出設備上輸出 Hello World 的簡單程式,這種程式通常作為開始學習編程語言的第一個范例: #!/usr/bin/perl print "Hello, world! "; 這個程序?qū)⑤敵鲆恍凶址骸癏ello,world!”,以及一個回車換行符。 變量 Perl 是一種 泛型語言,換句話說,在語言層面上,Perl 和大多數(shù)編程語言不同,不把變量分成整數(shù)、字符、浮點數(shù)等等,而只有一種能接受各種類型數(shù)據(jù)的“泛型”變量。Perl的變量以$字符開頭。例如<tt>$a=5;</tt><tt>$b="Hello"</tt>;<tt>$c=3.2;</tt>都是合法的 Perl 語句。 Perl中各種變量的運算也很自由,數(shù)和含有數(shù)的字符串是等效的,可以把數(shù)字字符串參與數(shù)學計算,也可以反之,讓數(shù)字參與字符串的構(gòu)成和操作。 除單個變量(Perl 稱為 Scalar)之外,Perl 還有兩種集合類型,分別是數(shù)組(Array,用@字符開頭)和關(guān)聯(lián)數(shù)組(Associative array,或者稱為Hash,用%開頭。類似 C++ 的 STL map 和 Python 的 Dictionary)。數(shù)組可以內(nèi)含任意可變數(shù)目的變量。而Hash表,則可以在變量之間建立一一映射,就像字典一樣,可以把不同的變量按照他們的邏輯關(guān)系組織起來。 判斷語句 因為Perl大量的創(chuàng)造冗余的語法,并且從其他語言中大量的借鑒語法,使得Perl的語法極其豐富和靈活。Perl共有下列幾種判斷語句: <tt>if</tt>模塊 if ($hour > 22) { print "should sleep... "; } <tt>if</tt>語句 print "hello" if $guest >= 1; <tt>unless</tt>模塊 unless ($credit > 100) { print "You can not graduate! "; } <tt>unless</tt>語句 print "eat " unless $food == 0; 由于邏輯算子的作用,還可以寫出不用關(guān)鍵字<tt>if</tt>或<tt>unless</tt>的判斷語句,如常用的打開文件語句: open(DATA, "< $filename") or die "Can&#39;&#39;t open $filename: $! "; 循環(huán)語句 Perl中的循環(huán)語句也是非常的豐富。主要有: Perl自己的for或者foreach循環(huán): @group = 1 .. 10; for (@group) { print "$_ "; } foreach (@group) { print "$_ "; } 從C語言借鑒來的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語言借鑒來的do...until循環(huán): $i = 0; do { print "$group[$i] "; $i++; } until ($i == 10); 甚至還有利用動態(tài)語言特性,用map關(guān)鍵字也可以做循環(huán): print map { "$_ " } @group; 其實還有其他的循環(huán)方式。總而言之,就是TMTOWTDI。 函數(shù) Perl提供了可以直接調(diào)用的、數(shù)目眾多的函數(shù)?梢詫σ韵聦ο筮M行操作: * 數(shù)組: chomp, join, keys, map, pop, push, reverse, shift, sort, splice, split, unshift, values * 數(shù)據(jù)庫: 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 * 數(shù)學: 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 * 網(wǎng)絡: 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 * 協(xié)議: endprotent, getprotobyname, getprotobynumber, getprotoent, getservbyname, getservbyport, getservent, setprotoent * 正則表達式: grep, pos, quotemeta, reset, split, study * 范圍: caller, local, my * 服務: 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 * 時間: 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的應用 Perl主要應用在Unix平臺和網(wǎng)頁中(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詩經(jīng) 和C語言一樣,在Perl界,難以讀懂的程式碼大賽是個有名的活動。近似難以讀懂的程式碼,但方向不同,Perl Poetry是可以被perl編譯的詩。新的詩經(jīng)通常會在Perl Monks網(wǎng)站發(fā)表。 另一個Perl hackers的有趣活動是寫JAPHs。 競爭對手 因為許多Perl程序的代碼難以閱讀,加上它的面向?qū)ο蠊δ鼙灰暈椴皇钦嬲拿嫦驅(qū)ο,于是很多人拿Perl和其他動態(tài)語言來比較。 最常見是比較對象是Python,有人寫了篇文章叫What&#39;&#39;s wrong with Perl,指出Perl的缺點,鼓勵別人學Python。著名黑客埃里克·斯蒂芬·雷蒙寫Why Python?,該文中一個重要的比較對象就是Perl。 Ruby的作者(松本行弘,Matz)甚至直認他想Ruby作為Perl的后繼者。[1] Perl的歷史 1987/10/18發(fā)表Perl 1.0 1994年發(fā)表Perl 5 始具有OOP的作法 5.8.0 版開始, Perl 具備了Unicode(萬國碼)支援 將 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正在開發(fā)中,它將會與現(xiàn)在的Perl版本有很大不同,但相信還要開發(fā)一段長時間。 注釋 ^ “我認為 Ruby 這個名字作為 Perl 之后的一門語言的名字真是再恰當不過了!--摘錄自O&#39;&#39;Reilly 訪問 Matz。 參見 CPAN Parrot 外部鏈接 Perl.com(O&#39;&#39;REILLY) Perl.org Perl 6 的開發(fā)網(wǎng)頁 CPAN - Comprehensive Perl Archive Network:Perl 程式的集中地 CPAN 檢索 dmoz on Perl Perl Mongers:全球各地的使用者組織 Perl Monks:一個很活躍的 Perl 社區(qū) ActiveState:Microsoft Windows 上的 Perl Perl6::Perl5::Differences 中文 中國 Perl 協(xié)會 香港 Perl 推廣組 Perl@Taiwan Perl 學習手札 中國 Perl 協(xié)會會員中心(通過標簽和地域聚合人) 中國 Perl 協(xié)會的 wiki(中文翻譯)
移動通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團隊博客 | 免責聲明 | 關(guān)于詞典 | 幫助