PERLFAQ1(7)

NAME
perlfaq1 - 有關 Perl 的一般問題 (2003/11/23 08:02:29)

DESCRIPTION 描述
有關 Perl 的一般的，非技術層次的問題

  What is 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）的成員是一群高度熱情奉獻的人仕，全心投入發展出比您所能想像、用錢能買得到還要更好的免費軟體。您可經由 http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/ 和 http://archive.develooper.com/perl5-porters@perl.org/ 或者新聞伺服器 nntp://nntp.perl.org/perl.perl5.porters 或它的 web 介面 http://nntp.perl.org/group/perl.perl5.porters , 也可以訂閱郵件列表 perl5-porters-request@perl.org (沒有主題的空訊息也是可以的) 取得關於新近發展計畫 的資訊。

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

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

  Which version of Perl should I use? 我該用哪一個版本的 Perl？
您絕對該用第五版。第四版不但老舊、功能較侷限，而且已經不再維護了。它最後一次的修正 (4.036)是在 1992年。Perl最新的量產發行版本是5.8.2 (但是 5.005_03 和 5.6.2 也被支援)。等到您讀這篇文章時，我們可能已經又發行了幾個正式的除錯版本，同時大概又會有些替下一版 路的實驗版出來。本文由此開始凡提及 Perl語言，皆以目前的量產發行為準，除非另外特別註明。所有 5.004 之前的版本都有 buffer 溢位漏洞，是非常嚴重的問題。

  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的發行基本上是從零開始，所有程式碼完全重新寫過的版本。它已經被模組化、物件導向化、微調、精簡化，及效率化，以致程式碼幾乎已變得和原來的不相同了。儘管如此，使用介面大致上仍然相同，而且和先前的版本之間保持了很高的 一致性。參見 perltrap 中的 "Perl4 to Perl5 Traps" .

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

參見 perlhist 中 Perl 版本的歷史

  What is Ponie? 什麼是 Ponie
At The O'Reilly Open Source Software Convention in 2003, Artur Bergman, Fotango, and The Perl Foundation announced a project to run perl5 on the Parrot virtual machine named Ponie. Ponie stands for Perl On New Internal Engine. The Perl 5.10 language implementation will be used for Ponie, and there will be no language level differences between perl5 and ponie. Ponie is not a complete rewrite of perl5.

For more details, see http://www.poniecode.org/

  What is perl6?
At The Second O'Reilly Open Source Software Convention, Larry Wall announced Perl6 development would begin in earnest. Perl6 was an oft used term for Chip Salzenberg's project to rewrite Perl in C++ named Topaz. However, Topaz provided valuable insights to the next version of Perl and its implementation, but was ultimately abandoned.

If you want to learn more about Perl6, or have a desire to help in the crusade to make Perl a better place then peruse the Perl6 developers page at http://dev.perl.org/perl6/ and get involved.

Perl6 is not scheduled for release yet, and Perl5 will still be supported for quite awhile after its release. Do not wait for Perl6 to do whatever you need to do.

"We're really serious about reinventing everything that needs reinventing." --Larry Wall

  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, 有時讀作「time today」）。因此，Perl的學習曲線是既平（易學）且長的（如果您要的話，有一大堆夠您學的）

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

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

  How does Perl compare with other languages like Java, Python, REXX, Scheme, or Tcl?
Perl在某些地方比較好，某些地方較差。精確地說到底哪些方面好或壞通常視個人偏好而定，所以在新聞討論群中問這種問題很可能會掀起一場毫無建設性的聖戰。

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

如果還是不聽勸告的話，可以去看 http://language.perl.com/versus/ 的語言比較

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

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

話雖如此，對解決某些特定的問題，使用小型、專精，專為特殊用途設計的語言總 是比較方便的。 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？
都無所謂。他半開玩笑地說，"指令碼 script 是你讓演員來演的。程式 program 是你給觀眾的。"

最初，指令碼是打包的普通的互動的命令序列，-- 也就是說，一個對話指令碼，類似 UUCP 或 PPP 對話指令碼或者一個 expect 指令碼，可以很好地處理一些小事，類似在應用程式啟動之前進行一些俄設定等等，類似 .cshrc 或 .ircrc。對話指令碼僅僅是驅動已有的程式，並不是獨立的程式。

計算機專家會解釋說，所有程式都是解釋執行的，但是問題是從哪個層次去考慮。如果你問一個不是計算機專家的人，他們可能告訴你，一個 program 是已被編譯為機器碼，一次編譯多次執行的東西，而一個 script 在每次使用時都必須首先翻譯為 program

Perl 程式通常不是嚴格的編譯或解釋執行的。它們可以被編譯為位元組碼形式 (可以在 Perl 虛擬機器中執行) 或者完全不同的其他語言，例如 C 或彙編。你不能僅僅從源程式推斷它是否應當被一個純直譯器，一個分析樹直譯器，一個位元組碼直譯器或者一個原生代碼編譯器來執行，因此在這裡很難給出一個確定的答案

現在 script 和 scripting 已成為被不慎重的人和無知的商人為了自己惡毒的目的而用到的兩個詞，它們開始擁有奇怪的，貶義的含義，類似 "不嚴謹 non serious" 或 "不是真正的程式設計". 因此，一些 Perl 程式設計師選擇不把它們同時比較。

  JAPH 是什麼？
這是過去一些在討論群中自稱 ``just another perl hacker'' 的人的簽名檔，Randal Schwartz 開了這樣的先河。約有一百個比較早期的版本，可在 http://www.cpan.org/misc/japh 獲得。

  到哪兒可拿到 Larry Wall 的智慧諷語 (witticisms)？
一百多條 Larry的諷語，源自他【在討論群】的 posts或原始碼，可在 http://www.cpan.org/misc/lwall-quotes.txt.gz 獲得

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

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

參見 http://www.perl.org/advocacy/

如果您面對反對 perl升級的聲音，那麼告訴他們 Perl發展小組已經完全不再維護或支援第四版的 perl了。perl5的另一個大賣點是它有大量的模組和延伸，可大大減少計畫的發展時間。還有，告訴他們第四和第五版 Perl之間的差異就如 awk 和 C++的差別一樣（嗯，或許沒有差得那麼明顯，但您知道我的意思就好）。如果您想得到支援而且想確保您現在所發展的軟體在未來能繼續工作的話，那麼您得跑有支援的版本。在 2003 年 12 月，這大概也就是說要跑 5.8.2 版的，或者稍微舊一些的版本如5.6.2 (November 2003 釋出; 一個修正發行，使得 perl 5.6 在新系統中可以編譯，因為 5.6.1發行早在 April 2001) 或 5.005_03 (March 1999 發行), 如果你一定要一箇舊版本來保持相容性，使用 5.004_05 也不壞。比 5.004_05 更舊的版本堅決不能再用

Of particular note is the massive bug hunt for buffer overflow problems that went into the 5.004 release. All releases prior to that, including perl4, are considered insecure and should be upgraded as soon as possible.

In August 2000 in all Linux distributions a new security problem was found in the optional 'suidperl' (not built or installed by default) in all the Perl branches 5.6, 5.005, and 5.004, see http://www.cpan.org/src/5.0/sperl-2000-08-05/ Perl maintenance releases 5.6.1 and 5.8.0 have this security hole closed. Most, if not all, Linux distribution have patches for this vulnerability available, see http://www.linuxsecurity.com/advisories/ , but the most recommendable way is to upgrade to at least Perl 5.6.1.

AUTHOR AND COPYRIGHT
Copyright (c) 1997, 1998, 1999, 2000, 2001 Tom Christiansen and Nathan Torkington. All rights reserved.

This documentation is free; you can redistribute it and/or modify it under the same terms as Perl itself.

Irrespective of its distribution, all code examples here are in the public domain. You are permitted and encouraged to use this code and any derivatives thereof in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit to the FAQ would be courteous but is not required.

譯者
蕭百齡，兩隻老虎工作室

  跋
本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃：https://github.com/man-pages-zh/manpages-zh