目錄

名稱

perl5005delta - perl5.005 的新功能

說明

此文件說明 5.004 版本和此版本之間的差異。

關於新版本編號系統

Perl 現在分為兩條開發軌道:維護軌道,對已發布的生產版本進行小而安全的更新,重點在於相容性;以及開發軌道,追求更積極的演化。維護版本(應視為生產品質)的次版本號碼從 149,而開發版本(應視為「alpha」品質)的次版本號碼從 5099

Perl 5.005 是新的雙軌道開發計畫的結合產品。

不相容變更

警告:此版本與 Perl 5.004 二進制不相容。

從 Perl 5.004_50 開始,語言內部有許多深入且廣泛的變更。如果您有在 perl 5.003 或 5.004 下建置的動態載入擴充功能,您可以繼續在 5.004 中使用它們,但您需要重新建置並重新安裝這些擴充功能才能在 5.005 中使用它們。請參閱 INSTALL 以取得升級的詳細說明。

預設安裝結構已變更

新的 Configure 預設值旨在允許從 5.004 順利升級到 5.005,但您應該閱讀 INSTALL 以詳細了解變更,以便將其調整到您的系統。

Perl 原始碼相容性

當沒有啟用任何實驗性功能時,應該只有極少數使用者可見的 Perl 原始碼相容性問題。

如果啟用執行緒,則會套用一些警告。@_$_ 會變成詞彙變數。這項變更對使用者來說應該很透明,但有一些邊界條件,使用者需要了解這些問題。例如,local(@_) 會產生「無法將詞彙變數 @_ 本地化...」訊息。這項功能可能會在未來版本中啟用。

已新增一些新的關鍵字。這些關鍵字通常預期對相容性影響很小。請參閱 「新的 INIT 關鍵字」「新的 lock 關鍵字」「新的 qr// 算子」

某些裸字詞現在是保留字。如果您使用 -w 開關要求這些保留字,使用這些保留字會觸發警告。請參閱 our 現在是保留字」

C 原始碼相容性

此版本中已針對內部元件進行大量變更,以支援新功能。

二進位相容性

此版本與舊版本不二進位相容。所有擴充功能都需要重新編譯。此外,啟用執行緒功能建置的二進位檔與未啟用執行緒功能建置的二進位檔不相容。這對使用者來說應該是透明的,因為所有不二進位相容的組態都有其獨特的架構名稱,而擴充功能二進位檔會安裝在獨特的位置。這允許多個組態共存在同一個目錄層級中。請參閱 INSTALL

安全性修正可能會影響相容性

已修正一些污染外洩和污染遺漏問題。這可能會導致過去使用舊版本運作的指令碼「失敗」。使用 -DINCOMPLETE_TAINTS 編譯會提供 perl,其對污染行為的變更量最少。但請注意,產生的 perl 會有已知的安全性問題。

使用 -e 開關的一行指令碼不再建立暫存檔案。

5.004 中引入的放寬新強制警告

5.004 中引入的許多新警告已變成選用。其中一些警告仍然存在,但 perl 的新功能讓它們較少造成問題。請參閱 "新診斷"

授權

Perl 有新的貢獻者社會契約。請參閱 Porting/Contract

包含在許多 Perl 文件中的授權已變更。大部分的 Perl 文件以前都在暗示的 GNU 通用公共授權或 Artistic 授權(由使用者選擇)之下。現在,許多文件明確說明其可散發的條款。這些條款通常比 GNU GPL 限制少很多。請參閱 perl 和其中列出的各個 perl 手冊頁。

核心變更

執行緒

警告:執行緒被視為實驗性功能。實作細節可能在未通知的情況下變更。已知有某些限制和錯誤。預計這些問題會在未來版本中修正。

請參閱 README.threads

編譯器

警告:編譯器和相關工具被視為實驗性功能。功能可能在未通知的情況下變更,且已知有某些限制和錯誤。由於編譯器完全獨立於 Perl,預設組態會建置並安裝它。

編譯器會產生 Perl 程式的三種不同轉換。C 後端會產生 C 程式碼,用來擷取 Perl 在執行開始前的狀態。它消除了常規 Perl 詮釋器的編譯時間開銷,但執行時間效能仍然大致相同。CC 後端會產生最佳化的 C 程式碼,等同於執行時間的程式碼路徑。CC 後端有更大的最佳化潛力,但目前僅實作少數最佳化。位元組碼後端會產生執行前詮釋器狀態的平台非相依位元組碼表示。因此,位元組碼後端也會消除詮釋器的大部分編譯開銷。

編譯器附帶多個有價值的公用程式。

B::Lint 是實驗性模組,用來偵測和警告可疑程式碼,特別是 -w 開關未偵測到的情況。

B::Deparse 可用來釐清 Perl 程式碼,並了解 Perl 如何最佳化特定建構。

B::Xref 會產生程式中所有變數、子常式和格式的定義和使用交叉參照報告。

B::Showlex 一眼就可顯示子常式或檔案所使用的字彙變數。

perlcc 是編譯 Perl 的簡單前端。

請參閱 ext/B/READMEB 和各編譯器模組。

正規表示式

Perl 的正規表示式引擎已經過徹底檢修,並支援許多新的建構式。已修正多項錯誤。

以下是條列摘要

許多新的和改良的最佳化

RE 引擎中的變更

Unneeded nodes removed;
Substrings merged together;
New types of nodes to process (SUBEXPR)* and similar expressions
    quickly, used if the SUBEXPR has no side effects and matches
    strings of the same length;
Better optimizations by lookup for constant substrings;
Better search for constants substrings anchored by $ ;

使用 RE 引擎的 Perl 程式碼中的變更

More optimizations to s/longer/short/;
study() was not working;
/blah/ may be optimized to an analogue of index() if $& $` $' not seen;
Unneeded copying of matched-against string removed;
Only matched part of the string is copying if $` $' were not seen;
許多錯誤修正

請注意,這裡僅列出主要的錯誤修正。其他錯誤修正請參閱 變更

Backtracking might not restore start of $3.
No feedback if max count for * or + on "complex" subexpression
    was reached, similarly (but at compile time) for {3,34567}
Primitive restrictions on max count introduced to decrease a 
    possibility of a segfault;
(ZERO-LENGTH)* could segfault;
(ZERO-LENGTH)* was prohibited;
Long REs were not allowed;
/RE/g could skip matches at the same position after a 
  zero-length match;
新的正規表示式建構式

支援下列新的語法元素

(?<=RE)
(?<!RE)
(?{ CODE })
(?i-x)
(?i:RE)
(?(COND)YES_RE|NO_RE)
(?>RE)
\z
預編譯正規表示式的新的運算子

請參閱 "新的 qr// 運算子"

其他改進
	Better debugging output (possibly with colors),
            even from non-debugging Perl;
	RE engine code now looks like C, not like assembler;
	Behaviour of RE modifiable by `use re' directive;
	Improved documentation;
	Test suite significantly extended;
	Syntax [:^upper:] etc., reserved inside character classes;
不相容的變更
(?i) localized inside enclosing group;
$( is not interpolated into RE any more;
/RE/g may match at the same position (with non-zero length)
    after a zero-length match (bug fix).

請參閱 perlreperlop

改良的 malloc()

詳細資訊請參閱 malloc.c 開頭的標語。

內部實作快排

Perl 現在包含其自己高度最佳化的 qsort() 常式。新的 qsort() 能抵抗不一致的比較函式,因此 Perl 的 sort() 在給予寫不好的排序子常式時,將不再引發核心傾印。 (之前使用的某些 C 函式庫 qsort() 具有此問題。) 在我們的測試中,新的 qsort() 在所有已知的 qsort() 實作中,平均需要最少的成對比較次數。

請參閱 perlfunc/sort

可靠的訊號

Perl 的訊號處理容易隨機崩潰,因為訊號會非同步地到達,而 Perl 執行階段在任意時間都不是可重入的。

不過,當啟用執行緒時,有一個可靠訊號的實驗性實作可用。請參閱 Thread::Signal。另請參閱 安裝,了解如何建置有執行緒功能的 Perl。

可靠的堆疊指標

內部現在只在可預測的時間重新配置 perl 堆疊。特別是,魔法呼叫絕不會觸發堆疊重新配置,因為執行時期的所有再進入都使用「堆疊堆疊」來處理。這應該會改善內部和 XSUB 中快取堆疊指標的可靠性。

更寬容地處理回車

如果 Perl 在腳本中遇到文字回車,它會抱怨。現在它們在程式文字中大多被視為空白。在字串文字和 here 文件中,如果文字回車與換行符號配對出現,則會被忽略;如果它們獨立存在,則會被解釋為空白。此行為表示應避免檔案中的文字回車。您可以在建置 perl 時定義預處理器符號 PERL_STRICT_CR,以取得較舊、更相容(但較不寬容)的行為。當然,這一切與如何在字串中處理 \r 等跳脫字元無關。

請注意,這並不會神奇地讓您保留所有 DOS 格式的文字檔案。寬容處理僅適用於 perl 本身解析的檔案。如果您的 C 編譯器不允許檔案中出現回車,您可能仍然無法建置需要 C 編譯器的模組。

記憶體外洩

substrposvec 在 lvalue 上下文中使用時不再外洩記憶體。已修正許多影響嵌入多個直譯器的應用程式的微小外洩。

更佳地支援多個直譯器

建置時間選項 -DMULTIPLICITY 已重新整理許多細節。一些以前應該是每個直譯器的全域變數現在是每個直譯器。小心處理,這允許直譯器彼此呼叫。請參閱 CPAN 上的 PerlInterp 擴充套件。

local() 在陣列和雜湊元素上的行為現在已定義良好

請參閱 "perlsub 中透過 local() 取得暫時值"

%! 透明地繫結到 Errno 模組

請參閱 perlvarErrno

支援偽雜湊

請參閱 perlref

EXPR foreach EXPR 受支援

請參閱 perlsyn

關鍵字可以全局覆寫

請參閱 perlsub

$^E 在 Win32 中有意義

請參閱 perlvar

foreach (1..1000000) 已最佳化

foreach (1..1000000) 現已最佳化為計數迴圈。它不再嘗試配置 1000000 大小的清單。

Foo:: 可用作隱式引號的套件名稱

當與套件同名的子常式被定義時,裸字會造成不直觀的行為。因此,new Foo @args 使用呼叫 Foo() 的結果,而不是將 Foo 視為文字。在間接物件槽中撰寫裸字的建議方式為 new Foo:: @args。請注意,當您執行此操作時,new() 方法會以 Foo 作為第一個引數呼叫,而不是 Foo::

exists $Foo::{Bar::} 測試套件的存在

以前無法在實際建立套件前測試其存在。現在可以使用 exists $Foo::{Bar::} 來測試是否已建立 Foo::Bar 名稱空間。

更好的區域設定支援

請參閱 perllocale

對 64 位元平台的實驗性支援

Perl5 一直在 64 位元系統上支援 64 位元長整數。從 5.005 開始,已新增對具有 32 位元長整數和 64 位元「長長整數」系統的實驗性支援。如果您在 config.sh 中的 ccflags 中新增 -DUSE_LONG_LONG(或在 perl.h 中手動定義它),那麼 perl 將會建置「長長整數」支援。將會有許多編譯器警告,且產生的 perl 可能無法在所有系統上執行。還有許多其他與第三方擴充功能和函式庫相關的問題。此選項的存在是為了讓人們可以處理這些問題。

prototype() 會在內建函式上傳回有用的結果

請參閱 "prototype" in perlfunc

擴充例外處理支援

die() 現在接受參考值,而 $@ 會在例外陷阱中設定為該值。這使得傳播例外物件成為可能。這是一個未記錄的實驗性功能。

支援在 DESTROY() 中重新祝福,以串連 DESTROY() 方法

請參閱 "Destructors" in perlobj

所有 printf 格式轉換都會在內部處理

請參閱 "printf" in perlfunc

新的 INIT 關鍵字

INIT 子例程類似於 BEGINEND,但它們會在 perl 執行時期開始執行之前執行。例如,Perl 編譯器會使用 INIT 區塊來初始化和解析指向 XSUB 的指標。

新的 lock 關鍵字

lock 關鍵字是執行緒 Perl 中的基本同步原語。當執行緒未啟用時,它目前為 noop。

為了將對原始碼相容性的影響降到最低,此關鍵字為「弱」,亦即,除非已看到 use Thread,否則任何同名的使用者定義子常式都會覆寫它。

新的 qr// 算子

qr// 算子在語法上類似於其他引號式算子,用於建立預編譯的正規表示式。此編譯形式現在可以在變數中明確傳遞,並內插到其他正規表示式中。請參閱 perlop

our 現在是保留字

使用 -w 開關呼叫名稱為 our 的子常式現在會引發警告。

繫結陣列現在獲得完全支援

請參閱 Tie::Array

繫結處理常式支援更好

已新增幾個遺失的掛鉤。TIEARRAY 實作也有新的基礎類別。請參閱 Tie::Array

substr 的第 4 個引數

substr() 現在可以在一次作業中回傳和取代。選用的第 4 個引數是取代字串。請參閱 perlfunc 中的「substr」

splice 的負 LENGTH 引數

帶有負 LENGTH 引數的 splice() 現在運作方式類似於 LENGTH 對 substr() 所做的。以前,負 LENGTH 會當成 0 處理。請參閱 perlfunc 中的「splice」

神奇的 lvalue 現在更神奇了

當您說類似 substr($x, 5) = "hi" 的話時,substr() 回傳的純量是特殊的,因為對它的任何修改都會影響 $x。(這稱為「神奇的 lvalue」,因為「lvalue」是指定在等號左邊的東西。)通常,這正是您預期會發生的事,但如果您在可能修改 substr()、pos() 或 vec() 的環境中使用它們,例如使用 \ 進行參照或作為修改 @_ 的子常式的引數,Perl 會使用相同的魔法。在先前的版本中,此「魔法」只會單向進行,但現在對神奇參照的純量所做的變更(以上面的範例為 $x)也會影響神奇的 lvalue。例如,此程式碼現在會以不同的方式運作

    $x = "hello";
    sub printit {
	$x = "g'bye";
	print $_[0], "\n";
    }
    printit(substr($x, 0, 5));

在先前的版本中,這會列印「hello」,但現在會列印「g'bye」。

<> 現在讀取記錄

如果 $/ 參照一個整數,或一個儲存整數的純量,<> 會讀取記錄,而不是列。更多資訊,請參閱 "$/" 在 perlvar 中。

支援的平台

Configure 有許多漸進式的改進。現在可以透過 Policy.sh,讓建立 perl 的網站範圍政策持續存在。Configure 也會記錄在 config.sh 中使用的命令列引數。

新的平台

現在支援 BeOS。請參閱 README.beos

現在在 DJGPP 工具下支援 DOS。請參閱 README.dos(在某些系統上安裝為 perldos)。

現在支援 MiNT。請參閱 README.mint

現在支援 MPE/iX。請參閱 README.mpeix。

現在支援 MVS(又稱 OS390,又稱 Open Edition)。請參閱 README.os390(在某些系統上安裝為 perlos390)。

現在支援 Stratus VOS。請參閱 README.vos

現有支援的變更

Win32 支援已大幅提升。支援 Perl Object,一個 Perl 的 C++ 封裝。現在在 Win32 上支援 GCC 和 EGCS。請參閱 README.win32,又稱 perlwin32

VMS 設定系統已重新撰寫。請參閱 README.vms(在某些系統上安裝為 README_vms)。

大多數 Unix 平台的提示檔案已獲得漸進式的改進。

模組和實用程式

新的模組

B

Perl 編譯器和工具。請參閱 B

Data::Dumper

一個用於漂亮列印 Perl 資料的模組。請參閱 Data::Dumper

Dumpvalue

一個用於將 Perl 值傾印至畫面的模組。請參閱 Dumpvalue

Errno

一個用於更方便地查詢錯誤的模組。請參閱 Errno

File::Spec

一個用於檔案操作的可攜式 API。

ExtUtils::Installed

查詢和管理已安裝的模組。

ExtUtils::Packlist

操作 .packlist 檔案。

Fatal

使函式/內建函式成功或 die。

IPC::SysV

perl 中 System V IPC 操作的常數和其他支援架構。

Test

一個用於撰寫測試套件的架構。

Tie::Array

繫結陣列的基本類別。

Tie::Handle

繫結句柄的基本類別。

Thread

Perl 執行緒建立、操作和支援。

attrs

設定子常式屬性。

fields

編譯時期類別欄位。

re

控制正規表示式行為的各種實用程式。

現有模組的變更

Benchmark

現在您可以執行 x 秒的測試,而不必猜測要執行的正確測試數量。

保持更好的時間。

Carp

Carp 有新的函數 cluck()。cluck() 會發出警告,就像 carp() 一樣,但也會在錯誤訊息中加入堆疊回溯,就像 confess() 一樣。

CGI

CGI 已更新至 2.42 版。

Fcntl

新增更多 Fcntl 常數:F_SETLK64、F_SETLKW64、O_LARGEFILE,用於存取大型檔案(超過 4G)(不過 64 位元支援尚未運作,所以不用太興奮),Free/Net/OpenBSD 鎖定行為旗標 F_FLOCK、F_POSIX、Linux F_SHLCK,以及 O_ACCMODE:O_RDONLY、O_WRONLY 和 O_RDWR 的遮罩。

Math::Complex

存取器方法 Re、Im、arg、abs、rho、theta,方法 can ($z->Re()) 現在也可以作為變異器 ($z->Re(3))。

Math::Trig

新增一些徑向三角學(柱狀和球狀),例如大圓距離。

POSIX

POSIX 現在有自己的特定於平台的提示檔案。

DB_File

DB_File 支援 Berkeley DB 的 2.x 版。請參閱 ext/DB_File/Changes

MakeMaker

MakeMaker 現在支援撰寫空的 makefile,提供一種方式來指定應遵守 site umask() 政策。對於 .packlist 檔案的操作和取得已安裝模組的資訊也有更好的支援。

同時具有與架構相關和與架構無關檔案的擴充功能現在總是完全安裝在與架構相關的位置。以前,可共用的部分會跨架構和跨 perl 版本共用,因此可能會被具有細微不相容性的較新版本覆寫。

CPAN

請參閱 perlmodinstallCPAN

Cwd

Cwd::cwd 在大多數平台上執行速度較快。

公用程式變更

h2ph 及相關公用程式已大幅度修改。

perlcc,編譯器的新實驗前端已推出。

原始的 GNU configure 模擬器現稱為 configure.gnu,以避免在不區分大小寫的檔案系統中覆蓋 Configure

perldoc 過去執行速度相當慢。較慢的功能現在為選用。特別是,不區分大小寫的搜尋需要 -i 開關,而遞迴搜尋需要 -r。您可以在 PERLDOC 環境變數中設定這些開關以取得舊有的行為。

文件變更

Config.pm 現在有變數清單。

Porting/patching.pod 有關於如何為 Perl 建立並提交修補程式的詳細說明。

perlport 指定如何撰寫可攜式程式碼的準則。

perlmodinstall 說明如何從 CPAN 網站擷取並安裝模組。

現在已記錄更多 Perl 陷阱。請參閱 perltrap

perlopentut 提供有關如何使用 open() 的教學課程。

perlreftut 提供有關參考的教學課程。

perlthrtut 提供有關執行緒的教學課程。

新診斷

不明確的呼叫已解析為 CORE::%s(),請加以限定或使用 &

(W) 您已宣告的子常式與 Perl 關鍵字同名,而您在呼叫其中一個時未限定名稱。Perl 決定呼叫內建函式,因為該子常式未匯入。

若要強制解釋為子常式呼叫,請在子常式名稱前加上一個&符號,或使用套件限定名稱。或者,您可以匯入子常式(或假裝已使用 use subs 實用程式匯入)。

若要靜默地解釋為 Perl 算子,請在算子上使用 CORE:: 前置詞(例如 CORE::log($x)),或宣告子常式為物件方法(請參閱 "attrs")。

錯誤的索引值,在將陣列轉換為雜湊時

(F) 在雜湊中查詢的索引值,在偽雜湊的第 0 個元素中找到,是不合法的。索引值必須大於或等於 1。請參閱 perlref

裸字串「%s」指向不存在的套件

(W) 您使用了 Foo:: 形式的限定裸字串,但編譯器在那之前沒有看到該命名空間的其他用法。您可能需要預先宣告一個套件?

無法對未定義的值呼叫方法「%s」

(F) 您使用了方法呼叫的語法,但物件參考或套件名稱填入的欄位包含未定義的值。類似以下內容將會重現錯誤

$BADREF = 42;
process $BADREF 1,2,3;
$BADREF->process(1,2,3);
無法檢查腳本「%s」的檔案系統是否為 nosuid

(P) 由於某些原因,您無法檢查腳本的檔案系統是否為 nosuid。

無法將陣列轉換為雜湊

(F) 您在預期雜湊的地方使用了陣列,但陣列沒有關於如何從鍵對應到陣列索引的資訊。您只能對在索引 0 處具有雜湊參考的陣列執行此操作。

無法從 eval 字串中轉到子常式

(F) 「轉到子常式」呼叫無法用於跳出 eval 「字串」。(您可以用它跳出 eval {BLOCK},但您可能不想要這樣做。)

無法將偽雜湊元素設為區域變數

(F) 您說了類似 local $ar->{'key'} 的內容,其中 $ar 是對偽雜湊的參考。這尚未實作,但您可以透過直接將對應的陣列元素設為區域變數來獲得類似的效果:local $ar->[$ar->[0]{'key'}]

無法使用 %%!,因為 Errno.pm 不可用

(F) 第一次使用 %! hash 時,perl 會自動載入 Errno.pm 模組。Errno 模組預期會繫結 %! hash 以提供 $! errno 值的符號名稱。

找不到 %s 的 opnumber

(F) 字串形式的 CORE::word 傳遞給 prototype(),但沒有名稱為 word 的內建函式。

字元類別語法 [. .] 保留供未來擴充

(W) 在正規表示式字元類別 ([]) 中,以 "[." 開頭且以 ".]" 結尾的語法保留供未來擴充。如果需要在正規表示式字元類別中表示這些字元序列,請使用反斜線加上方括號引號:"[." 和 ".\]"。

字元類別語法 [: :] 保留供未來擴充

(W) 在正規表示式字元類別 ([]) 中,以 "[:" 開頭且以 ":]" 結尾的語法保留供未來擴充。如果需要在正規表示式字元類別中表示這些字元序列,請使用反斜線加上方括號引號:"[:" 和 ":\]"。

字元類別語法 [= =] 保留供未來擴充

(W) 在正規表示式字元類別 ([]) 中,以 "[=" 開頭且以 "=]" 結尾的語法保留供未來擴充。如果需要在正規表示式字元類別中表示這些字元序列,請使用反斜線加上方括號引號:"[=" 和 "=\]"。

%s:在不安全的正規表示式中評估群組

(F) Perl 在編譯包含不安全的零寬度斷言 (?{ ... }) 的正規表示式時偵測到受污染的資料。請參閱 "(?{ code })" in perlreperlsec

%s:Eval-group 不允許,請使用 re 'eval'

(F) 正規表示式包含 (?{ ... }) 零寬度斷言,但只有在 use re 'eval' pragma 生效時才允許使用該結構。請參閱 "(?{ code })" in perlre

%s:執行階段不允許 Eval-group

(F) Perl 嘗試在執行階段編譯包含 (?{ ... }) 零寬度斷言的正規表示式,就像在模式包含內插值時一樣。由於這是一個安全風險,因此不允許。如果您堅持要這麼做,您仍可以在執行階段從內插字串明確建立模式,並在 eval() 中使用它。請參閱 "(?{ code })" in perlre

對 '' 進行明確的祝福(假設套件為 main)

(W) 您正在祝福一個零長度字串的參考。這會產生將參考祝福到套件 main 的效果。這通常不是您想要的。請考慮提供預設目標套件,例如 bless($ref, $p || 'MyPackage');

忽略非法十六進位數字

(W) 您可能嘗試在十六進位數字中使用 0 - 9 或 A - F 以外的字元。十六進位數字的解釋在非法字元之前停止。

沒有這樣的陣列欄位

(F) 您嘗試將陣列當作雜湊來存取,但使用的欄位名稱未定義。索引為 0 的雜湊應將所有有效的欄位名稱對應到陣列索引,才能正常運作。

在類型為 %s 的變數 %s 中沒有欄位 "%s"

(F) 您嘗試存取型別變數的欄位,但該型別不知道該欄位名稱。在編譯時,欄位名稱會在型別套件的 %FIELDS hash 中查詢。%FIELDS hash 通常會使用 'fields' pragma 設定。

在極大要求期間發生記憶體不足

(F) 您無法配置超過 2^31+"少量" 位元組。此錯誤最有可能由 Perl 程式中的錯字造成。例如,$arr[time] 而不是 $arr[$time]

範圍反覆運算器超出整數範圍

(F) 範圍運算子 ".." 的一個(或兩個)數字引數超出內部可以用整數表示的範圍。一個可能的解決方法是強制 Perl 使用神奇字串增量,方法是在數字前面加上 "0"。

在尋找方法 '%s' %s 時偵測到遞迴繼承

(F) 在呼叫方法時遇到超過 100 層的繼承。這可能表示您的繼承階層中出現意外的迴圈。

在預期偶數大小清單的地方找到參考

(W) 您提供了一個單一參考,而 Perl 預期的是一個具有偶數個元素的清單(用於指定給 hash)。這通常表示您在應該使用括號時使用了匿名 hash 建構函式。無論如何,hash 需要鍵值配對

%hash = { one => 1, two => 2, };   # WRONG
%hash = [ qw/ an anon array / ];   # WRONG
%hash = ( one => 1, two => 2, );   # right
%hash = qw( one 1 two 2 );                 # also fine
未定義值指定給型別全域變數

(W) 未定義值指定給型別全域變數,例如 *foo = undef。這什麼都不做。您可能實際上是要 undef *foo

使用保留字 "%s" 已過時

(D) 指示的裸字是一個保留字。perl 的未來版本可能會將其用作關鍵字,因此您最好以適合其使用情境的適當方式明確引用該字,或完全使用不同的名稱。可以透過新增 & 前綴或使用套件限定詞 (例如 &our()Foo::our()) 來抑制子常式名稱的警告。

perl: 警告:設定區域設定失敗。

(S) 整個警告訊息看起來類似於

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LC_ALL = "En_US",
        LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

失敗的區域設定實際上有所不同。在上述情況中,設定為 LC_ALL 為「En_US」,而 LANG 沒有值。此錯誤表示 Perl 偵測到您和/或您的系統管理員已設定所謂的可變系統,但 Perl 無法使用這些設定。幸運的是,這並非嚴重問題:Perl 可以且會使用稱為「C」的「預設區域設定」,腳本將會執行。然而,在您真正解決問題之前,每次執行 Perl 時都會收到相同的錯誤訊息。如何在 perllocale 中的「區域設定問題」 中找到真正解決問題的方法。

過時的診斷

無法 mktemp()

(F) 在嘗試處理 -e 開關時,mktemp() 常式因某種原因而失敗。可能是您的 /tmp 分割區已滿或遭到破壞。

已移除,因為 -e 不再使用暫存檔。

無法寫入 -e 的暫存檔:%s

(F) 在嘗試處理 -e 開關時,寫入常式因某種原因而失敗。可能是您的 /tmp 分割區已滿或遭到破壞。

已移除,因為 -e 不再使用暫存檔。

無法開啟暫存檔

(F) 在嘗試處理 -e 開關時,建立常式因某種原因而失敗。可能是您的 /tmp 分割區已滿或遭到破壞。

已移除,因為 -e 不再使用暫存檔。

正規表示式太大

(F) 常規表示式的目前實作使用短整數作為字串內的位址偏移量。不幸的是,這表示如果常規表示式編譯超過 32767,就會爆炸。通常,當您想要一個這麼大的常規表示式時,有更好的方法可以使用多個陳述式來完成。請參閱 perlre

組態變更

您可以使用「Configure -Uinstallusrbinperl」,這會讓 installperl 跳過將 perl 安裝為 /usr/bin/perl。如果您因為某些原因不想修改 /usr/bin,這會很有用,但也很有害,因為許多指令碼假設可以在 /usr/bin/perl 中找到 Perl。

錯誤

如果您發現您認為是錯誤的地方,您可能會檢查 comp.lang.perl.misc 新聞群組中最近發布的文章標頭。在 Perl 首頁 http://www.perl.com/perl/ 中也可能有資訊。

如果您相信您有一個未報告的錯誤,請執行您版本中包含的 perlbug 程式。請務必將您的錯誤精簡為一個小但足夠的測試案例。您的錯誤報告連同 perl -V 的輸出,將會傳送至 <perlbug@perl.com>,供 Perl 移植團隊分析。

另請參閱

變更 檔案提供有關變更內容的詳盡詳細資料。

安裝 檔案說明如何建置 Perl。

自述 檔案提供一般資訊。

藝術複製 檔案提供版權資訊。

歷史

由 Gurusamy Sarathy <gsar@activestate.com> 編寫,並得到 Perl 移植人員的許多貢獻。

將遺漏或更正事項傳送至 <perlbug@perl.com>。