目錄

名稱

perlfaq3 - 程式工具

版本

版本 5.20210520

描述

本 FAQ 的此部分回答了與程式員工具和程式支援相關的問題。

我要如何做(任何事情)?

你有查看 CPAN(見 perlfaq2)嗎?有人很可能已經寫了一個模組來解決你的問題。你有閱讀適當的 man 頁嗎?以下是簡要索引

基礎
perldata - Perl 資料類型
perlvar - Perl 預先定義的變數
perlsyn - Perl 語法
perlop - Perl 運算子和優先順序
perlsub - Perl 子程式
執行
perlrun - 如何執行 Perl 解譯器
perldebug - Perl 調試
函數
perlfunc - Perl 內建函數
物件
perlref - Perl 參考和巢狀數據結構
perlmod - Perl 模組(封包和符號表)
perlobj - Perl objects
perltie - 如何在簡單變數中隱藏物件類別
資料結構
perlref - Perl 參考和巢狀資料結構
perllol - 在 Perl 中操作陣列的陣列
perldsc - Perl 資料結構手冊
模組
perlmod - Perl 模組 (套件和符號表)
perlmodlib - 建構新的 Perl 模組和尋找現有的模組
正規表示式
perlre - Perl 正規表示式
perlfunc - Perl 內建函式>
perlop - Perl 運算子和優先順序
perllocale - Perl 地域處理 (國際化與本地化)
遷移到 perl5
perltrap - Perl 對不留神的陷阱
perl
與 C 連結
perlxstut - 撰寫 XSUBs 的教程
perlxs - XS 語言參考手冊
perlcall - 從 C 呼叫 Perl 的慣例
perlguts - Perl API 簡介
perlembed - 如何在您的 C 程式中嵌入 Perl
各種

http://www.cpan.org/misc/olddoc/FMTEYEWTK.tgz(雖然不是 man 頁,但仍然有用,是有關 Perl 技術的各種論文集)

Perl 手冊集的簡單目錄位於 perltoc

我如何互動使用 Perl?

典型的方法是使用 Perl 調試器,在像這樣的“空”程式中描述,如 perldebug(1) 手冊中所述

perl -de 42

現在只需輸入任何合法的 Perl 代碼,它將立即被評估。您還可以檢查符號表、獲取堆棧回溯、檢查變量值、設置斷點以及其他通常在符號調試器中找到的操作。

您也可以使用 Devel::REPL,這是一個 Perl 的交互式外殼,通常稱為 REPL - 讀取、評估、打印、循環。它提供了各種方便的功能。

我如何找到已安裝在我的系統上的模組?

從命令行,您可以使用 cpan 命令的 -l 選項

$ cpan -l

您還可以使用 cpan-a 選項創建一個 CPAN.pm 理解並可以使用來重新安裝每個模組的 autobundle 文件

$ cpan -a

在 Perl 程式中,您可以使用 ExtUtils::Installed 模組顯示所有已安裝的發行版,盡管它可能需要一段時間才能完成其魔術。隨 Perl 一起提供的標準庫只顯示為“Perl”(儘管您可以使用 Module::CoreList 獲取這些信息)。

use ExtUtils::Installed;

my $inst    = ExtUtils::Installed->new();
my @modules = $inst->modules();

如果您需要所有 Perl 模組文件名的列表,您可以使用 File::Find::Rule

use File::Find::Rule;

my @files = File::Find::Rule->
    extras({follow => 1})->
    file()->
    name( '*.pm' )->
    in( @INC )
    ;

如果您沒有該模組,您可以使用標準庫中的 File::Find 做同樣的事情

use File::Find;
my @files;

find(
    {
    wanted => sub {
        push @files, $File::Find::fullname
        if -f $File::Find::fullname && /\.pm$/
    },
    follow => 1,
    follow_skip => 2,
    },
    @INC
);

print join "\n", @files;

如果您只是需要快速檢查模組是否可用,您可以檢查其文檔。如果您能讀取文檔,則該模組很可能已安裝。如果您無法閱讀文檔,則該模組可能尚未具備(在罕見情況下)

$ perldoc Module::Name

您還可以嘗試在一條命令中包含該模組,看看 perl 是否找到它

$ perl -MModule::Name -e1

(如果您沒有收到“在 @INC 中找不到...”的錯誤訊息,那麼 Perl 已經找到您要求的模組名稱。)

我該如何除錯我的 Perl 程式?

(由 brian d foy 貢獻)

在您做任何其他事之前,您可以幫助自己確保 Perl 告訴您程式碼中的問題區域。通過開啟警告和嚴格模式,您可以在問題變得太大之前解決許多問題。您可以在 strictwarnings 中找到更多相關資訊。

#!/usr/bin/perl
use strict;
use warnings;

除此之外,最簡單的調試器是 print 函數。在執行程式時使用它來查看值。

print STDERR "The value is [$value]\n";

Data::Dumper 模組可以將 Perl 數據結構進行漂亮的打印。

use Data::Dumper qw( Dumper );
print STDERR "The hash is " . Dumper( \%hash ) . "\n";

Perl 附帶了一個交互式調試器,您可以使用 -d 選項啟動它。詳細說明在 perldebug 中。

如果您想要一個圖形用戶界面並且您有 Tk,您可以使用 ptkdb。它可以在 CPAN 上免費獲得。

如果您需要更加複雜和可控的東西,Leon Brocard 的 Devel::ebug(您可以使用 -D 選項呼叫它,如 -Debug)為您提供了對您需要的一切進行編程鉤子的途徑(而不需要太多的痛苦和掙扎)。

您還可以使用商業調試器,例如 Affrus(Mac OS X)、Activestate 的 Komodo(Windows 和 Mac OS X)或 EPIC(大多數平台)。

我該如何為我的 Perl 程式進行性能分析?

(由 brian d foy 貢獻,最後更新時間:2008 年 7 月 25 日 12:22:26 PDT)

Devel 命名空間有幾個模組,您可以使用它們來為您的 Perl 程式進行性能分析。

Devel::NYTProf(紐約時報性能分析器)既可以進行語句性能分析,也可以進行子例程性能分析。它可以從 CPAN 獲取,並且您也可以使用 -d 選項調用它。

perl -d:NYTProf some_perl.pl

它會創建一個包含性能分析資訊的數據庫,您可以將其轉換為報告。 nytprofhtml 命令將數據轉換為類似於 Devel::Cover 報告的 HTML 報告。

nytprofhtml

您可能還感興趣使用 Benchmark 來測量和比較程式碼片段。

您可以在《Programming Perl》第 20 章或《Mastering Perl》第 5 章中找到有關性能分析的更多資訊。

perldebguts 文件記錄了如何創建一個特殊類型的性能分析器。brian d foy 在《The Perl Journal》的 "Creating a Perl Debugger"(http://www.ddj.com/184404522)和 "Profiling in Perl"(http://www.ddj.com/184404580)中描述了這個過程。

Perl.com 有兩篇有關性能分析的有趣文章:"Profiling Perl",作者是 Simon Cozens,(https://www.perl.com/pub/2004/06/25/profiling.html/)和 "Debugging and Profiling mod_perl Applications",作者是 Frank Wiles,(http://www.perl.com/pub/a/2006/02/09/debug_mod_perl.html)。

Randal L. Schwartz 在 "Speeding up Your Perl Programs" 中談到「對 Perl 程式進行效能分析」,刊登於《Unix Review》Unix Review,參見http://www.stonehenge.com/merlyn/UnixReview/col49.html,以及在《Linux Magazine》Linux Magazine中撰寫了 "Profiling in Template Toolkit via Overriding",詳見http://www.stonehenge.com/merlyn/LinuxMag/col75.html

如何跨參照我的 Perl 程式?

可以使用B::Xref 模組來為 Perl 程式生成交叉參照報告。

perl -MO=Xref[,OPTIONS] scriptname.plx

Perl 有漂亮的打印機(格式化器)嗎?

Perl::Tidy 附帶一個 perl 腳本perltidy,它可以對 Perl 腳本進行縮進和重新格式化,使它們更易於閱讀,嘗試遵循perlstyle的規則。如果你寫 Perl 程式,或者花費大量時間閱讀 Perl 程式,你可能會發現它很有用。

當然,如果你只是遵循perlstyle中的指導,你應該不需要重新格式化。在寫程式時將代碼進行格式化的習慣將有助於防止錯誤。您的編輯器可以並且應該幫助您完成這一點。對於 emacs,perl-mode 或更新的 cperl-mode 可以對大多數(但不是全部)的代碼提供顯著的幫助,即使是更少可編程的編輯器也可以提供重要的幫助。許多 VI 用戶,包括 Tom Christiansen 在內,都發誓遵循 vi 及其克隆版本中的以下設置。

set ai sw=4
map! ^O {^M}^[O^T

將以下內容放入您的.exrc檔案中(將插入字元替換為控制字元),然後開始使用。在插入模式中,^T 是用於縮進,^D 是用於取消縮進,^O 是用於區塊縮進。更完整的示例,包括註釋,可以在http://www.cpan.org/authors/id/T/TO/TOMC/scripts/toms.exrc.gz中找到。

是否有 Perl 集成開發環境或 Windows Perl 編輯器?

Perl 程式只是普通文本,所以任何編輯器都可以。

如果你使用Unix系統,你已經擁有一個IDE——Unix本身。Unix哲學是幾個小工具的哲學,每個工具都專注於一件事並做得很好。這就像一個木匠的工具箱。

如果你想要一個IDE,請查看以下列表(按字母順序排列,不按偏好順序排列)

Eclipse

http://e-p-i-c.sf.net/

Eclipse Perl Integration Project 將Perl編輯/調試與Eclipse集成。

Enginsite

http://www.enginsite.com/

EngInSite的Perl編輯器是一個完整的集成開發環境(IDE),用於創建、測試和調試Perl腳本;該工具運行在Windows 9x/NT/2000/XP或更高版本上。

IntelliJ IDEA

https://plugins.jetbrains.com/plugin/7796

Camelcade插件在IntelliJ IDEA和其他JetBrains IDE中提供Perl5支持。

Kephra

http://kephra.sf.net

使用wxWidgets和Scintilla編寫的Perl GUI編輯器,具有許多小功能。目標是基於Perl原則的UI,如TIMTOWTDI和“易事易做,難事可行”。

Komodo

http://www.ActiveState.com/Products/Komodo/

ActiveState的跨平台(截至2004年10月,支持Windows、Linux和Solaris)多語言IDE支持Perl,包括正則表達式調試器和遠程調試。

Notepad++

http://notepad-plus.sourceforge.net/

Open Perl IDE

http://open-perl-ide.sourceforge.net/

Open Perl IDE是一個集成開發環境,用於在Windows 95/98/NT/2000下使用ActiveState的ActivePerl發行版編寫和調試Perl腳本。

OptiPerl

http://www.optiperl.com/

OptiPerl是一個Windows IDE,帶有模擬CGI環境,包括調試器和語法突出顯示編輯器。

Padre

http://padre.perlide.org/

Padre是一個用Perl編寫的Perl跨平台IDE,使用wxWidgets提供本機外觀和感覺。它在Artistic License下開源。它是較新的Perl IDE之一。

PerlBuilder

http://www.solutionsoft.com/perl.htm

PerlBuilder是一個支持Perl開發的Windows集成開發環境。

visiPerl+

http://helpconsulting.net/visiperl/index.html

由Help Consulting提供,適用於Windows。

Visual Perl

http://www.activestate.com/Products/Visual_Perl/

Visual Perl是來自ActiveState的Visual Studio.NET插件。

Zeus

http://www.zeusedit.com/lookmain.html

Zeus for Windows是另一個Win32多語言編輯器/IDE,支援Perl。

對於編輯器:如果您在Unix上,您可能已經有vi或vi克隆,可能還有emacs,所以您可能不需要下載任何東西。在任何emacs中,cperl-mode(M-x cperl-mode)提供了您可能在任何編輯器中使用的最佳Perl編輯模式。

如果您使用的是Windows,您可以使用任何允許您使用純文本的編輯器,例如NotePad或WordPad。像Microsoft Word或WordPerfect之類的文字處理器通常不起作用,因為它們插入各種幕後信息,雖然一些允許您將文件保存為“僅文本”。您還可以下載專門用於編程的文本編輯器,例如Textpad(http://www.textpad.com/)和UltraEdit(http://www.ultraedit.com/),等等。

如果您使用的是MacOS,同樣的問題也適用。MacPerl(用於Classic環境)配備了一個簡單的編輯器。流行的外部編輯器包括BBEdit(http://www.barebones.com/products/bbedit/)或Alpha(http://www.his.com/~jguyer/Alpha/Alpha8.html)。MacOS X用戶也可以使用Unix編輯器。

GNU Emacs

https://gnu.dev.org.tw/software/emacs/windows/ntemacs.html

MicroEMACS

http://www.microemacs.de/

XEmacs

http://www.xemacs.org/Download/index.html

Jed

http://space.mit.edu/~davis/jed/

或者像vi一樣的克隆,比如

Vim

http://www.vim.org/

Vile

http://invisible-island.net/vile/vile.html

以下是支援Perl的Win32多語言編輯器/IDE

MultiEdit

http://www.MultiEdit.com/

SlickEdit

http://www.slickedit.com/

ConTEXT

http://www.contexteditor.org/

還有一個基於Tk模塊在CPAN上分發的Perl寫的toyedit Text widget編輯器。ptkdb(http://ptkdb.sourceforge.net/)是一個Perl/Tk-based調試器,充當某種開發環境。Perl Composer(http://perlcomposer.sourceforge.net/)是用於Perl/Tk GUI創建的IDE。

除了編輯器/IDE之外,您可能還對於Win32更強大的shell環境感興趣。您的選擇包括

bash

來自Cygwin套件(http://cygwin.com/

zsh

http://www.zsh.org/

Cygwin受GNU通用公共許可證覆蓋(但對於Perl使用並不重要)。Cygwin(除了shell外)包含了一套完整的標準Unix工具包。

BBEdit和TextWrangler

适用于 OS X 的文本编辑器具有 Perl 敏感模式(http://www.barebones.com/)。

我可以在哪里获取 vi 的 Perl 宏?

要获取 Tom Christiansen 的 vi 配置文件的完整版本,请参阅 http://www.cpan.org/authors/id/T/TO/TOMC/scripts/toms.exrc.gz,这是 vi 模拟器的标准基准文件。该文件最适用于 nvi,这是伯克利的 vi 的当前版本,顺便说一句,它可以构建带有嵌入式 Perl 解释器的版本—请参阅 http://www.cpan.org/src/misc/

我可以在哪里获取 Emacs 的 perl-mode 或 cperl-mode?

自从 Emacs 版本 19 的补丁级别 22 左右,就有了 perl-mode.el 以及对 Perl 调试器的支持。这些应该随标准 Emacs 19 发行版一起提供。

请注意,emacs 的 perl-mode 对于 "main'foo"(单引号)可能会有问题,会影响缩进和高亮显示。不过你可能会在新的 Perl 代码中使用 "main::foo",所以这应该不是问题。

有关 CPerlMode,请参阅 http://www.emacswiki.org/cgi-bin/wiki/CPerlMode

我如何在 Perl 中使用 curses?

来自 CPAN 的 Curses 模块提供了一个动态可加载的对象模块接口,用于 curses 库。你可以在目录 http://www.cpan.org/authors/id/T/TO/TOMC/scripts/rep.gz 中找到一个小演示;这个程序重复一个命令,并根据需要更新屏幕,类似于 toprep ps axu

我如何用 Perl 编写 GUI(X,Tk,Gtk 等)?

(由 Ben Morrow 贡献)

有许多模块可以让你用 Perl 编写 GUI。大多数 GUI 工具包都有 Perl 接口:以下是一个不完整的列表。

Tk

这在 Unix 和 Windows 下都可以工作,而且当前版本在 Windows 下的外观比以前好多了。但仍然有些 GUI 元素的“感觉”不太对。界面非常自然和“Perlish”,使得在只需要简单 GUI 的小脚本中很容易使用。它已经有一段时间没有更新了。

Wx

这是跨平台的 wxWidgets 工具包的 Perl 绑定(http://www.wxwidgets.org)。它在 Unix、Win32 和 Mac OS X 下工作,使用原生部件(在 Unix 下使用 Gtk)。界面紧密遵循 C++ 接口,但对于不了解该库的人来说,文档有点稀少,主要只是引用了 C++ 文档。

Gtk 和 Gtk2

這些是 Gtk 工具包的 Perl 綁定( http://www.gtk.org )。介面在版本 1 與 2 之間有顯著變化,因此它們有單獨的 Perl 模組。它可以在 Unix、Win32 和 Mac OS X 下運行(目前在 Mac OS 上需要 X 伺服器,但正在進行「原生」移植),並且小工具在每個平台上看起來都一樣:即它們與原生小工具不匹配。與 Wx 一樣,Perl 綁定緊密遵循 C API,並且文檔要求您閱讀 C 文檔以理解它。

Win32::GUI

這提供了從 Perl 存取大多數 Win32 GUI 小工具的功能。顯然,它只在 Win32 下運行,並使用原生小工具。Perl 介面實際上不遵循 C 介面:它已被設計得更加 Perl 化,並且文檔相當不錯。更高級的功能可能需要熟悉 C Win32 API,或者參考 MSDN。

CamelBones

CamelBones( http://camelbones.sourceforge.net )是 Mac OS X 的 Cocoa GUI 工具包的 Perl 介面,因此可以用於在 Mac OS X 上生成原生 GUI。它不在 CPAN 上,因為它需要 CPAN.pm 不知道如何安裝的框架,但安裝是通過標準的 OSX 套件安裝程序進行的。Perl API 再次非常接近其包裹的 ObjC API,文檔僅告訴您如何從一個翻譯到另一個。

Qt

有一個 Perl 介面到 TrollTech 的 Qt 工具包,但似乎沒有得到維護。

Athena

Sx 是與 X 附帶的 Athena 小工具集的介面,但似乎現在不太被使用。

我如何使我的 Perl 程式運行速度更快?

做法是提出更好的算法。這通常會帶來戲劇性的改變。Jon Bentley 的書《編程珍珠》(這不是拼寫錯誤!)中也提供了一些優化的好建議。有關基準測試的建議歸結為:進行基準測試和分析以確保優化的是正確的部分,尋找更好的算法而不是微調代碼,當一切失敗時,考慮購買更快的硬件。如果尚未這樣做,您可能希望閱讀早期問題的答案「如何分析我的 Perl 程式?」。

另一種方法是自動載入很少使用的 Perl 代碼。有關詳細信息,請參見標準發行版中的 AutoSplit 和 AutoLoader 模組。或者您可以找出瓶頸並考慮只在 C 中編寫該部分,就像我們曾經將 C 代碼中的瓶頸編寫成組合語言一樣。與重寫成 C 類似,具有關鍵部分的模組可以用 C 編寫(例如來自 CPAN 的 PDL 模組)。

如果您目前將您的 perl 可執行檔鏈接到共享的 libc.so,通常可以通過重建它以鏈接靜態的 libc.a 而獲得10-25%的性能提升。這將使 perl 可執行檔變得更大,但您的 Perl 程式(和程式設計師)可能會為此而感謝您。請參閱源發行版中的 INSTALL 文件以獲取更多信息。

undump 程式是一個古老的嘗試,旨在通過將已編譯的形式存儲到磁盤上來加速 Perl 程式。這不再是一個可行的選擇,因為它僅適用於少數架構,而且根本不是一個好的解決方案。

如何減少我的 Perl 程式佔用的記憶體空間?

當涉及到時間和空間的折衷時,Perl 幾乎總是更願意將內存用於解決問題。Perl 中的純量比 C 中的字符串使用更多的內存,數組比純量使用更多,哈希表使用的內存甚至更多。雖然還有很多工作要做,但最近的版本已經在解決這些問題。例如,從5.004開始,重複的哈希鍵在所有使用它們的哈希表之間共享,因此不需要重新分配。

在某些情況下,使用 substr() 或 vec() 來模擬數組可能非常有益。例如,一個包含一千個布爾值的數組將佔用至少 20,000 個字節的空間,但它可以轉換為一個 125 字節的位向量——節省了大量的內存。標準的 Tie::SubstrHash 模組也可以幫助處理某些類型的數據結構。如果您正在使用專門的數據結構(例如矩陣),那麼在 C 中實現這些數據結構的模組可能比等效的 Perl 模組使用更少的內存。

另一個要嘗試的方法是了解您的 Perl 是否使用系統 malloc 編譯還是使用 Perl 的內置 malloc。不管它是哪一個,試著使用另一個,看看這是否會有所不同。有關 malloc 的信息在源發行版中的 INSTALL 文件中。您可以通過輸入 perl -V:usemymalloc 來查看您是否使用了 perl 的 malloc。

當然,節省內存的最佳方法是一開始就不浪費內存。良好的編程慣例可以在很大程度上幫助實現這一點

不要一次性讀取!

若可逐行處理檔案,則不要將整個檔案讀入記憶體中。具體來說,應該使用像這樣的迴圈:

#
# Good Idea
#
while (my $line = <$file_handle>) {
   # ...
}

而不是這樣:

#
# Bad Idea
#
my @data = <$file_handle>;
foreach (@data) {
    # ...
}

當您處理的檔案很小時,使用哪種方式並不重要,但當它們開始變大時,卻會有很大的差異。

有條件地使用 map 和 grep

請記住,map 和 grep 都期望一個 LIST 參數,因此這樣做:

@wanted = grep {/pattern/} <$file_handle>;

將導致整個檔案被一次性讀取。對於大型檔案,最好使用迴圈。

while (<$file_handle>) {
        push(@wanted, $_) if /pattern/;
}
避免不必要的引號和字串化

除非絕對必要,不要引用大字串

my $copy = "$large_string";

會製造 $large_string 的 2 個副本(一個給 $copy,另一個給引號),而

my $copy = $large_string;

只會製造一個副本。

對於將大陣列字串化,同樣適用。

{
local $, = "\n";
print @big_array;
}

比起

print join "\n", @big_array;

或者

{
local $" = "\n";
print "@big_array";
}
傳遞引用

傳遞陣列和雜湊時,請使用引用,而不是值。首先,這是傳遞多個列表或雜湊(或兩者皆有)的唯一方式。它也避免創建所有內容的副本。然而,這需要一些判斷,因為任何更改都會傳播回原始資料。如果您真的想搞砸(修改)一個副本,則必須犧牲製作副本所需的記憶體。

將大變數綁定到磁碟

對於「大」數據存儲(即超過可用記憶體的數據),請考慮使用其中一個 DB 模組將其存儲在磁碟而不是 RAM 中。這將增加訪問時間的成本,但這可能比由於大量交換而導致硬碟忙碌更好。

將區域或詞彙資料的引用返回是否安全?

是的。Perl 的垃圾回收系統會處理這個問題,所以一切都能正常運作。

sub makeone {
    my @a = ( 1 .. 10 );
    return \@a;
}

for ( 1 .. 10 ) {
    push @many, makeone();
}

print $many[4][5], "\n";

print "@many\n";

如何釋放陣列或雜湊以使我的程式縮小?

(由 Michael Carman 貢獻)

通常情況下,您無法這樣做。分配給詞彙(即 my() 變數)的記憶體即使超出範圍也不能被回收或重複使用。它被保留以防變數重新進入範圍。分配給全局變數的記憶體可以通過使用 undef() 和/或 delete() 來重新使用(在您的程式中)。

在大多數作業系統中,分配給程式的記憶體無法歸還給系統。這就是為什麼長時間運行的程式有時候會重新執行自己的原因。一些作業系統(特別是使用mmap(2)來分配大塊記憶體的系統)可以回收不再使用的記憶體,但在這些系統上,perl必須配置和編譯以使用作業系統的malloc,而不是perl自己的。

一般來說,在Perl中,內存分配和釋放並不是你需要擔心的事情。

參見"如何使我的Perl程式佔用更少的記憶體?"

如何使我的CGI程式更有效率?

除了通常描述的使一般Perl程式更快或更小的措施之外,CGI程式還有其他問題。它可能每秒運行幾次。鑑於每次運行時都需要重新編譯,並且通常會分配一兆字節或更多的系統記憶體,這可能是一個殺手。編譯成C 不會幫助你,因為瓶頸在於進程啟動開銷。

有三種流行的方法可以避免這種開銷。一種解決方案涉及使用Apache HTTP伺服器(可從http://www.apache.org/)以mod_perl或mod_fastcgi插件模塊之一運行。

使用mod_perl和Apache::Registry模組(與mod_perl一起發行),httpd將運行具有內嵌Perl解譯器的內部,該解譯器將預先編譯您的腳本,然後在相同的地址空間內執行它,而無需分叉。 Apache擴展還允許Perl訪問內部伺服器API,因此用Perl編寫的模塊可以做幾乎任何用C編寫的模塊可以做的事情。有關mod_perl的更多信息,請參見http://perl.apache.org/

使用FCGI模組(來自CPAN)和mod_fastcgi模組(可從http://www.fastcgi.com/)中的每個Perl程式都變成了一個永久的CGI守護進程。

最後,Plack是一個Perl模組和工具包,其中包含PSGI中間件,幫助程序和適配器到Web伺服器,允許您輕鬆部署可以繼續運行的腳本,並提供了靈活性,關於您使用哪個Web伺服器。它可以使現有的CGI腳本以最小的更改享受這種靈活性和性能,或者可以與現代Perl Web框架一起使用,使使用Perl編寫和部署Web服務變得輕而易舉。

這些解決方案可能對您的系統和編寫CGI程式的方式產生深遠的影響,因此請仔細調查。

另請參見http://www.cpan.org/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/

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

刪除它。:-) 嚴肅地說,有一些(大多數令人不滿意的)解決方案,具有不同程度的"安全性"。

但首先,你不能拿掉讀取權限,因為源代碼必須是可讀的才能被編譯和解釋。(這並不意味著CGI腳本的源代碼可以被網上的人閱讀,只能被具有對文件系統的訪問權限的人閱讀。)因此,您必須將權限設置為社會友好的0755級別。

有些人將此視為安全問題。如果您的程式執行不安全的操作,並依賴於人們不知道如何利用這些漏洞,那麼它就不安全。通常有可能有人能夠確定這些不安全的操作並加以利用,而無需查看源代碼。安全性靠模糊不清,即隱藏您的錯誤而不是修復它們,實際上提供的安全性非常有限。

您可以嘗試使用源代碼過濾器進行加密(從 Perl 5.8 開始,Filter::Simple 和 Filter::Util::Call 模組已包含在標準發行版中),但任何合格的程式設計師都能夠解密它。您可以嘗試使用後面在 perlfaq3 中描述的字節碼編譯器和解釋器,但好奇的人仍然可能將其反編譯。您可以嘗試使用後面描述的本地代碼編譯器,但駭客可能會將其反編譯。這些對於想要查看您的代碼的人造成了不同程度的困難,但沒有一種可以絕對隱藏它(這不僅適用於 Perl,而是所有語言都是如此)。

恢復 Perl 程式的源代碼非常容易。您只需將程序提供給 perl 解釋器並使用 B:: 階層中的模組。B::Deparse 模組應該能夠擊敗大多數試圖隱藏源代碼的嘗試。同樣,這並不是 Perl 特有的。

如果您擔心有人從您的代碼中獲利,那麼底線是除了限制性許可證外,沒有任何東西能給您法律上的安全保障。對軟件進行許可並添加威脅性聲明,例如"這是 XYZ 公司的未發表專有軟件。您對它的訪問不會使您有權使用它等等"。我們當然不是律師,所以如果您想確保您許可證的措辭在法庭上站得住腳,您應該諮詢律師。

我怎樣將我的 Perl 程式編譯成字節碼或 C 語言?

(由 brian d foy 貢獻)

一般來說,您無法做到這一點。但有一些方法可能適合您的情況。人們通常問這個問題是因為他們想要分發他們的作品,而不揭示源代碼,而大多數解決方案都是以方便為代價來交換磁盤空間。您可能也不會看到速度增加太多,因為大多數解決方案只是將 Perl 解釋器捆綁到最終產品中(但請參見 "我怎樣才能讓我的 Perl 程式運行更快?")。

Perl 档案工具包是 Perl 的 JAR 文件的類比。它是免費提供的,可以在 CPAN 上找到( https://metacpan.org/pod/PAR )。

也有一些商業產品可能適合您,但您必須購買許可證。

Perl 開發套件(http://www.activestate.com/Products/Perl_Dev_Kit/)來自 ActiveState,可以將您的 Perl 程式轉換為適用於 HP-UX、Linux、Solaris 和 Windows 的可執行檔。

Perl2Exe(http://www.indigostar.com/perl2exe.htm)是一個命令列程式,用於將 Perl 腳本轉換為可執行檔。它支援 Windows 和 Unix 平台。

如何使 #!perl 在 [MS-DOS、NT...] 上運作?

對於 OS/2,只需在 *.cmd 檔的第一行使用

extproc perl -S -your_switches

作為 ALTERNATE_SHEBANG 的對應批次檔案(由於 cmd.exe 的 "extproc" 處理存在一個錯誤)。對於 DOS,首先應發明一個相應的批次檔案並在源分發文件中的 dosish.h 中進行編碼(有關更多信息,請參見源分發文件)。

在使用 ActiveState 的 Perl 移植版進行 Win95/NT 安裝時,將修改註冊表以將 .pl 擴展名與 perl 解譯器關聯。如果安裝其他移植版,甚至是通過使用 Windows 版的 gcc(例如,使用 cygwin 或 mingw32)從標準源代碼構建自己的 Win95/NT Perl,則必須自行修改註冊表。除了將 .pl 與解譯器關聯外,NT 用戶還可以使用:SET PATHEXT=%PATHEXT%;.PL,讓他們僅需輸入 install-linux 就能運行程式 install-linux.pl

在 "Classic" MacOS 下,perl 程式將具有適當的 Creator 和 Type,因此雙擊它們將調用 MacPerl 應用程序。在 Mac OS X 下,可以使用 Wil Sanchez 的 DropScript 工具從任何 #! 腳本創建可點擊的應用程序:http://www.wsanchez.net/software/

重要!:無論您做什麼,請不要感到沮喪,只需將 perl 解譯器放入您的 cgi-bin 目錄中,以便為 Web 伺服器使您的程式運行。這是一個極其大的安全風險。請花時間弄清楚如何正確地執行。

我可以在命令行上撰寫有用的 Perl 程式嗎?

可以。閱讀 perlrun 以獲取更多信息。以下是一些示例(這些示例假設使用標準的 Unix shell 引用規則)。

# sum first and last fields
perl -lane 'print $F[0] + $F[-1]' *

# identify text files
perl -le 'for(@ARGV) {print if -f && -T _}' *

# remove (most) comments from C program
perl -0777 -pe 's{/\*.*?\*/}{}gs' foo.c

# make file a month younger than today, defeating reaper daemons
perl -e '$X=24*60*60; utime(time(),time() + 30 * $X,@ARGV)' *

# find first unused uid
perl -le '$i++ while getpwuid($i); print $i'

# display reasonable manpath
echo $PATH | perl -nl -072 -e '
s![^/+]*$!man!&&-d&&!$s{$_}++&&push@m,$_;END{print"@m"}'

好的,最後一個實際上是一個難以理解的 Perl 程式競賽作品。 :-)

為什麼我的 DOS/Mac/VMS 系統上 Perl 一行命令不起作用?

問題通常是這些系統上的命令解譯器在引用方面的想法與創建一行命令的 Unix shells 有很大不同。在某些系統上,您可能需要將單引號更改為雙引號,但您在 Unix 或 Plan9 系統上絕不能這樣做。您還可能需要將單個 % 更改為 %%。

例如

# Unix (including Mac OS X)
perl -e 'print "Hello world\n"'

# DOS, etc.
perl -e "print \"Hello world\n\""

# Mac Classic
print "Hello world\n"
 (then Run "Myscript" or Shift-Command-R)

# MPW
perl -e 'print "Hello world\n"'

# VMS
perl -e "print ""Hello world\n"""

問題在於這些示例都不可靠:它們依賴於命令解譯器。在 Unix 下,前兩個通常可行。在 DOS 下,很可能兩者都不起作用。如果 4DOS 是命令殼層,您可能會像這樣更幸運

perl -e "print <Ctrl-x>"Hello world\n<Ctrl-x>""

在 Mac 上,這取決於您使用的環境。 MacPerl shell 或 MPW 在支持多種引用變體方面很像 Unix shells,只是它自由地使用 Mac 的非 ASCII 字符作為控制字符。

使用 qq()、q() 和 qx(),而不是 "雙引號"、'單引號' 和 `反引號`,可能會使一行命令更容易撰寫。

沒有通用解決方案。這是一團混亂。

[本答案的部分內容由 Kenneth Albanowski 貢獻。]

我在哪裡可以學習 Perl 中的 CGI 或 Web 編程?

對於模塊,從 CPAN 獲取 CGI 或 LWP 模塊。對於教材,請參閱問題中專門針對網絡事項的兩本書。對於與網絡相關的問題和疑問,如“為什麼我收到 500 錯誤”或“為什麼它在命令行上運行良好但在瀏覽器上運行不正確”,請參閱 perlfaq9 中的疑難排解指南和參考資料或 CGI MetaFAQ。

L<http://www.perl.org/CGI_MetaFAQ.html>

然而,強烈建議您查看 https://plackperl.org 和現代 Perl Web 框架;Perl 中的 Web 編程已從簡單的 CGI 腳本的古老時代演變了很長一段路。

我在哪裡可以學習 Perl 的面向對象編程?

一個很好的起點是 perlootut,您可以使用 perlobj 作為參考。

關於在Perl上的物件導向(OO)的好書有曼寧出版社的《Object-Oriented Perl》由達米安·康威(Damian Conway)撰寫,或者是O'Reilly Media的《Intermediate Perl》由蘭達爾·施瓦茲(Randal Schwartz)、布萊恩·d·福伊(brian d foy)和湯姆·菲尼克斯(Tom Phoenix)撰寫。

我該在哪裡學習如何將C語言與Perl進行連結?

如果你想要從Perl調用C語言,可以從perlxstut開始,然後閱讀perlxsxsubppperlguts。如果你想要從C語言調用Perl,那麼閱讀perlembedperlcallperlguts。別忘了你可以從觀察現有擴展模組的作者如何撰寫代碼和解決問題中學到很多東西。

你可能不需要所有的XS的功能。Inline::C模組允許你將C語言代碼直接放入Perl源代碼中。它處理所有必要的魔法使其工作。你仍然需要學習至少一些perl API,但你不必處理XS支持文件的複雜性。

我已經閱讀了perlembed、perlguts等,但是我無法將Perl嵌入我的C程序中;我做錯了什麼?

從CPAN下載ExtUtils::Embed套件並運行`make test'。如果測試通過,再次閱讀文檔。如果測試失敗,請將make test TEST_VERBOSE=1的輸出和perl -V一起提交到https://github.com/Perl/perl5/issues進行錯誤報告。

當我試圖運行我的腳本時,我收到了這條消息。這是什麼意思?

Perl的錯誤消息和警告的完整列表以及解釋文本可以在perldiag中找到。你也可以使用splain程序(隨Perl一起發布)來解釋錯誤消息,或者修改你的程序讓它為你解釋消息。

perl program 2>diag.out
splain [-v] [-p] diag.out

或者修改你的程序讓它為你解釋消息。

use diagnostics;

或者

use diagnostics -verbose;

什麼是MakeMaker?

(由 brian d foy 貢獻)

ExtUtils::MakeMaker 模組,簡稱 "MakeMaker",將 Perl 腳本(通常稱為 Makefile.PL)轉換為 Makefile。Unix 工具 make 使用此文件來管理依賴關係和處理並安裝 Perl 發行版的操作。

作者與版權

版權所有 (c) 1997-2010 Tom Christiansen、Nathan Torkington 和其他註明的作者。保留所有權利。

本文檔是免費的;您可以按照與 Perl 自身相同的條款重新發布或修改它。

無論其分發方式如何,這裡的所有代碼示例都屬於公有領域。您被允許並鼓勵在自己的程序中自由使用此代碼及其任何衍生物,無論是為了娛樂還是為了盈利。在代碼中簡單地注明對 FAQ 的優秀態度將是禮貌的,但不是必需的。