perlfaq1 - perl常問問題集,第一篇

目錄


篇名

perlfaq1 - 概括性的 Perl 問題(原文版 Revision: 1.12, Date: 1997/04/24 22:43:34. 17:23:09.中譯版 $Revision: 1.12 $ $Date: 1997/07/12 20:41:48 $)


概述

本篇涵蓋非常概括性、高層次的 Perl 問題。


Perl是什麼?

Perl是一個高階程式語言,由 Larry Wall和其他許多人所寫,融合了許多語言的特性。它主要是由無所不在的 C語言,其次由 sed、awk,UNIX shell 和至少十數種其他的工具和語言所演化而來。Perl對 process、檔案,和文字有很強的處理、變換能力,因此舉凡有關快速原型設計、系統工具、軟體工具、系統管理、資料庫連結、圖像程式設計、網路連結,和 WWW程式設計等之類的任務,都特別 適合用 Perl來做。這些特長不但使 Perl成為系統維護管理者和 CGI作者的寵兒,就連數學家、遺傳學家、新聞從業者,甚至企業管理者也都用 Perl,所以或許您也該用。


誰對 perl提供支援?由誰負責發展?它為什麼是免費的?

Perl自由開放的發行方式要歸功於發燒前的 Internet的傳統文化及其作者 Larry Wall。Perl是由使用者提供支援。現在 Perl的核心、標準程式庫、選擇性安裝的模組,以及您現在正在閱讀的使用說明都出自於義務者之手。詳情請見 perl原始碼發行版中所附的 README檔案底部的私人註記。

值得一提的是,核心發展小組(稱為 Perl Porters)的成員是一群高度熱情奉獻的人仕,全心投入發展出比您所能想像、用錢能買得到還要更好的免費軟體。您可經由 news://genetics.upenn.edu/perl.porters-gw/http://www.frii.com/~gnat/perl/porters/summary.html取得關於新近發展計畫 的情報。

儘管 GNU計畫將 Perl囊括在它的發行中,但是沒有叫「GNU Perl」這樣的東西。 Perl既非自由軟體基金會所創,亦非由其負責維護。Perl的發行條款同時也較 GNU軟體更來得開放。

如果您願意,您可以購買商業性的 Perl支援。但對大多數使用者來說,非正式性的支援通常已相當足夠。詳情請見「到哪裡可買到商業性的 Perl支援」一問的回 答。


我該用哪一個版本的 Perl?

您絕對該用第五版。第四版不但老舊、功能較局限,而且已經不再維護了。它最後 一次的修正 (4.036)是在 1992年。Perl最新的量產發行版本是5.004。等到您 讀這篇文章時,我們可能已經又發行了幾個正式的除錯版本,同時大概又會有些替 下一版舖路的實驗版出來。本文由此開始凡提及 Perl語言,皆以目前的量產發行 為準,除非另外特別註明。


perl4和 perl5各代表什麼?

perl4 和 perl5 是對 Perl程式語言的兩個不同版本的非正式稱呼,因為說「perl5」要比說「第 5(.004)版的 Perl」要來得簡單。但是有些人誤將其會意為:perl5是一個單獨的語言;這是不正確的。perl5只不過是對第五個主要發行版本(1994年 10 月)常用的稱呼罷了。就像 perl4是指第四個主要發行(1991年 3 月),還有 perl1(1988年 1月)、perl2(1988年 6 月),以及 perl3(1989年 10 月)。

5.0的發行基本上是從零開始,所有程式碼完全重新寫過的版本。它已經被模組化、物件導向化、微調、精簡化,及效率化,以致程式碼幾乎已變得和原來的不相同了。儘管如此,使用介面大致上仍然相同,而且和先前的版本之間保持了很高的 一致性。

為了避免「perl5是什麼語言?」這類的混淆,有些人索性完全避免「perl5」, 而單用「perl」來指稱最近的 perl版本。其實用不著這麼累就是了。


Perl的發展已穩定了嗎?

融合了除錯和新功能的量產發行在推出前皆經過廣泛的測試。自 5.000發行以來, 我們平均一年才出版一次量產發行。

Larry 和 Perl發展小組有時候會修改語言的核心部分,但總是盡一切力量讓新版 和舊版保持一致。因此,儘管不是所有的 perl4 scripts都能在 perl5 之下跑得天衣無縫,因升級而導致按照先前版本的 perl所寫的程式無法使用的情形幾乎不曾發生(除非該程式倚賴已經被去除的 bugs,或使用了極少數新加入的指令來 命名)。


Perl難學嗎?

Perl不但容易上手,也容易繼續學下去。它看起來和大多數您可能已接觸過的語言一樣。所以如果您只寫過 C 程式、或 awk script、shell script,或甚至只是 Excel的 macro(巨集),您已經在半路了。

大多數的任務只需要 Perl語言的一小部分即可完成。發展 Perl程式的座右銘即 是「不只一種方法可以達到」(TMTOWTDI; There's More Than One Way To Do It, 有時讀作「隄姆投迪」)。因此,Perl的學習曲線是既平(易學)且長的 (如果您要的話,有一大堆夠您學的)。

最後,Perl(通常)算是解譯式的語言。也就是說您寫了程式後不需經由一道中 間的編碼過程即可測試;這讓您可以很快、很容易地測試及除錯。這個方便試驗的 特性又讓學習曲線變得更加平坦。

有助於修習 Perl 的一些事:UNIX經驗、對幾乎是任何一種程式語言的經驗、了解 regular expressions(正規表示法),以及看得懂旁人寫的程式的能力。如果您有什麼想用 Perl來做的事,那麼可能已經有前人做過了,而且實例通常可免費取得。還有別忘了新的 Perl模組。模組在這份 FAQ 的第三部分有詳細的討論,還有【別忘了您的好朋友】 CPAN,這會在第二部分談到。


Perl和其他的程式語言比起來如何?例如 Java, Python, REXX, Scheme,或 Tcl?

Perl在某些地方比較好,某些地方較差。精確地說到底哪些方面好或壞通常視個 人偏好而定,所以在新聞討論群中問這種問題很可能會掀起一場毫無建設性的聖戰。

要比較各語言的異同最好的方法是試著用不同的語言寫功能相同的程式。各程式語言都各有屬於它們各自的新聞討論群,您可從中學習(但希望您不是去和人辨論吵 架的)。


我可以用 Perl來做【某種差事】嗎?

Perl有足夠的彈性和擴充性,從只需要寫短短一行的檔案處理工作到複雜的系統,幾乎沒有什麼做不到的。對有些人來說,Perl的是拿來做寫 shell程式的理想替代品。其他人則用高階的 Perl來替代處理許多原先需要用 C或 C++ 一類的低階語言來達到的程式。哪些差事決定要用 Perl來處理,這一切都得看您(或許還有您的經理...)。

如果您有一個提供 API的程式庫的話,您可用 C或 C++來寫一個 Perl 延伸,然後便可透過它將程式庫中的任何一部分動態載入您的 Perl主程式中。您也可以 反過來,用 C或 C++來寫主程式,然後以即時動態載入的方式插入一些Perl程式碼,產生一個威力強大的應用程式。

話雖如此,對解決某些特定的問題,使用小型、專精,專為特殊用途設計的語言總 是比較方便的。 Perl的設計是盡力地滿足各種不同人的需要,因而不特別偏頗任何人。至於特殊功能語言的例子,隨便舉兩個,譬如 prolog 和 matlab 便是。


哪些場合下不適合用 Perl?

當您的主管禁止的時候 -- 不過請務必考慮把他們換掉 :-)。

說真的,如果您已經有用另一個語言寫成的應用程式(而且寫得很好)的時候,或 者是已經有替某些特定的工作設計的語言(例如:prolog, make),這個時候就不 需要用 Perl。

由於種種因素,Perl大概不太適合拿來做即時內嵌式系統、屬於低層級的作業系統發展工作,例如周邊設備的 drivers或環境轉換碼、複雜的多線共用記憶體應用程式,或非常大的應用程式。您會發現 Perl 本身便不是以 Perl寫成的。

剛出爐的 Perl純碼編譯器或許可幫忙去除一些上述的限制,但您要了解:Perl在本質上仍是一活性變數語言 (dynamically typed language),而非固性變數 (statically typed)。只要您不將核電廠或腦科手術監視器所用的程式放心地用 Perl來寫,您自然就不會闖禍遭殃。這樣 Larry晚上也可以睡得安穩些 --股市分析程式不在此限 :-)。


「perl」和「Perl」有什麼不同?

二者差一個位元。喔,您不是說在 ASCII上的差別啊? :-) Larry現在用「Perl」來代表語言本身,而以「perl」來表示該語言的體現,即目前的解譯器。因此,作者有句幽默小語說:「只有 perl可以解譯 Perl」。要不要遵照這個用法是您的自由。舉一反三的話,我們可依樣畫葫蘆地說「awk 和 perl」還有「Python 和 Perl」,但卻不可將「awk 和 Perl」或是「Python 和 perl」擺在一起。


Perl程式應算是 program還是 script?

都無所謂。

按標準術語來講,program指已經由編譯程序編譯好、轉為機器碼,可多次執 行的程式;而 script則是每次執行時都必須透過一個解譯程式來解譯。然而,Perl程式嚴格說來,既非編譯 (compiled) ,亦非解譯式 (interpreted);因 Perl程式可轉譯成位元碼形式存在(可說是某種 Perl虛擬機器 [virtual machine]),或轉譯為完全不同的語言,如 C或組合語言。所以光看原始碼很難 說它到底是替純解譯器、或是 parse-tree解譯器、位元碼解譯器,還是純碼編譯器而寫;因此這題很難給它一個確切的答案。


JAPH是什麼?

這是過去一些在討論群中自稱 ``just another perl hacker'' 的人的簽名檔,約有一百個比較早期的,可在 http://www.perl.com/CPAN/misc/japh 取得。


到哪兒可拿到 Larry Wall的智慧諷語 (witticisms)?

一百多條 Larry的諷語,源自他【在討論群】的 posts或原始碼,可在 http://www.perl.com/CPAN/misc/lwall-quotes 取得。


我要如何取信、說服我的系統管理者/上司/屬下使用第 5/5.004版的 Perl,而不去用其他的語言?

如果您的管理階層或屬下對沒有支援的軟體,或是未正式包含在所購買的作業系統中的軟體存有戒心的話,您可以試著從有助他們自身利益這方面下手。因為如果程式設計師能由善加利用 Perl的結構、功能性、簡單性,和威力而獲得更大的生產力的話,那麼典型的管理者/上司/員工或許便可因而加以說服。此外,使用 Perl,總的來講,和其他語言相較,或許也有助於減少交件的時間。強調這個論 點或許對說服他們會有幫助。

如果您的專題碰到瓶頸,特別是有關轉譯或測試方面的問題,那麼 Perl可以說絕 對會是一個既可行且快的解決之道。您在當說客的時候,千萬別忘了要提:Perl已 被世界上許多大型的軟硬體公司廣泛、大量地使用,極為可靠、有效。事實上,現 Perl已成為許多 Unix業者所售的作業系統的標準配備了。而且如果您無法在 詳盡的使用說明,包括這份 FAQ之中為您的問題找到解答的話,送封 post 到新聞討論群即可。

如果您面對反對 perl升級的聲音,那麼告訴他們 Perl發展小組已經完全不再維護或支援第四版的 perl了。perl5的另一個大賣點是它有大量的模組和延伸,可大大減少計畫的發展時間。還有,告訴他們第四和第五版 Perl之間的差異就如 awk 和 C++的差別一樣(嗯,或許沒有差得那麼明顯,但您知道我的意思就好)。如果您想得到支援而且想確保您現在所發展的軟體在未來能繼續工作的話,那麼您得跑有支援的版本。這大概也就是說要跑 5.004 版的,儘管 5.003 版仍算是不錯(它只落後一年、一版)。不過因為有些嚴重的 bugs曾在 5.000 和 5.002版之間被消除,所以您至少應升級到比這幾個版本高才是。


作者及版權事宜

Copyright (c) 1997 Tom Christiansen and Nathan Torkington.著作權所有, All rights reserved。有關使用、(轉)發行事宜,詳見 perlfaq

中譯版著作權所有:蕭百齡及兩隻老虎工作室。本中譯版遵守並使用與原文版相同 的使用條款發行。