perlfaq - Perl 常見問題集
版本 5.20210520
perlfaq 包含多個文件,回答關於 Perl 和 Perl 程式設計最常見的問題。它依主題分為九個主要部分,並在本文件中概述。
perlfaq 是一個不斷演進的文件。請在 https://perldoc.dev.org.tw/perlfaq 閱讀最新版本。它也包含在標準 Perl 發行版中。
perldoc
命令列工具是標準 Perl 發行版的一部分。要閱讀 perlfaq
$ perldoc perlfaq
要搜尋 perlfaq 問題標題
$ perldoc -q open
檢閱 https://github.com/perl-doc-cats/perlfaq/wiki。如果您找不到您的建議,請針對 https://github.com/perl-doc-cats/perlfaq 建立問題或提交請求。
一旦核准後,變更將會與下一個 Perl 版本一同發布,並隨後出現在 https://perldoc.dev.org.tw/perlfaq。
請嘗試使用 perlfaq2 中的資源。
常見問答的這個部分回答了關於 Perl 非常一般、高階的問題。
Perl 是什麼?
誰支援 Perl?誰開發它?為什麼它是免費的?
我應該使用哪個版本的 Perl?
Perl 4、Perl 5 或 Raku(Perl 6)是什麼?
Raku(Perl 6)是什麼?
Perl 有多穩定?
Perl 的新版本多久發布一次?
Perl 難學嗎?
Perl 與其他語言(例如 Java、Python、REXX、Scheme 或 Tcl)相比如何?
我可以在 Perl 中執行 [任務] 嗎?
我什麼時候不應該使用 Perl 編寫程式?
「perl」和「Perl」有什麼不同?
什麼是 JAPH?
我如何說服其他人使用 Perl?
此常見問題解答部分回答有關如何尋找 Perl 來源和文件、支援和相關事項的問題。
哪些機器支援 Perl?我在哪裡可以取得?
我如何取得 Perl 的二進位版本?
我沒有 C 編譯器。我如何建置自己的 Perl 詮釋器?
我將 Perl 二進位檔從一台機器複製到另一台機器,但指令碼無法運作。
我取得來源並嘗試編譯,但 gdbm/動態載入/malloc/連結/... 失敗了。我如何讓它運作?
Perl 有哪些模組和擴充功能?什麼是 CPAN?
我在哪裡可以取得 Perl 的資訊?
perl.com 是什麼?Perl Mongers 是什麼?pm.org 是什麼?perl.org 是什麼?cpan.org 是什麼?
我在哪裡可以張貼問題?
Perl 書籍
哪些雜誌有 Perl 內容?
我應該閱讀哪些 Perl 部落格?
Perl 有哪些郵寄清單?
我在哪裡可以購買 Perl 的商業版本?
我在哪裡可以傳送錯誤報告?
此常見問題解答部分回答有關程式設計工具和程式設計支援的問題。
我如何執行(任何事情)?
我如何互動使用 Perl?
我如何找出系統上安裝了哪些模組?
我如何除錯我的 Perl 程式?
我如何分析我的 Perl 程式?
我如何交叉參照我的 Perl 程式?
Perl 有美化印表機(格式化程式)嗎?
有 Perl IDE 或 Windows Perl 編輯器嗎?
我在哪裡可以取得 vi 的 Perl 巨集?
我在哪裡可以取得 emacs 的 perl-mode 或 cperl-mode?
我如何使用 Perl 的 curses?
我如何使用 Perl 編寫 GUI(X、Tk、Gtk 等)?
我如何讓我的 Perl 程式執行得更快?
我如何讓我的 Perl 程式佔用更少的記憶體?
傳回對區域或詞彙資料的參照安全嗎?
我如何釋放陣列或雜湊,讓我的程式縮小?
我如何讓我的 CGI 指令碼更有效率?
我如何隱藏 Perl 程式的來源?
我如何將 Perl 程式編譯成位元組碼或 C?
我如何讓 #!perl
在 [MS-DOS、NT、...] 上運作?
我可以在命令列上撰寫有用的 Perl 程式嗎?
為什麼 Perl 單行指令無法在我的 DOS/Mac/VMS 系統上執行?
我在哪裡可以學習 Perl 中的 CGI 或 Web 程式設計?
我在哪裡可以學習物件導向 Perl 程式設計?
我在哪裡可以學習將 C 與 Perl 連結?
我已經讀過 perlembed、perlguts 等,但我無法將 perl 嵌入到我的 C 程式中;我做錯了什麼?
當我嘗試執行我的腳本時,我收到此訊息。這是什麼意思?
什麼是 MakeMaker?
本 FAQ 的此部分回答了與處理數字、日期、字串、陣列、雜湊和雜項資料問題相關的問題。
為什麼我得到長小數(例如 19.9499999999999),而不是我應該得到的數字(例如 19.95)?
為什麼 int() 會中斷?
為什麼我的八進制資料無法正確解譯?
Perl 是否有 round() 函數?ceil() 和 floor() 呢?三角函數呢?
我如何轉換數字表示/基數/進位制?
為什麼 & 無法按照我想要的方式運作?
我如何對矩陣進行乘法?
我如何對一系列整數執行運算?
我如何輸出羅馬數字?
為什麼我的隨機數字不是隨機的?
我如何取得 X 和 Y 之間的隨機數字?
我如何找出一年中的哪一天或哪一週?
我如何找出目前的世紀或千禧年?
我如何比較兩個日期並找出差異?
我如何取得字串並將其轉換為紀元秒?
我如何找出儒略日?
我如何找出昨天的日期?
Perl 是否有 2000 年或 2038 年問題?Perl 是否符合 Y2K 標準?
我如何驗證輸入?
我如何取消字串的轉義?
我如何移除連續的成對字元?
我如何在字串中展開函數呼叫?
我如何找出任何匹配/巢狀項目?
我如何反轉字串?
我如何在字串中展開標籤?
我如何重新格式化段落?
我如何存取或變更字串的 N 個字元?
如何變更某個字串的第 N 次出現?
如何計算字串中子字串出現的次數?
如何將一行中的所有字首字母大寫?
如何分割以 [字元] 分隔的字串,但 [字元] 內部除外?
如何移除字串開頭/結尾的空白?
如何使用空白填充字串或使用零填充數字?
如何從字串中擷取選取的欄位?
如何找出字串的 Soundex 值?
如何在文字字串中展開變數?
Perl 是否有類似 Ruby 的 #{} 或 Python 的 f 字串的東西?
總是引用 "$vars" 有什麼問題?
為什麼我的 <<HERE 文件無法運作?
清單和陣列之間的差異是什麼?
$array[1] 和 @array[1] 之間的差異是什麼?
如何從清單或陣列中移除重複的元素?
如何判斷某個元素是否包含在清單或陣列中?
如何計算兩個陣列的差異?如何計算兩個陣列的交集?
如何測試兩個陣列或雜湊是否相等?
如何找出第一個符合條件的陣列元素?
如何處理連結清單?
如何處理環狀清單?
如何隨機洗牌陣列?
如何處理/修改陣列的每個元素?
如何從陣列中選取隨機元素?
如何排列清單的 N 個元素?
如何根據(任何東西)對陣列進行排序?
如何處理位元陣列?
為什麼 defined() 會對空陣列和雜湊傳回 true?
如何處理整個雜湊?
如何合併兩個雜湊?
如果在迭代雜湊時新增或移除金鑰,會發生什麼事?
如何根據值查詢雜湊元素?
如何得知雜湊中有多少個項目?
如何對雜湊進行排序(選擇性地根據值而非金鑰)?
如何始終保持雜湊排序?
雜湊中的「刪除」和「未定義」之間的差異是什麼?
為什麼我繫結的雜湊不會區分已定義/存在?
如何重置 each() 操作的一部分?
如何從兩個雜湊中取得獨特的金鑰?
如何將多維陣列儲存在 DBM 檔案中?
如何讓我的雜湊記住我放入元素的順序?
為何傳遞一個雜湊中未定義的元素給子程式會建立它?
如何建立 Perl 等同於 C 結構/C++ 類別/雜湊或雜湊或陣列的陣列?
如何將一個參照用作雜湊鍵?
如何檢查一個鍵是否存在於多層級雜湊中?
如何防止將不需要的鍵新增到雜湊中?
如何正確處理二進位資料?
如何判斷一個純量是數字/整數/浮點數?
如何跨程式呼叫保留持續性資料?
如何列印或複製一個遞迴資料結構?
如何為每個類別/物件定義方法?
如何驗證信用卡檢查碼?
如何封裝雙精度或浮點數陣列以供 XS 程式碼使用?
本節探討 I/O 和「f」議題:檔案控制代碼、快取、格式和頁尾。
如何快取/取消快取一個輸出檔案控制代碼?我為何必須這麼做?
如何變更、刪除或插入檔案中的一行,或附加到檔案的開頭?
如何計算檔案中的行數?
如何刪除檔案中最後 N 行?
如何從程式中使用 Perl 的 -i
選項?
如何複製一個檔案?
如何建立一個暫時檔案名稱?
如何操作固定記錄長度的檔案?
如何讓一個檔案控制代碼成為子程式的局部變數?如何在子程式之間傳遞檔案控制代碼?如何建立一個檔案控制代碼陣列?
如何間接使用一個檔案控制代碼?
如何將一個檔案控制代碼開啟到一個字串?
如何設定一個頁尾格式以供 write() 使用?
如何將 write() 寫入一個字串?
如何將逗號新增到我的數字並輸出?
如何轉譯檔案名稱中的波浪號 (~)?
為何當我開啟一個讀寫檔案時,它會將其清除?
為何當我使用 <*> 時,有時會收到「引數清單太長」?
如何開啟一個以「>」開頭或空白結尾命名的檔案?
如何可靠地重新命名一個檔案?
如何鎖定一個檔案?
為何我無法直接開啟(FH, ">file.lock")?
我仍然不懂鎖定。我只想增加檔案中的數字。我如何做到這一點?
我只想在檔案結尾附加一小段文字。我是否仍必須使用鎖定?
我如何隨機更新二進位檔案?
我如何取得 Perl 中檔案的時間戳記?
我如何設定 Perl 中檔案的時間戳記?
我如何一次列印到多個檔案?
我如何一次讀取整個檔案?
我如何按段落讀取檔案?
我如何從檔案讀取單一字元?從鍵盤讀取呢?
我如何判斷檔案處理中是否有字元在等待?
我如何在 Perl 中執行 tail -f
?
我如何在 Perl 中複製檔案處理?
我如何依據數字關閉檔案描述符?
為什麼我無法在 DOS 路徑中使用「C:\temp\foo」?為什麼 `C:\temp\foo.exe` 無法運作?
為什麼 glob("*.*") 無法取得所有檔案?
為什麼 Perl 允許我刪除唯讀檔案?為什麼 -i
會覆寫受保護的檔案?這不是 Perl 中的錯誤嗎?
我如何從檔案中選取隨機行?
為什麼我在列印陣列行時會出現奇怪的空格?
我如何遍歷目錄樹?
我如何刪除目錄樹?
我如何複製整個目錄?
此部分意外地小,因為 FAQ 的其他部分散布著許多與正規表示式相關的解答。例如,解碼 URL 和檢查某個項目是否為數字可以使用正規表示式處理,但這些解答可以在此文件中的其他地方找到(確切來說,在 perlfaq9:「我如何解碼或建立網頁上的 %-編碼」和 perlfaq4:「我如何判斷純量是否為數字/整數/浮點數」)。
我如何希望在不建立難以閱讀和維護的程式碼的情況下使用正規表示式?
我在比一行還長的範圍內進行比對時遇到問題。哪裡出錯了?
我如何取出位於兩個模式之間的行,而這些模式本身位於不同的行上?
我如何使用正規表示式比對 XML、HTML 或其他令人討厭、醜陋的東西?
我將正規表示式放入 $/,但它沒有運作。哪裡出錯了?
我如何在 LHS 上不分大小寫地替換,同時保留 RHS 的大小寫?
我如何讓 \w
比對國家字元集?
我如何比對 /[a-zA-Z]/
的區域設定智慧版本?
我如何引用變數以在正規表示式中使用?
/o
到底用來做什麼?
如何使用正規表示式從檔案中移除 C 式註解?
我可以使用 Perl 正規表示式來比對平衡文字嗎?
正規表示式是貪婪的,是什麼意思?我該如何解決?
如何處理每一行中的每個字詞?
如何列印出字詞頻率或行頻率摘要?
如何進行近似比對?
如何有效率地一次比對多個正規表示式?
為什麼使用 \b
進行字詞邊界搜尋對我無效?
為什麼使用 $&、$` 或 $' 會讓我的程式變慢?
正規表示式中的 \G
有什麼好處?
Perl 正規表示式是 DFA 還是 NFA?它們符合 POSIX 嗎?
在無效的內容中使用 grep 有什麼問題?
如何比對包含多位元組字元的字串?
如何比對儲存在變數中的正規表示式?
本節處理 Perl 語言的一般議題,這些議題不完全符合其他節的內容。
我可以取得 Perl 語言的 BNF/yacc/RE 嗎?
這些 $@%&* 標點符號是什麼意思,我該如何知道什麼時候使用它們?
我是否總是要/永遠不需要加上引號在我的字串中,或使用分號和逗號?
如何略過一些回傳值?
如何暫時封鎖警告?
什麼是擴充套件?
為什麼 Perl 算子與 C 算子的優先順序不同?
如何宣告/建立一個結構?
如何建立一個模組?
如何採用或接手 CPAN 上已有的模組?
如何建立一個類別?
如何判斷一個變數是否已污染?
什麼是閉包?
什麼是變數自殺,我該如何防止?
如何傳遞/回傳 {函式、檔案處理、陣列、雜湊、方法、正規表示式}?
如何建立一個靜態變數?
動態和詞彙(靜態)作用域之間的差異是什麼?local() 和 my() 之間的差異是什麼?
當一個同名的詞彙作用域存在時,如何存取動態變數?
深層繫結和淺層繫結之間的差異是什麼?
為什麼 "my($foo) = <$fh>;" 無法正常運作?
如何重新定義內建函式、算子或方法?
以 &foo 和 foo() 呼叫函式的差異是什麼?
如何建立一個 switch 或 case 陳述式?
如何攔截存取未定義的變數、函式或方法?
為什麼包含在同一個檔案中的方法找不到?
如何找出我目前的或呼叫套件?
如何註解掉一大段 Perl 程式碼?
如何清除一個套件?
如何將一個變數當作變數名稱使用?
「不良的詮釋器」是什麼意思?
當 C 函式庫變更時,我是否需要重新編譯 XS 模組?
Perl FAQ 的此部分涵蓋涉及作業系統互動的問題。主題包括跨程序通訊 (IPC)、對使用者介面(鍵盤、螢幕和指標裝置)的控制,以及與資料處理無關的大部分其他內容。
如何找出我正在哪個作業系統下執行?
為什麼 exec() 沒有傳回?
如何使用鍵盤/螢幕/滑鼠執行花俏的動作?
如何以彩色列印內容?
如何在不等待回車鍵的情況下只讀取一個按鍵?
如何檢查鍵盤上的輸入是否已準備好?
如何清除螢幕?
如何取得螢幕大小?
如何詢問使用者輸入密碼?
如何讀寫序列埠?
如何解碼加密的密碼檔案?
如何在背景中啟動程序?
如何捕捉控制字元/訊號?
如何在 Unix 系統上修改影子密碼檔?
如何設定時間和日期?
如何在不到一秒的時間內執行 sleep() 或 alarm()?
如何在不到一秒的時間內測量時間?
如何執行 atexit() 或 setjmp()/longjmp()?(例外處理)
為什麼我的 socket 程式在 System V (Solaris) 下無法執行?錯誤訊息「不支援協定」是什麼意思?
如何從 Perl 呼叫系統獨特的 C 函式?
從哪裡取得執行 ioctl() 或 syscall() 的包含檔案?
為什麼 setuid perl 指令碼會抱怨核心問題?
如何同時對命令開啟輸入和輸出的管線?
為什麼我無法使用 system() 取得命令的輸出?
如何從外部命令擷取 STDERR?
當管線開啟失敗時,為什麼 open() 沒有傳回錯誤?
在空值內容中使用反引號有什麼問題?
如何在不進行 shell 處理的情況下呼叫反引號?
在我提供 EOF(Unix 上的 ^D,MS-DOS 上的 ^Z)之後,為什麼我的指令碼無法從 STDIN 讀取?
如何將我的 shell 指令碼轉換為 perl?
我可以使用 perl 執行 telnet 或 ftp 會話嗎?
如何在 Perl 中撰寫 expect?
是否有辦法將 perl 的命令列隱藏起來,不讓「ps」等程式看到?
我在 perl 指令碼中{變更目錄、修改我的環境}。為什麼在我退出指令碼時,變更消失了?如何讓我的變更可見?
如何在不等待程序完成的情況下關閉程序的檔案處理?
如何分岔一個守護程序?
如何找出我是否以互動方式執行?
如何對慢速事件設定逾時?
如何設定 CPU 限制?
如何在 Unix 系統中避免殭屍程序?
如何使用 SQL 資料庫?
如何讓 system() 在按 Ctrl-C 時退出?
如何開啟檔案而不封鎖?
如何區分 shell 和 perl 的錯誤?
如何從 CPAN 安裝模組?
require 和 use 有什麼不同?
如何保留自己的模組/函式庫目錄?
如何將程式所在的目錄加入模組/函式庫搜尋路徑?
如何在執行階段將目錄加入包含路徑 (@INC)?
模組安裝在哪裡?
socket.ph 是什麼,我可以在哪裡取得?
本節處理與執行網站、傳送和接收電子郵件以及一般網路相關的問題。
我應該使用網路架構嗎?
我應該使用哪個網路架構?
Plack 和 PSGI 是什麼?
如何從字串中移除 HTML?
如何擷取 URL?
如何擷取 HTML 檔案?
如何自動化 HTML 表單提交?
如何在網路上解碼或建立那些 %-編碼?
如何重新導向到其他頁面?
如何為我的網頁設定密碼?
如何確保使用者無法在表單中輸入會導致我的 CGI 腳本執行錯誤動作的值?
如何剖析郵件標頭?
如何檢查有效的郵件地址?
如何解碼 MIME/BASE64 字串?
如何找到使用者的郵件地址?
如何傳送電子郵件?
如何使用 MIME 將附件附加到郵件訊息?
如何讀取電子郵件?
如何找出我的主機名稱、網域名稱或 IP 位址?
如何擷取/放置 (S)FTP 檔案?
如何在 Perl 中執行 RPC?
Tom Christiansen 編寫了原始的 perlfaq,然後在 Nat Torkington 的協助下進行擴充。brian d foy 大幅編輯並擴充了 perlfaq。perlfaq-workers 和其他人員多年來也提供了回饋、修補程式和更正。
Tom Christiansen 編寫了本文件的原始版本。brian d foy <bdfoy@cpan.org>
編寫了此版本。請參閱個別的 perlfaq 文件以取得其他版權資訊。
此文件與 Perl 本身採用相同的條款。所有 perlfaq 文件中的程式碼範例均為公有領域。請自行斟酌使用(風險自負,且不提供任何擔保)。