PERLFAQ(7)

NAME
perlfaq - Perl 常問問題集 (2003/01/31 17:37:17)

DESCRIPTION 描述
perlfaq 按照主題劃分為多個文件，在本文件的末尾有一個目錄。

  Where to get the perlfaq 如何取得這份檔案？
這份檔案會定期投到 comp.lang.perl.misc。也可以在許多網站上找到它，例如 http://www.perldoc.com/ 還有 http://faq.perl.org/ 譯者注：兩隻老虎工作室的位置是 http://2Ti.com/cgi-bin/2T/perl/ 還有 ftp://www.math.ncu.edu.tw/pub/staff/chenym/FAQ/Perl/ 還有 <pailing@2Ti.com>

  How to contribute to the perlfaq 如何為 perlfaq 做貢獻？
你可以將更正，擴充以及建議以郵件方式傳送到 perlfaq-workers@perl.org . 這個地址不能用來提問題，它只用來修正當前的 FAQ。如果有問題那麼投遞到新聞組 comp.lang.perl.misc。可以在 http://cvs.perl.org/cvsweb/perlfaq/ 檢視原始碼樹 (它是在主原始碼樹之外)。CVS 倉庫記錄了對 FAQ 的所有改變。

  What will happen if you mail your Perl programming problems to the authors 如果把程式設計問題寄給作者怎麼樣？
作者大概不會理會您所提的問題，除非您是在建議把一些新問題加進 FAQ去，但如果是這樣的話這些問題當初就該寄到 perlfaq-workers@perl.com 處才對。

您應該已經閱讀了這份 FAQ 的第二部分，您應該知道 comp.lang.perl.misc 才是尋求免費建議的適當地方。如果您的問題真的很重要而且您急著要得到正確解答，那麼您該請一個顧問。

Credits 致謝
最初的 perlfaq 由 Tom Christiansen 完成，接著在 Tom 和 Nathan Torkington 的合作下得以擴充套件。當前的文件由 perlfaq-workers (perlfaq-workers@perl.org) 進行維護，很多人貢獻了解答，更正和評註。

Author and Copyright Information
Copyright (c) 1997-2003 Tom Christiansen, Nathan Torkington, and other contributors noted in the answers.

All rights reserved.

  Bundled Distributions
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 in these files are hereby placed into the public domain. You are permitted and encouraged to use this code in your own programs for fun or for profit as you see fit. A simple comment in the code giving credit would be courteous but is not required.

  Disclaimer
This information is offered in good faith and in the hope that it may be of use, but is not guaranteed to be correct, up to date, or suitable for any particular purpose whatsoever. The authors accept no liability in respect of this information or its use.

Table of Contents 目錄

perlfaq  - 本文件
perlfaq1 - 有關 Perl 的一般問題
perlfaq2 - 獲取和學習 Perl
perlfaq3 - 程式設計工具
perlfaq4 - 資料操作
perlfaq5 - 檔案和格式
perlfaq6 - 正規表示式
perlfaq7 - 綜合的問題
perlfaq8 - 系統互動
perlfaq9 - 網路

The Questions 問題

  perlfaq1: 有關 Perl 的一般問題
有關 Perl 的一般的，非技術層次的問題

•   什麼是 Perl?

•   誰對 Perl 提供支援？誰開發了它？為什麼它是自由的？

•   我該用哪一個版本的 Perl？

•   perl4 和 perl5 各代表什麼？

•   perl6 是什麼?

•   Perl的發展已穩定了嗎？

•   Perl難學嗎？

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

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

•   哪些場合下不適合用 Perl？

•   「perl」和「Perl」有什麼不同？

•   Perl程式應算是 program還是 script？

•   JAPH 是什麼？

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

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

  perlfaq2: 獲取和學習 Perl
從哪裡尋找 Perl 的源程式和文件，支援以及相關事項

•   哪些平臺上有 Perl？要到哪裡去找？

•   要如何取得以二進位制形式發行的 Perl？

•   我的系統裡沒有 C編譯器。要如何編譯 perl？

•   我直接將 Perl的執行檔從一臺機器上覆制到另一臺機器上，但是程式跑不起來。

•   我抓回了原始碼，試著編譯 perl，但是 gdbm/dynamic loading/malloc/linking/...部分失敗。要如何將它搞定？

•   Perl有哪些模組和延伸？ CPAN是什麼？ CPAN/src/...又代表什麼？

•   是不是有一個經 ISO【國際標準局】或 ANSI【美國國家標準局】認可的 Perl版本？

•   Perl的相關資料要上哪兒找？

•   USENET上有哪些專門討論 Perl的新聞討論群？問題該投到哪裡？

•   如果我想投程式原始碼，該投到哪個板子上？

•   Perl 書籍

•   和 Perl 有關的雜誌

•   網路上的 Perl：接觸 FTP 和 WWW

•   有哪些討論 Perl 的郵件列表？

•   comp.lang.perl.misc 的檔案庫

•   如何購買商業版本的 Perl？

•   如果發現 bugs要向何處報告？

•   什麼是 perl.com? Perl Mongers? pm.org? perl.org? cpan.org?

  perlfaq3: 程式設計工具
程式設計工具和程式設計支援

•   我如何作 (任何事)?

•   如何以互動的方式使用 Perl?

•   有 Perl shell嗎?

•   怎樣查詢我的系統中安裝了哪些模組

•   如何替我的 Perl 程式除蟲?

•   如何檢測 (profile) 我的 perl 程式?

•   如何替我的 Perl程式作交叉參考 (cross-reference)?

•   有 Perl專用的美化列印程式 (pretty-printer)嗎?

•   有 Perl的 ctags 嗎?

•   有沒有一個 IDE 或圖形介面的 Perl 編輯器？

•   哪兒有 vi 用的 Perl 宏？

•   給 emacs用的 perl模式又要去哪抓呢?

•   如何在 Perl裡使用 curses?

•   X或 Tk如何與 Perl配合呢?

•   如何不靠 CGI或 Tk 幫助作出簡單的目錄（選單）?

•   如何讓我的 Perl程式跑得更快些?

•   如何讓我的 Perl 程式少用一些記憶體？

•   把區域性變數的引用返回是不安全的做法嗎?

•   我如何釋放一個數組或雜湊以縮小我的程式尺寸?

•   如何讓我的 CGI指令碼 (script)執行起來更有效率?

•   如何隱藏 Perl程式的原始碼?

•   如何把我的 Perl程式碼編譯成 byte code或 C?

•   怎樣把 Perl 編譯成 Java?

•   如何才能讓 "#!perl" 在 [MS-DOS,NT,...] 下起作用?

•   我能利用命令列寫出有用的程式嗎?

•   為何一行的 perl 程式無法在我的 DOS/Mac/VMS系統上運作?

•   我得去哪裡學 Perl的 CGI或是 Web程式設計呢?

•   從哪裡可以學習面向物件的 Perl 程式設計？

•   從哪裡可以學習將 Perl 與 C 連線？[h2xs, xsubpp]

•   我已經閱讀了 perlembed,perlguts 等等，但是還是不能在我的 C 程式中嵌入 perl；我作錯了什麼？

•   我試著執行我的指令碼時，看到了這樣的訊息。它是什麼意思？

•   什麼是 MakeMaker?

  perlfaq4: 資料操作
操縱數字，日期，字串，陣列，雜湊以及各種其他資料型別。

•   Why am I getting long decimals (eg, 19.9499999999999) instead of the numbers I should be getting (eg, 19.95)?

•   Why isn't my octal data interpreted correctly?

•   Does Perl have a round() function? What about ceil() and floor()? Trig functions?

•   How do I convert between numeric representations?

•   Why doesn't & work the way I want it to?

•   How do I multiply matrices?

•   How do I perform an operation on a series of integers?

•   How can I output Roman numerals?

•   Why aren't my random numbers random?

•   How do I get a random number between X and Y?

•   How do I find the day or week of the year?

•   How do I find the current century or millennium?

•   How can I compare two dates and find the difference?

•   How can I take a string and turn it into epoch seconds?

•   How can I find the Julian Day?

•   How do I find yesterday's date?

•   Does Perl have a Year 2000 problem? Is Perl Y2K compliant?

•   How do I validate input?

•   How do I unescape a string?

•   How do I remove consecutive pairs of characters?

•   How do I expand function calls in a string?

•   How do I find matching/nesting anything?

•   How do I reverse a string?

•   How do I expand tabs in a string?

•   How do I reformat a paragraph?

•   How can I access or change N characters of a string?

•   How do I change the Nth occurrence of something?

•   How can I count the number of occurrences of a substring within a string?

•   How do I capitalize all the words on one line?

•   How can I split a [character] delimited string except when inside [character]?

•   How do I strip blank space from the beginning/end of a string?

•   How do I pad a string with blanks or pad a number with zeroes?

•   How do I extract selected columns from a string?

•   How do I find the soundex value of a string?

•   How can I expand variables in text strings?

•   What's wrong with always quoting "$vars"?

•   Why don't my <<HERE documents work?

•   What is the difference between a list and an array?

•   What is the difference between $array[1] and @array[1]?

•   How can I remove duplicate elements from a list or array?

•   How can I tell whether a certain element is contained in a list or array?

•   How do I compute the difference of two arrays? How do I compute the intersection of two arrays?

•   How do I test whether two arrays or hashes are equal?

•   How do I find the first array element for which a condition is true?

•   How do I handle linked lists?

•   How do I handle circular lists?

•   How do I shuffle an array randomly?

•   How do I process/modify each element of an array?

•   How do I select a random element from an array?

•   How do I permute N elements of a list?

•   How do I sort an array by (anything)?

•   How do I manipulate arrays of bits?

•   Why does defined() return true on empty arrays and hashes?

•   How do I process an entire hash?

•   What happens if I add or remove keys from a hash while iterating over it?

•   How do I look up a hash element by value?

•   How can I know how many entries are in a hash?

•   How do I sort a hash (optionally by value instead of key)?

•   How can I always keep my hash sorted?

•   What's the difference between "delete" and "undef" with hashes?

•   Why don't my tied hashes make the defined/exists distinction?

•   How do I reset an each() operation part-way through?

•   How can I get the unique keys from two hashes?

•   How can I store a multidimensional array in a DBM file?

•   How can I make my hash remember the order I put elements into it?

•   Why does passing a subroutine an undefined element in a hash create it?

•   How can I make the Perl equivalent of a C structure/C++ class/hash or array of hashes or arrays?

•   How can I use a reference as a hash key?

•   How do I handle binary data correctly?

•   How do I determine whether a scalar is a number/whole/integer/float?

•   How do I keep persistent data across program calls?

•   How do I print out or copy a recursive data structure?

•   How do I define methods for every class/object?

•   How do I verify a credit card checksum?

•   How do I pack arrays of doubles or floats for XS code?

  perlfaq5: 檔案和格式
I/O and the "f" issues: filehandles, flushing, formats, and footers.

•   How do I flush/unbuffer an output filehandle? Why must I do this?

•   How do I change one line in a file/delete a line in a file/insert a line in the middle of a file/append to the beginning of a file?

•   How do I count the number of lines in a file?

•   How can I use Perl's "-i" option from within a program?

•   How do I make a temporary file name?

•   How can I manipulate fixed-record-length files?

•   How can I make a filehandle local to a subroutine? How do I pass filehandles between subroutines? How do I make an array of filehandles?

•   How can I use a filehandle indirectly?

•   How can I set up a footer format to be used with write()?

•   How can I write() into a string?

•   How can I output my numbers with commas added?

•   How can I translate tildes (~) in a filename?

•   How come when I open a file read-write it wipes it out?

•   Why do I sometimes get an "Argument list too long" when I use <*>?

•   Is there a leak/bug in glob()?

•   How can I open a file with a leading ">" or trailing blanks?

•   How can I reliably rename a file?

•   How can I lock a file?

•   Why can't I just open(FH, ">file.lock")?

•   I still don't get locking. I just want to increment the number in the file. How can I do this?

•   All I want to do is append a small amount of text to the end of a file. Do I still have to use locking?

•   How do I randomly update a binary file?

•   How do I get a file's timestamp in perl?

•   How do I set a file's timestamp in perl?

•   How do I print to more than one file at once?

•   How can I read in an entire file all at once?

•   How can I read in a file by paragraphs?

•   How can I read a single character from a file? From the keyboard?

•   How can I tell whether there's a character waiting on a filehandle?

•   How do I do a "tail -f" in perl?

•   How do I dup() a filehandle in Perl?

•   How do I close a file descriptor by number?

•   Why can't I use "C:\temp\foo" in DOS paths? What doesn't `C:\temp\foo.exe` work?

•   Why doesn't glob("*.*") get all the files?

•   Why does Perl let me delete read-only files? Why does "-i" clobber protected files? Isn't this a bug in Perl?

•   How do I select a random line from a file?

•   Why do I get weird spaces when I print an array of lines?

  perlfaq6: 正規表示式
模式匹配和正規表示式。

•   我該如何使用正規表示式才不至於寫出不合語法且難以維護的程式碼?

•   我無法匹配超過一行的內容，哪裡出了問題?

•   我如何取出位於不同行的兩個模式間之內容?

•   我把一個正規表示式放入 $/但卻沒有用。錯在哪裡?

•   如何在 LHS端【譯註：式子中運算元左端部份】作不區別大小寫式的替換，但在 RHS端【右端】保留大小寫區別?

•   如何使 "\w" 對應到附重音記號 (accented)的字元?

•   如何作一個適合不同 locale【譯註：語言環境，國家地區在文字編碼上各自的慣例】的 "/[a-zA-Z]/" 對應?

•   在一個正規表示式裡如何引入 (quote) 變數?

•   "/o" 到底是幹麼用的?

•   如何使用正規表示式將檔案中 C語言樣式的註解刪掉?

•   我能用 Perl的正規表示式去對應成對的符號嗎?

•   有人說正規表示式很貪婪，那是什麼意思?該如何避免它所帶來的問題?

•   如何處理每一行的每個字?

•   我如何印出文字出現頻率或行出現頻率的綱要?

•   如何能作近似對應?

•   我如何有效率地一次對應多個正規表示式?

•   為何我用 "\b" 作字界搜尋時會失敗呢?

•   為什麼每當我用 $&, $`,或 $'時程式的速度就慢下來了呢?

•   正規表示式中的 "\G" 能給我什麼好處?

•   Perl正規表示引擎是 DFA 或 NFA?它們是 POSIX 相容的嗎?

•   在無返回值上下文中用 grep或 map有什麼不對?

•   如何對應多位元組字母所構成的字串?

•   如何匹配使用者提供的模式？

  perlfaq7: 綜合的問題
綜合的 Perl 語言問題，不適於在其他所有段落中討論的問題

•   我能拿到 Perl的 BNF/yacc/RE嗎？

•   $@%*這些符號是什麼意思？我怎麼知道何時該使用他們呢？

•   字串加引號或使用分號及逗號是否絕對必要/還是完全沒必要？

•   我如何跳過一些傳回值？

•   我如何暫時濾掉警告訊息？

•   什麼是一個擴充 (extension)？

•   為何 Perl運運算元的優先順序和 C的不一樣？

•   我如何宣告/建立一個數據結構？

•   如何建立一個模組？

•   如何建立一個類？

•   如何知道一個變數是否是汙染的？

•   什麼是閉包？

•   什麼是變數自殺，我應該怎樣防止它？

•   如何傳遞/返回一個{函式 Function, 檔案控制代碼 FileHandle, 陣列 Array, 雜湊 Hash, 方法 Method, 正規表示式 Regex}?

•   如何建立一個靜態變數？

•   動態和靜態作用域有什麼區別？local() 和 my() 呢?

•   在存在同名內部變數的作用域中，如何存取一個動態變數？

•   深連線和淺連線有什麼不同？

•   為什麼 "my($foo) = <FILE>;" 不工作？

•   如何重定義一個內建函式，運算子 或者方法？

•   呼叫函式時 &foo 和 foo() 的形式有什麼不同?

•   如何建立一個分支語句？

•   如何捕獲對未定義變數，函式或方法的訪問？

•   為什麼找不到包含在同一個檔案中的方法？

•   如何找到當前的包？

•   如何註釋掉大塊的 perl 程式碼？

•   如何清空一個包？

•   如何使用變數值作為一個變數名？

•   "bad interpreter" 是什麼意思?

  perlfaq8: 系統互動
程序間通訊 (IPC), 使用者介面控制 (鍵盤，螢幕和指點裝置)。

•   如何找出正在執行的作業系統？

•   為什麼 exec() 不返回?

•   如何對鍵盤／螢幕／滑鼠做些花樣？

•   如何列印有顏色的內容？

•   如何只讀取一個鍵而不等待按下回車？

•   如何檢測鍵盤上已有輸入？

•   如何清屏？

•   如何獲取螢幕大小？

•   如何向使用者詢問密碼？

•   如何讀寫序列埠？

•   如何解碼加密的口令檔案？

•   如何在後臺開啟程序？

•   如何截獲控制字元/訊號？

•   在 Unix 系統中如何修改 shadow 檔案？

•   如何設定時間和日期？

•   如何 sleep() 或 alarm() 少於一秒的時間?

•   如何測度少於一秒的時間？

•   如何做 atexit()或 setjmp()/longjmp()的動作？（異常處理）

•   為何我的 sockets程式在 System V (Solaris)系統下不能用？「不支援的協議」這個錯誤訊息又是什麼意思？

•   如何從 Perl裡呼叫系統中獨特的 C函式？

•   在哪裡可以找引入檔來做 ioctl()或 syscall()？

•   為何 setuid perl程式會抱怨關於系統核心的問題？

•   如何開啟對某程式既輸入又輸出的管道 (pipe)？

•   為何用 system()卻得不到一個指令的輸出呢？

•   如何補捉外部指令的 STDERR？

•   為何當管道開啟失敗時 open()不會傳回錯誤訊息？

•   在輸出值是空的情境裡使用反向引號有何不對？

•   如何不經過 shell處理來呼叫反向引號？

•   為何給了 EOF（Unix上是 ^D，MS-DOS上是 ^Z）後我的程式就不能從 STDIN讀取東西了呢？

•   如何把 shell程式轉成 perl？

•   perl能處理 telnet或 ftp 會話嗎？

•   如何在 Perl裡達到 Expect的功能？

•   有沒有可能將 perl的指令列隱藏起來，以躲避像 "ps"之類的程式？

•   我在 perl script裡 {更動目錄，更改我的使用環境}。為何這些改變在程式執行完後就消失了呢？如何讓我做的修改顯露出來？

•   如何關閉一個程式的檔案控制代碼而不用等它完成呢？

•   如何 fork 一個守護程序？

•   如何知道自己是否在互動地執行？

•   如何為緩慢的事件設定超時？

•   如何設定 CPU 限額?

•   如何避免在 Unix 系統中產生殭屍程序？

•   如何使用 SQL 資料庫?

•   如何使 system() 在收到 control-C 時退出?

•   如何無阻塞地開啟一個檔案？

•   如何從 CPAN 安裝模組?

•   require 和 use 的區別是什麼？

•   如何設定我自己的模組/庫路徑？

•   如何將我自己的程式的路徑加入到模組/庫搜尋路徑中？

•   如何在執行時將一個目錄加入到我的 include 路徑中？

•   什麼是 socket.ph，從哪兒可以得到它？

  perlfaq9: 網路
網路通訊，網際網路以及少量有關 web 的內容

•   一個 CGI 指令碼的回應的正確格式是什麼？

•   我的 CGI 指令碼從命令列執行正常，但是在瀏覽器中不行 (500 Server Error)。

•   如何從 CGI 程式中得到好一點的錯誤提示？

•   如何將字串中的 HTML 刪除？

•   如何展開 URL?

•   如何從使用者的機器上下載檔案？如何開啟其他機器上的檔案？

•   如何在 HTML 新增一個彈出選單?

•   如何獲取 HTML 檔案?

•   如何根據提交的內容自動生成一個 HTML ?

•   如何解碼或建立 web 中的 %-encoding?

•   如何重定向到其他頁面？

•   如何為我的網頁加上密碼？

•   如何用 Perl 修改我的 .htpasswd 和 .htgroup 檔案?

•   如何確保使用者不會在表單中輸入使我的 CGI 指令碼作壞事的值？

•   如何解釋一個郵件頭？

•   如何解碼一個 CGI 表單？

•   如何檢測一個有效的郵件地址？

•   如何解碼一個 MIME/BASE64 字串?

•   如何返回使用者的郵件地址？

•   如何發郵件？

•   如何使用 MIME 來為郵件訊息增加附件？

•   如何讀郵件？

•   如何找到我的主機名/域名/IP 地址？

•   如何獲取一篇新聞文章或活動的新聞組？

•   如何獲取/上傳一個 FTP 檔案?

•   如何進行遠端過程呼叫 RPC ?

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

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