perl58delta - perl v5.8.0的新功能
本文描述了5.6.0版本與5.8.0版本之間的差異。
5.8.0中的許多錯誤修復在5.6.1維護版本中已經看到,因為這兩個版本保持緊密協調(在5.8.0仍被稱為5.7.something時)。
已整合進 5.6.1 版本的變更被標記為 [561]
。自 5.6.1 版本釋出後,許多這些變更已經進一步發展,這些被標記為 [561+]
。
您可以通過閱讀 perl561delta 查看 5.6.1 版本的變更清單(包括來自 5.005_03 版本和 5.6.0 版本的變更)。
更好的 Unicode 支援
新的 IO 實作
新的 Thread 實作
更好的數值準確度
安全信號
許多新的模組
更廣泛的回歸測試
Perl 5.8 與之前的 Perl 版本不兼容。
您必須重新編譯您的 XS 模組。
(純 Perl 模組應該繼續運作。)
不相容性的主要原因是稱為 PerlIO 的新 IO 架構。PerlIO 是默認配置,因為如果沒有它,Perl 5.8 的許多新功能將無法使用。換句話說:您只需重新編譯包含 XS 代碼的模組,對此表示抱歉。
在 Perl 的未來版本中,不支援 PerlIO 的 XS 模組可能會完全不被支援。然而,對於模組作者來說,這應該不會太困難:PerlIO 已經被設計為 stdio 介面的一個可插拔替代品(在源代碼層面)。
根據您的平台,我們決定破壞二進制兼容性的其他原因也有其他原因,請繼續閱讀。
如果您的指標是 64 位元寬,Perl malloc 將不再使用,因為它與 8 位元指標不兼容。而且,通常這些平台上的系統 malloc 比 Perl malloc 更好地優化了如此大的內存模型。一些對內存需求很高的 Perl 應用程序(如 PDL)不適用於 Perl 的 malloc。最後,除 Perl 外的其他應用程序(如 mod_perl)往往更喜歡系統 malloc。這些平台包括 Alpha 和 64 位元 HPPA、MIPS、PPC 和 Sparc。
在 AIX 4.3 版本及更新版本中,AIX 動態加載現在使用 AIX 的原生 dlopen 介面,而不是舊的模擬介面。這個變更可能會破壞與編譯模組的向後兼容性。這個變更是為了使 Perl 更符合使用 AIX 原生介面的其他應用程序,如 mod_perl。
my
變數的屬性現在在運行時處理my EXPR : ATTRS
語法現在在運行時應用變數屬性。(子程序和 our
變數仍然在編譯時應用屬性。)參見 attributes 以獲取更多詳細信息。特別是,這允許變數屬性對於 tie
介面是有用的,這是先前版本的一個不足之處。請注意,新的語義不適用於 Attribute::Handlers 模組(截至版本 0.76)。
Socket 擴展現在是動態加載的,而不是靜態構建的。對於古老的 VMS TCP/IP 堆棧,這可能是一個問題,我們無法確定,因為我們無法在這種配置下測試 Perl。
Perl 現在在 OpenVMS Alpha 上使用 IEEE 格式(T_FLOAT)作為默認的內部浮點數格式,可能會破壞與外部庫或現有數據的二進制兼容性。G_FLOAT 仍然作為配置選項可用。VAX 上的默認值(D_FLOAT)未更改。
以前在 Perl 5.6 中,要使用 Unicode,可以使用 "use utf8",然後操作(如字符串連接)在該詞法範圍內是 Unicode 意識的。
發現這是一個不方便的接口,在 Perl 5.8 中,Unicode 模型完全改變了:現在 "Unicode 特性" 與數據本身綁定,大多數情況下根本不需要 "use utf8"。 "use utf8" 的唯一剩餘用途是當 Perl 腳本本身是用 Unicode 的 UTF-8 編碼編寫時。(由於有許多 Perl 腳本正在使用各種國家的 8 位字符集,這在 UTF-8 中將是非法的,因此 UTF-8 並不是默認值。)
請參閱 perluniintro 以了解當前模型的解釋,並參閱 utf8 以了解 utf8 pragma 的當前用法。
現在支持 Unicode scripts。腳本類似於(並且優於)Unicode blocks。腳本與塊之間的區別在於,腳本是一種語言或一組語言使用的字形,而塊則是基於 Unicode 編號的(主要是)256 個字符的更人工的分組。
通常,腳本更具包容性,但並非普遍如此。例如,儘管腳本 Latin
包括所有拉丁字符及其各種帶音節的版本,但它不包括各種標點符號或數字(因為它們不僅僅是 Latin
)。
現在支援許多其他屬性,包括 \p{L&}
、\p{Any}
、\p{Assigned}
、\p{Unassigned}
、\p{Blank}
[561] 和 \p{SpacePerl}
[561](當然也包括它們的 \P{...}
版本)。詳細資訊請參閱 perlunicode,以及更多新增內容。
與 \p{...}
和 \P{...}
一起使用的名稱現在幾乎總是可選的。唯一的例外是,當塊名稱與腳本名稱衝突時,需要使用 In
前綴來表示 Unicode 塊。例如,\p{Tibetan}
是指腳本,而 \p{InTibetan}
是指塊。當名稱沒有衝突時,您可以從塊名稱中省略 In
(例如 \p{BraillePatterns}
),但為了安全起見,最好總是使用 In
)。
對參考的參考現在會被串列化為 "REF(0x81485ec)",而不是 "SCALAR(0x81485ec)",以使其與 ref() 的返回值更一致。
未記錄的 pack/unpack 模板字母 D/F 已經被循環利用以更好地使用:現在它們代表長雙精度(如果平台支援)和 NV(Perl 內部浮點類型)。 (它們以前是 d/f 的別名,但您可能不知道。)
glob() 得到的檔案名稱列表(或 <...>)現在默認按字母順序排序,以符合 csh 標準(這在大多數 Unix 平台上以前已經發生)。 (bsd_glob() 仍然會依平台原生地排序,ASCII 或 EBCDIC,除非指定了 GLOB_ALPHASORT。)[561]
bless(REF, REF) 的語義不明確,除非有人證明它有一定的意義,否則是禁止的。
永遠不應該允許逃出實驗室的過時 chat2 库已被停用。
使用 chdir("") 或 chdir(undef) 代替顯式 chdir() 是有疑慮的。失敗(考慮 chdir(some_function()))可能導致意外的 chdir() 到主目錄,因此這種行為已被棄用。
內建的 dump() 函數可能已經超出了大多數有用性。核心轉儲功能將在將來作為對 CORE::dump()
的顯式調用而保留,但在未來版本中,未經限定的 dump()
調用的行為可能會更改。
eg/ 目錄中的非常陳舊的示例已被刪除。歡迎提供新的亮眼示例,但主要問題是這些示例需要有文檔、測試和(最重要的)維護。
現在(bogus)的逃脫序列 \8 和 \9 現在會給予一個可選的警告("未識別的逃脫序列通過")。不需要 \-逃脫任何 \w
字元。
*glob{FILEHANDLE} 已被棄用,改用 *glob{IO}。
package;
語法 (package
沒有參數) 已被棄用。其語法從未清晰,實現方式更是如此。如果您使用該功能來禁止除全限定變量外的所有變量,請改用 use strict;
。
未實現的 POSIX 正則表達式功能 [[.cc.]] 和 [[=c=]] 仍然被識別,但現在導致致命錯誤。之前的行為默認忽略它們並在需要時發出警告是不可接受的,因為它在某種程度上虛偽地承諾了這些功能可以使用。
在未來的版本中,非 PerlIO 意識的 XS 模塊可能會完全不受支持。由於 PerlIO 是標準IO的源代碼級替代品,這應該不會是那麼嚴重的變化。
以前的 perl 版本和一些 Camel III 的某些部分的解讀暗示了 :raw
"disipline" 是 :crlf
的反義詞。關閉 "clrfness" 不再足以使流程真正成為二進制。因此,PerlIO :raw
層 (或 "discipline",使用 Camel 書的較舊術語) 現在被正式定義為等效於 binmode(FH) - 這反過來又被定義為進行必要的操作以將每個字節原封不動地傳遞,而不進行任何轉換。特別是 binmode(FH) - 因此 :raw
- 現在會關閉 CRLF 和 UTF-8 轉換,並刪除其他層 (例如::encoding()),這些層會修改字節流。
目前可見的偽哈希 (第一個數組元素的奇怪使用) 實施自 Perl 5.8.0 開始已被棄用,並將在 Perl 5.10.0 中刪除,該功能將以不同的方式實現。目前的界面不僅相當醜陋,而且目前的實現明顯減慢了普通數組和哈希的使用速度。 fields
pragma 界面將保持可用。預計將使用 restricted hashes 介面作為替代介面 (參見 Hash::Util)。如果您現有的程序依賴於底層實現,請考慮使用 CPAN 中的 Class::PseudoHash。
語法 @a->[...]
和 %h->{...}
現在已被棄用。
多年來一直在嘗試,suidperl 被認為太複雜,永遠不可能被認為真正安全。suidperl 功能可能會在未來的版本中被移除。
5.005 版本的線程模型 (模塊 Thread
) 已被棄用,預計在 Perl 5.10 中刪除。多線程代碼應該遷移到新的 ithreads 模型 (參見 threads、threads::shared 和 perlthrtut)。
長期以來被棄用的字符串比較操作符的大寫別名 (EQ、NE、LT、LE、GE、GT) 現在已被刪除。
tr///C 和 tr///U 功能已被移除且不會復原;介面是一個錯誤。對此深感抱歉。若要取得類似的功能,請參閱 pack('U0', ...) 和 pack('C0', ...)。[561]
較早版本的 Perl 將 "sub foo (@bar)" 視為等效於 "sub foo (@)"。現在在編譯時會更好地檢查原型的語法是否有效。可能會產生可選警告("原型中的非法字元..."),但這可能在未來的版本中升級為致命錯誤。
exec LIST
和 system LIST
操作現在會對有污染數據產生警告,在某些未來的版本中,它們將產生致命錯誤。
當將綁定陣列和雜湊本地化時的現有行為是錯誤的,並將在未來版本中更改,因此不要依賴於現有的行為。請參閱 "綁定陣列和雜湊的本地化是錯誤的"。
一般來說,Unicode 現在應該比 Perl 5.6.0(甚至比 5.6.1)更易於使用。Unicode 可以用於雜湊鍵中,正則表達式中的 Unicode 現在應該可以運作,tr/// 中的 Unicode 現在應該可以運作,I/O 中的 Unicode 現在應該可以運作。請參閱 perluniintro 進行簡介,以及 perlunicode 進行詳細了解。
Perl 附帶的 Unicode 字符資料庫已升級至 Unicode 3.2.0。有關更多信息,請參閱 http://www.unicode.org/ 。[561+](5.6.1 使用 UCD 3.0.1。)
對於有興趣增強 Perl Unicode 功能的開發者:幾乎所有的 UCD 文件都包含在 Perl 分發版的 lib/unicore 子目錄中。出於空間考慮,最值得注意的省略是 Unihan 資料庫。
已添加了屬性 \p{Blank} 和 \p{SpacePerl}。“Blank”類似於 C 中的 isblank(),即僅包含“水平空白”(空格字符是,換行符不是),而“SpacePerl”是 Unicode 版本的 \s
(\p{Space} 不是,因為它包括垂直制表符字符,而 \s
不包括)。
請參閱本文件中關於 Unicode 屬性變更的“新 Unicode 屬性”以獲取額外信息。
現在 IO 默認通過 PerlIO 而不是系統的 "stdio" 進行。PerlIO 允許將“層”“推送”到文件處理器以更改處理器的行為。層可以在打開時通過 open 的三參數形式指定
open($fh,'>:crlf :utf8', $path) || ...
或者在已打開的處理器上通過擴展的 binmode
指定。
binmode($fh,':encoding(iso-8859-7)');
內建的層級包括:unix(低階讀寫)、stdio(與以前的 Perl 相同)、perlio(以可移植方式重新實現 stdio 緩衝)、crlf(在 Win32 上進行 CRLF <=> "\n" 轉換,但在任何平台上都可用)。如果平台支援,可能會提供 mmap 層級(主要是 Unix)。
預設情況下要應用的層級可以通過 'open' pragma 來指定。
請參見"安裝和配置改進"以獲取 PerlIO 對您的架構名稱的影響。
如果您的平台支援 fork(),您可以使用 open
的列表形式進行管道操作。例如
open KID_PS, "-|", "ps", "aux" or die $!;
forks the ps(1) command(不會產生 shell,因為 open() 的參數超過三個),並通過 KID_PS
文件處理器讀取其標準輸出。請參見perlipc。
文件處理器可以被標記為接受 Perl 內部的 Unicode 編碼(取決於平台,可能是 UTF-8 或 UTF-EBCDIC)的偽層 ":utf8"。
open($fh,">:utf8","Uni.txt");
EBCDIC 用戶注意:偽層 ":utf8" 對您來說命名錯誤,因為您將得到的不是 UTF-8,而是 UTF-EBCDIC。請參見perlunicode、utf8和 http://www.unicode.org/reports/tr16/ 以獲取更多信息。在未來的版本中,此命名可能會更改。有關 UTF-8 的更多信息,請參見perluniintro。
如果您的環境變量(LC_ALL、LC_CTYPE、LANG)看起來想要使用 UTF-8(任何變量都匹配 /utf-?8/i
),則您的 STDIN、STDOUT、STDERR 處理器和默認的打開層級(參見open)將被標記為 UTF-8。(這個功能和其他結合 Unicode 和 I/O 的新功能僅在您使用 PerlIO 時才能工作,但這是默認設置。)
請注意,之後 Perl 真的會假設一切都是 UTF-8:例如,如果某個輸入處理器不是,Perl 很快就會抱怨輸入數據,如“Malformed UTF-8 ...”,因為任何舊的八位數據都不是合法的 UTF-8。
給代碼作者的提示:如果您想讓用戶將 UTF-8 作為其默認編碼,但在您的代碼中仍然使用八位元 I/O 流(例如圖像或 zip 文件),您需要明確使用 :bytes
來 open() 或 binmode()(參見perlfunc 中的 "open" 和 perlfunc 中的 "binmode"),或者您可以只使用 binmode(FH)
(對於 5.8.0 之前的版本向下兼容性很好)。
檔案處理程序可以透過 ":encoding()" 層將字符編碼從/轉換為 Perl 內部的 Unicode 表示形式進行讀取/寫入。
檔案處理程序可以打開到 Perl 标量中保存的“記憶體內”檔案。
open($fh,'>', \$variable) || ...
匿名臨時檔案可用,無需使用 'use FileHandle' 或其他模組。
open($fh,"+>", undef) || ...
那是一個實際的未定義,而不是未定義的值。
新的解釋器線程(簡稱"ithreads")實現了多線程,由 Arthur Bergman 負責,取代了舊的 "5.005 線程" 實現。在 ithreads 模型中,線程之間的任何數據共享都必須是明確的,而不是數據共享是隱式的模型。參見 threads 和 threads::shared,以及 perlthrtut。
作為 ithreads 實現的一部分,Perl 還將使用任何必要且可檢測到的可重入 libc 接口。
受限哈希被限制為某一組特定的鍵,不能添加集合外的鍵。還可以限制單個鍵,以使鍵無法被刪除且值無法更改。沒有涉及新的語法:Hash::Util 模組是接口。
以前,Perl 很脆弱,因為信號在不恰當的時刻到達時可能會損壞 Perl 的內部狀態。現在 Perl 延遲處理信號直到安全(在操作碼之間)。
這個改變可能會帶來意外的副作用,因為信號不再立即中斷 Perl。Perl 現在會首先完成它正在做的任何事情,比如完成內部操作(比如 sort())或外部操作(比如 I/O 操作),然後才查看已到達的信號(並在開始下一個操作之前)。由於當前操作始終首先完成,所以不會再有損壞的內部狀態,但信號可能需要更長的時間才能被聽到。請注意,從可能阻塞的操作中跳出應該仍然有效。
總的來說,Perl 在對數字(整數和浮點數)理解方面進行了很多修復。由於在許多系統中,標準的數字解析函數,如 strtoul()
和 atof()
,似乎存在缺陷,Perl 試圖解決它們的不足之處。這希望能產生更準確的數字。
Perl 現在在數值轉換和基本算術運算(+ - * /)中儘可能使用整數值,如果參數是整數,它會嘗試內部轉換為整數,並且也會嘗試保持結果內部存儲為整數。這個變化通常會導致算術運算稍微更快,並且總是更少損失。(之前 Perl 在其數學運算中始終優先使用浮點數。)
在雙引號字串中,無論如何,陣列現在都會插值。在 perl 5 的早期版本中,如果陣列在編譯字符串之前已經被提及,則陣列會插值到字符串中,否則 Perl 會引發致命的編譯時錯誤。在版本 5.000 到 5.003 中,錯誤是
Literal @example now requires backslash
在版本 5.004_01 到 5.6.0 中,錯誤是
In string, @example now must be written as \@example
這裡的想法是讓人們習慣於在需要字面上的 @
符號時寫 "fred\@example.com"
,就像他們總是在需要字面上的 $
符號時寫 "Give me back my \$5"
一樣。
從 5.6.1 開始,當 Perl 在雙引號字串中看到一個 @
符號時,它會嘗試 總是 插值一個陣列,無論該陣列是否已經被使用或聲明。致命錯誤已降級為可選警告
Possible unintended interpolation of @example in string
這會警告您,如果您不使用反斜杠對 @
進行轉義,"fred@example.com"
將會變成 fred.com
。有關此處歷史的更多細節,請參閱 http://perl.plover.com/at-error.html。
AUTOLOAD 現在是可賦值的,這意味著您可以將 :lvalue 屬性添加到 AUTOLOAD 子例程中,並且可以將值賦給 AUTOLOAD 返回值。
$Config{byteorder}(以及 config.h 中的對應 BYTEORDER)在平台上先前錯誤,如果 sizeof(long) 為 4,但 sizeof(IV) 為 8。 byteorder 只有 sizeof(long) 個字節長(1234 或 4321),但現在它正確為 sizeof(IV) 個字節長(12345678 或 87654321)。 (此問題不影響 Windows 平台。)
此外,$Config{byteorder} 現在是動態計算的--這對於具有“胖二進制文件”的情況更加健壯,其中可執行映像包含多個二進制平台的二進制文件,以及跨平台編譯時更加健壯。
perl -d:Module=arg,arg,arg
現在可用(以前無法傳遞多個參數)。
do
後面跟著一個裸字現在確保這個裸字不是一個關鍵字(以避免一個錯誤,其中 do q(foo.pl)
嘗試呼叫一個名為 q
的子程式)。這意味著例如不再能寫成 do format()
,而必須寫成 do &format()
。
內建函式 dump() 現在給予一個可選的警告 dump() better written as CORE::dump()
,這意味著預設情況下 dump(...)
被解析為內建函式 dump(),該函式將核心內容轉儲並中止,而不是(可能是)使用者定義的 sub dump
。要呼叫後者,請將呼叫修飾為 &dump(...)
。(整個 dump() 功能被視為已棄用,並且可能在未來版本中被刪除/更改。)
chomp() 和 chop() 現在可以被覆寫。然而,請注意,它們的原型(由 prototype("CORE::chomp")
給出)是未定義的,因為它無法被表達,因此無法真正寫出替代品來覆蓋這些內建函式。
即使您在 BEGIN 塊中退出/中止,END 塊現在仍然會運行。內部地,END 塊的執行現在由 PL_exit_flags & PERL_EXIT_DESTRUCT_END 控制。這使得 Perl 嵌入者可以使用新的行為。這將在 5.10 中成為默認。請參閱 perlembed。)
格式現在支持零填充十進制字段。
雖然「你不應該這樣做」,但可以寫出依賴於 Perl 的雜湊鍵順序的程式碼(Data::Dumper 就是這樣做的)。新的算法「One-at-a-Time」產生了不同的雜湊鍵順序。更多詳情請參閱 "Performance Enhancements"。
lstat(FILEHANDLE) 現在會產生警告,因為這個操作毫無意義。在未來的版本中,這可能變成致命錯誤。
在某些情況下,當 glob() 導致首次加載 File::Glob 時,將修復生成的偽語法錯誤。[561]
Lvalue 子程式現在可以在列表上下文中返回 undef
。然而,lvalue 子程式功能仍然是實驗性的。[561+]
一個遺失的警告 "Can't declare ... dereference in my" 已經恢復(Perl 早期有這個警告,但在後來的版本中遺失了。)
引入了一個新的特殊正則表達式變數:$^N
,它包含最近關閉的組(子匹配)。
no Module;
即使 Module 沒有 unimport() 方法,也不會產生錯誤。這與 use
相關聯的行為相對應,對於 import
。[561]
數值比較運算子在其中一個操作數為 NaN 時,會返回 undef
。之前的行為是未指定的。
our
現在可以有一個實驗性可選屬性 unique
,影響全域變數在多個解譯器之間的共享,詳見 perlfunc 中的 "our"。
以下內建函數現在可以被覆寫:each()、keys()、pop()、push()、shift()、splice()、unshift()。[561]
pack() / unpack()
現在可以使用 ()
來分組模板字母,然後對這些組應用重複/計數修飾符。
pack() / unpack()
現在可以處理 Perl 內部的數值類型:IV、UV、NV,還有如果平台支援的話,長浮點數。模板字母包括 j
、J
、F
和 D
。
pack('U0a*', ...)
現在可以用於將一個字符串強制轉換為 UTF-8。
現在可以使用 my __PACKAGE__ $obj。[561]
POSIX::sleep() 現在返回 POSIX 標準中所說的未休眠秒數,而不是 CORE::sleep() 返回的休眠秒數。
printf() 和 sprintf() 現在支援使用 %\d+\$
和 *\d+\$
語法進行參數重新排序。例如
printf "%2\$s %1\$s\n", "foo", "bar";
將打印出 "bar foo\n"。此功能有助於編寫國際化軟件,以及當參數的順序可能變化時。
(\&) 原型現在可以正常工作。[561]
現在可以使用 prototype(\[$@%&]) 隱式創建引用(例如,如果您想模擬 tie() 接口)。
一個新的命令行選項,-t
,現在可用。這是 -T
的小弟:不會在污染違規時終止,而是給出語義警告。 這只是一個臨時的調試輔助工具,用於保護舊的遺留應用代碼。這不是 -T 的替代品。
在其他污染新聞中,exec LIST
和 system LIST
現在被認為太危險(想想 exec @ARGV
:它可以以任何參數啟動任何程序),現在這些形式會在語義警告下引發警告。您應該仔細地清理參數以確保其有效性。在 Perl 的未來版本中,這些形式將變為致命錯誤,所以現在考慮開始清理。
現在要求綁定哈希接口必須具有 EXISTS 和 DELETE 方法(可以是自己的或繼承的)。
如果 tr/// 只是計算字符,它不會嘗試修改其目標。
如果存在,untie() 現在將調用 UNTIE() 鉤子。詳見 perltie。[561]
perlfunc 中的 "utime" 現在支援 utime undef, undef, @files
來將文件時間戳更改為當前時間。
允許在數值常量中使用底線(下劃線)的規則已經放寬和簡化:現在您可以在數字之間簡單地有一個底線。
現在,盡量不要依賴於 C 的 argv[0](可能不包含完整的路徑名),而是通過向操作系統查詢來設置 $^X。 (例如,在 Linux 上讀取 /proc/self/exe,在 FreeBSD 上讀取 /proc/curproc/file)
一個新的變量,${^TAINT}
,表示是否啟用了污染模式。
您現在可以覆蓋 readline() 內建函數,這也會覆蓋 <FILEHANDLE> 角括號運算符。
現在,在 shebang (#!) 行上也可以識別命令行選項 -s 和 -F。
在不附帶 /g 修飾符的情況下使用 /c 匹配修飾符會引發新的警告: Use of /c modifier is meaningless without /g
。
即使在替換中使用 /g,使用 /c 也會引發 Use of /c modifier is meaningless in s///
。
在 split 中使用 /g 會引發 Use of /g modifier is meaningless in split
。
添加了對 CLONE 特殊子程序的支持。使用 ithreads 時,當創建新線程時,所有 Perl 數據都會被克隆,但非 Perl 數據無法自動克隆。在 CLONE 中,您可以做您需要做的任何事情,比如處理非 Perl 數據的克隆,如果需要的話。CLONE 將為每個定義或繼承它的包執行一次。它將在新線程的上下文中調用,因此所有修改都是在新區域中進行的。
請參閱 perlmod
Attribute::Handlers
,最初由 Damian Conway 開發,現在由 Arthur Bergman 維護,允許類定義屬性處理程序。
package MyPack;
use Attribute::Handlers;
sub Wolf :ATTR(SCALAR) { print "howl!\n" }
# later, in some package using or inheriting from MyPack...
my MyPack $Fluffy : Wolf; # the attribute handler Wolf will be called
變量和例程都可以有屬性處理程序。處理程序可以特定於類型(SCALAR、ARRAY、HASH 或 CODE),也可以特定於精確的編譯階段(BEGIN、CHECK、INIT 或 END)。請參閱 Attribute::Handlers。
B::Concise
,由 Stephen McCamant 開發,是一個新的編譯器後端,用於遍歷 Perl 語法樹,打印有關 ops 的簡潔信息。輸出是高度可自定義的。請參閱 B::Concise。[561+]
新的 bignum、bigint 和 bigrat pragma,由 Tels 開發,實現了透明的大數支持(使用 Math::BigInt、Math::BigFloat 和 Math::BigRat 背後端)。
Class::ISA
,由 Sean Burke 開發,是一個報告類的 ISA 樹搜索路徑的模組。請參閱 Class::ISA。
Cwd
現在具有分裂性格:如果可能,將使用 XS 擴展(這將希望更快、更安全、更健壯),但如果不可能,將使用熟悉的 Perl 實現。
Devel::PPPort
,最初由 Kenneth Albanowski 開發,現在由 Paul Marquess 維護,已添加。它主要由 h2xs
使用,以增強在不同版本的 Perl 之間移植 XS 模組的可移植性。請參閱 Devel::PPPort。
Digest
是用於計算摘要(校驗和)的前端模塊,由Gisle Aas添加。請參閱Digest。
Digest::MD5
用於計算MD5摘要(校驗和),其定義在RFC 1321中,由Gisle Aas添加。請參閱Digest::MD5。
use Digest::MD5 'md5_hex';
$digest = md5_hex("Thirsty Camel");
print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
注意:故意不包括MD5
的向後兼容模塊,因為不鼓勵進一步使用。
Encode
原始由Nick Ing-Simmons製作,現由Dan Kogai維護,提供了一種在不同字符編碼之間進行轉換的機制。支持Unicode、ISO-8859-1和ASCII編碼被編譯到該模塊中。還包括幾種其他編碼(如ISO-8859的其他部分、CP*/Win*、Mac、KOI8-R、三種EBCDIC變體、中文、日文和韓文編碼),可以在運行時加載。(出於空間考慮,最大的中文編碼已經被分離成了它們自己的CPAN模塊,Encode::HanExtra,如果可用,Encode將使用它)。請參閱Encode。
如果使用PerlIO,Encode模塊支持的任何編碼也可用於“:encoding()”層。
Hash::Util
是新的受限哈希功能的接口。(由Jeffrey Friedl、Nick Ing-Simmons和Michael Schwern實現)。請參閱Hash::Util。
I18N::Langinfo
可用於查詢區域信息。請參閱I18N::Langinfo。
I18N::LangTags
由Sean Burke製作,具有處理RFC3066風格語言標籤的功能。請參閱I18N::LangTags。
ExtUtils::Constant
由Nicholas Clark製作,是用於生成導入C頭文件常量的XS代碼的新工具,用於擴展寫作。請參閱ExtUtils::Constant。
Filter::Simple
由Damian Conway製作,是Filter::Util::Call的易於使用的前端。請參閱Filter::Simple。
# in MyFilter.pm:
package MyFilter;
use Filter::Simple sub {
while (my ($from, $to) = splice @_, 0, 2) {
s/$from/$to/g;
}
};
1;
# in user's code:
use MyFilter qr/red/ => 'green';
print "red\n"; # this code is filtered, will print "green\n"
print "bored\n"; # this code is filtered, will print "bogreen\n"
no MyFilter;
print "red\n"; # this code is not filtered, will print "red\n"
File::Temp
由Tim Jenness製作,允許輕鬆、可移植且安全地創建臨時文件和目錄。請參閱File::Temp。[561+]
Filter::Util::Call
由Paul Marquess製作,為您提供在Perl中編寫源過濾器的框架。對於大多數用途,建議使用前端Filter::Simple。請參閱Filter::Util::Call。
if
由Ilya Zakharevich製作,是一個用於條件性包含模塊的新指示。
libnet 由Graham Barr製作,是與網絡編程相關的perl5模塊集合。請參閱Net::FTP、Net::NNTP、Net::Ping(不是libnet的一部分,但相關)、Net::POP3、Net::SMTP和Net::Time。
Perl安裝時未配置libnet;請使用libnetcfg來配置它。
List::Util
由Graham Barr提供,是一組通用的列表子程序,例如sum()、min()、first()和shuffle()。請參閱List::Util。
Locale::Constants
、Locale::Country
、Locale::Currency
、Locale::Language
和Locale::Script由Neil Bowers添加。它們提供各種地區標準的代碼,例如法國的「fr」、美元的「usd」和日本的「ja」。
use Locale::Country;
$country = code2country('jp'); # $country gets 'Japan'
$code = country2code('Norway'); # $code gets 'no'
請參閱Locale::Constants、Locale::Country、Locale::Currency和Locale::Language。
Locale::Maketext
由Sean Burke提供,是一個本地化框架。請參閱Locale::Maketext和Locale::Maketext::TPJ13。後者是一篇關於軟件本地化的文章,最初發表於《The Perl Journal》第13期,並經授權在此處重新發表。
Math::BigRat
是用於大有理數的,配合Tels提供的Math::BigInt和Math::BigFloat使用。請參閱Math::BigRat。
Memoize
可以通過以空間換取時間來加速您的函數,由Mark-Jason Dominus提供。請參閱Memoize。
MIME::Base64
由Gisle Aas提供,允許您將數據編碼為base64,如RFC 2045中所定義的——MIME(多用途互聯網郵件擴展)。
use MIME::Base64;
$encoded = encode_base64('Aladdin:open sesame');
$decoded = decode_base64($encoded);
print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
請參閱MIME::Base64。
MIME::QuotedPrint
由Gisle Aas提供,允許您將數據編碼為引用可打印編碼,如RFC 2045中所定義的——MIME(多用途互聯網郵件擴展)。
use MIME::QuotedPrint;
$encoded = encode_qp("\xDE\xAD\xBE\xEF");
$decoded = decode_qp($encoded);
print $encoded, "\n"; # "=DE=AD=BE=EF\n"
print $decoded, "\n"; # "\xDE\xAD\xBE\xEF\n"
NEXT
由Damian Conway提供,是一個用於方法重定向的虛擬類別。請參閱NEXT。
open
是一個用於設置open()的默認I/O層的新的語法。
PerlIO::scalar
由Nick Ing-Simmons提供,提供了對「內存」Perl純量的IO實現,如上所述。它還作為可加載的PerlIO層的示例。其他未來的可能性包括PerlIO::Array和PerlIO::Code。請參閱PerlIO::scalar。
PerlIO::via
由Nick Ing-Simmons提供,作為PerlIO層,包裹了由類(通常在Perl代碼中實現)提供的PerlIO層功能。
PerlIO::via::QuotedPrint
由Elizabeth Mattijsen提供,是PerlIO::via
類的示例。
use PerlIO::via::QuotedPrint;
open($fh,">:via(QuotedPrint)",$path);
這將自動將所有輸出轉換為 $fh
為 Quoted-Printable。參見 PerlIO::via 和 PerlIO::via::QuotedPrint。
Pod::ParseLink
,由 Russ Allbery 編寫,已新增,用於解析 pods 中描述的 L<> 鏈接,如新的 perlpodspec 所述。
Pod::Text::Overstrike
,由 Joe Smith 編寫,已新增。它將 POD 數據轉換為格式化的刪除線文本。參見 Pod::Text::Overstrike。 [561+]
Scalar::Util
是一組通用的標量子例程,例如 blessed()、reftype() 和 tainted()。參見 Scalar::Util。
sort
是一個新的 pragma,用於控制 sort() 的行為。
Storable
通過允許將 Perl 數據存儲到文件中並從中檢索以及以快速而緊湊的二進制格式存儲 Perl 數據結構,為 Perl 數據結構提供持久性。由於 Storable 實際上對 Perl 數據結構進行序列化,因此您還可以克隆深層次的層次化數據結構。Storable 最初由 Raphael Manfredi 創建,但現在由 Abhijit Menon-Sen 維護。Storable 已經增強瞭對兩個新哈希功能,Unicode 鍵和受限哈希的理解。參見 Storable。
Switch
,由 Damian Conway 編寫,已新增。只需說
use Switch;
您就可以在 Perl 中使用 switch
和 case
。
use Switch;
switch ($val) {
case 1 { print "number 1" }
case "a" { print "string a" }
case [1..10,42] { print "number in list" }
case (@array) { print "number in list" }
case /\w+/ { print "pattern" }
case qr/\w+/ { print "pattern" }
case (%hash) { print "entry in hash" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
參見 Switch。
Test::More
,由 Michael Schwern 編寫,是另一個用於編寫測試腳本的框架,比 Test::Simple 更廣泛。參見 Test::More。
Test::Simple
,由 Michael Schwern 編寫,提供了編寫測試的基本工具。參見 Test::Simple。
Text::Balanced
,由 Damian Conway 編寫,已新增,用於從字符串中提取定界文本序列。
use Text::Balanced 'extract_delimited';
($a, $b) = extract_delimited("'never say never', he never said", "'", '');
$a 將是 "'never say never'",$b 將是 ',他從未說過'。
除了 extract_delimited() 之外,還有 extract_bracketed()、extract_quotelike()、extract_codeblock()、extract_variable()、extract_tagged()、extract_multiple()、gen_delimited_pat() 和 gen_extract_tagged()。有了這些,您可以實現相當先進的解析算法。參見 Text::Balanced。
threads
,由 Arthur Bergman 編寫,是一個與解釋器線程的接口。解釋器線程 (ithreads) 是 Perl 5.6 中引入的新線程模型,但僅作為擴展寫入者 (以及用於 Win32 Perl 的 fork()
模擬) 的內部接口。參見 threads、threads::shared 和 perlthrtut。
threads::shared
,由Arthur Bergman提供,允許解譯器執行緒共享數據。參見threads::shared。
Tie::File
,由Mark-Jason Dominus提供,將Perl數組與文件的行關聯起來。參見Tie::File。
Tie::Memoize
,由Ilya Zakharevich提供,提供按需加載的哈希表。參見Tie::Memoize。
Tie::RefHash::Nestable
,由Edward Avis提供,允許存儲哈希引用(與標準的Tie::RefHash不同)。該模塊包含在Tie::RefHash中。參見Tie::RefHash。
Time::HiRes
,由Douglas E. Wegscheid提供,提供高分辨率計時(ualarm、usleep和gettimeofday)。參見Time::HiRes。
Unicode::UCD
提供了一個查詢Unicode字符數據庫的接口。參見Unicode::UCD。
Unicode::Collate
,由SADAHIRO Tomoyuki提供,實現了Unicode字符串的排序UCA(Unicode Collation Algorithm)。參見Unicode::Collate。
Unicode::Normalize
,由SADAHIRO Tomoyuki提供,實現了各種Unicode正規化形式。參見Unicode::Normalize。
XS::APItest
,由Tim Jenness提供,是一個測試擴展,用於練習XS API。目前僅測試printf()
:如何從XS輸出各種基本數據類型。
XS::Typemap
,由Tim Jenness提供,是一個測試擴展,用於練習XS類型映射。沒有安裝任何內容,但是該代碼值得擴展程序作者研究。
以下獨立支持的模塊已更新到CPAN的最新版本:CGI、CPAN、DB_File、File::Spec、File::Temp、Getopt::Long、Math::BigFloat、Math::BigInt、podlators捆綁包(Pod::Man、Pod::Text)、Pod::LaTeX [561+]、Pod::Parser、Storable、Term::ANSIColor、Test、Text-Tabs+Wrap。
attributes::reftype()現在可以在綁定的參數上工作。
現在可以使用no AutoLoader;
來禁用AutoLoader。
B::Deparse已由Robin Houston大幅增強。現在它可以反編譯幾乎所有標準測試套件(以便測試仍然成功)。有一個名為"test.deparse"的make目標,可以嘗試這個功能。
Carp現在有更好的接口文檔,並且添加了@CARP_NOT接口,以便單獨控制錯誤報告的位置,而與@ISA無關,由Ben Tilly提供。
Class::Struct 現在可以在編譯時定義類別。
如果調用訪問器時帶有陣列/雜湊元素作為唯一參數,Class::Struct 現在會分配該陣列/雜湊元素。
Cwd::fastcwd() 的返回值現在是污染的。
Data::Dumper 現在有一個選項可以對雜湊進行排序。
Data::Dumper 現在有一個選項可以使用 B::Deparse 輸出代碼引用。
DB_File 現在支持更新的 Berkeley DB 版本,還有其他改進。
Devel::Peek 現在具有 Perl 內存統計信息的接口(僅當您使用 perl 的 malloc,且已啟用調試時才有效)。
English 模組現在可以在不使用惡名昭彰的性能衝擊的情況下使用
use English '-no_match_vars';
(當然,假設您不需要有問題的變量$`
、$&
或 $'
。)還引入了 @LAST_MATCH_START
和 @LAST_MATCH_END
English 別名,對應於 @-
和 @+
。
ExtUtils::MakeMaker 已經得到了顯著的清理和修復。增強版也已經被回溯到較早的 Perl 版本並提交到 CPAN,以便較早的版本可以享受到這些修復。
在 Makefile.PL 中的 WriteMakefile() 的參數現在比以前更仔細地檢查其合理性。這可能導致在安裝模組時出現新的警告。有關詳細信息,請參見 ExtUtils::MakeMaker。
ExtUtils::MakeMaker 現在內部使用 File::Spec,這希望能夠提高可移植性。
Fcntl、Socket 和 Sys::Syslog 已被 Nicholas Clark 重寫為使用新風格的常量分發部分(請參見 ExtUtils::Constant)。這意味著它們將更加健壯,並希望更快。
File::Find 現在在跟隨符號連結時正確使用 chdir()。[561]
File::Find 現在具有預處理和後處理回調。當回調(淘氣地)以 "next;" 而不是 "return;" 結束時,它現在可以正常工作。
File::Find 現在(再次)是可重入的。它也已經更具可移植性。
File::Find 發出的警告現在屬於它們自己的類別。您可以使用 use/no warnings 'File::Find';
啟用/禁用它們。
File::Glob::glob() 現在更名為 File::Glob::bsd_glob(),因為該名稱與內置的 glob() 衝突。舊名稱仍然可用於兼容性,但已被棄用。[561]
File::Glob 現在支持 GLOB_LIMIT
常量來限制返回的文件名列表的大小。
IPC::Open3 現在允許使用數字文件描述符。
IO::Socket現在具有atmark()方法,如果套接字位於帶外標記處,則返回true。該方法也可以導出為sockatmark()函數。
如果服務名稱未知,則IO::Socket::INET將無法打開指定的端口。現在,它將正確使用提供的端口號。[561]
如果您的平台支持,IO::Socket::INET現在支持ReusePort選項。Reuse選項現在具有別名ReuseAddr。為了清晰起見,您可能想要首選ReuseAddr。
IO::Socket::INET現在支持LocalPort的零值(通常意味著操作系統會創建一個)。
'use lib'現在與@INC的作用相同。使用'no lib'移除目錄現在也可以正常工作。
Math::BigFloat和Math::BigInt已由Tels進行了全面重寫。它們現在速度更快,並支持各種bignum庫,如GMP和PARI作為它們的後端。
Math::Complex更好地處理inf、NaN等。
Rob Brown大大增強了Net::Ping:現在支持多宿主,Win32功能更好,現在有時間測量功能(可選地使用Time::HiRes進行高分辨率),還有一個“外部”協議,它使用Net::Ping::External模組運行外部ping實用程序並解析輸出。 CPAN中提供了Net::Ping::External的版本。
請注意,當在Perl發行版下運行時,某些Net::Ping測試會被禁用,因為不能假設以下一種或多種情況:本地主機上啟用了echo端口、完整的Internet連接性或支持的防火牆。在運行Perl測試套件之前,您可以將環境變量PERL_TEST_Net_Ping設置為“1”(一)以啟用所有Net::Ping測試。
POSIX::sigaction()現在更加靈活和健壯。現在可以安裝coderef處理程序,“DEFAULT”和“IGNORE”處理程序,安裝新處理程序不是原子操作。
在Safe中,現在將%INC本地化在Safe隔間中,以便use/require正常工作。
在DOSish平台上的SDBM_File中,由於不支持具有“空洞”的文件,某些鍵會丟失。已添加了解決問題的解決方法。
在Search::Dict中,現在可以為正在搜索的行添加預處理鉤子。
Shell 模組現在具有 OO 介面。
在 Sys::Syslog 中現在有故障切換機制,將通過替代連接機制直到成功記錄訊息。
測試模組已顯著增強。
Time::Local::timelocal() 現在不再處理小數秒。理由是 localtime() 也不處理小數秒,而 timelocal() 和 localtime() 應該是彼此的反函數。
vars pragma 現在支援聲明完全合格的變數。(our() 不支援,也不會支援。)
utf8:: 命名空間(pragma 中)提供各種 Perl 可調用函數,以提供對 Perl 內部 Unicode 表示的低層級訪問。目前只實現了 length()。
Emacs perl mode (emacs/cperl-mode.el) 已更新至版本 4.31。
emacs/e2ctags.pl 現在快得多。
enc2xs 是一個用於將自己的編碼添加到 Encode 模組的工具。
h2ph 現在支援 C 三元符。
h2xs 現在產生模板 README。
h2xs 現在使用 Devel::PPPort 提高在不同版本 Perl 之間的可移植性。
h2xs 使用新的 ExtUtils::Constant 模組,這將影響定義常數的新創建擴展。由於新代碼更正確(如果你有兩個常數,第一個是第二個的前綴,第一個常數永遠不會被定義)、較少損失(它對整數常數使用整數,而不像舊代碼那樣對整數常數使用浮點數)、並且稍微更快,您可能希望考慮重新生成您的擴展代碼(新方案使重新生成易於進行)。h2xs 現在也支援 C 三元符。
已新增 libnetcfg 以配置 libnet。
perlbug 現在更加穩健。它還將 bug 報告發送到 perl.org,而不是 perl.com。
perlcc 已經重寫,其使用者界面(即命令行)更像 Unix C 編譯器 cc。 (perlbc 工具已被移除。請使用 perlcc -B 代替。)請注意,perlcc 仍被認為是非常實驗性和不受支援的。 [561]
perlivp 是一個新的安裝驗證程序實用程序,用於在安裝 Perl 後的任何時間運行。
piconv 是字符轉換實用程序 iconv 的實現,演示了新的 Encode 模組。
pod2html
現在允許指定緩存目錄。
pod2html
現在產生XHTML 1.0。
pod2html
現在能夠理解使用不同換行符寫的POD(PC類型的CRLF與Unix類型的LF與MacClassic類型的CR)。
s2p
已完全重寫為Perl。(實際上是Perl中sed的完整實現:您可以使用psed
實用程序使用sed功能。)
xsubpp
現在能夠理解嵌入在*.xs文件中的POD文檔。[561]
xsubpp
現在支持OUT關鍵字。
perl56delta詳細介紹了5.005版本和5.6.0版本之間的變更。
perlclib文檔記錄了標準C庫函數的內部替代品。(僅對擴展編寫者和Perl核心開發者有興趣。)[561+]
perldebtut是一個Perl調試教程。[561+]
perlebcdic包含在EBCDIC平台上運行Perl的考慮事項。[561+]
perlintro是Perl的初級介紹。
perliol記錄了具有層次的PerlIO的內部結構。
perlmodstyle是撰寫模塊的風格指南。
perlnewmod介紹了撰寫和提交新模塊的方法。[561+]
perlpacktut是pack()教程。
perlpod已重寫為更清晰且記錄了多年來收集的最佳實踐。
perlpodspec是pod格式的更正式規範,主要對pod應用程序的作者有興趣,而不是對使用pod的人有興趣。
perlretut是正則表達式教程。[561+]
perlrequick是正則表達式快速入門指南。是的,比perlretut快得多。[561]
perltodo已更新。
perltootc已更名為perltooc(以免與在“8.3”名稱限制的文件系統中的perltoot衝突)。
perluniintro是使用Unicode的介紹Perl。(perlunicode更多是詳細的參考和背景信息)
perlutil解釋了與Perl分發套件一起打包的命令行實用程序。[561+]
在安裝前可在README.platform中獲取以下特定平台的文檔,在安裝後可在perlplatform中獲取。
perlaix perlamiga perlapollo perlbeos perlbs2000
perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux
perlhurd perlirix perlmachten perlmacos perlmint perlmpeix
perlnetware perlos2 perlos390 perlplan9 perlqnx perlsolaris
perltru64 perluts perlvmesa perlvms perlvos perlwin32
這些文檔通常詳細說明了在該平台上配置、構建、測試、安裝,有時也使用Perl的一個或多個主題。
現在歡迎東亞的 Perl 使用者使用他們自己的語言:README.jp(日文)、README.ko(韓文)、README.cn(簡體中文)和 README.tw(繁體中文),這些文件是使用正常的 pod 編寫,但編碼方式分別為 EUC-JP、EUC-KR、EUC-CN 和 Big5。這些文件將被安裝為
perljp perlko perlcn perltw
POSIX-BC 平台的文檔稱為 "BS2000",以避免與 Perl POSIX 模組混淆。
WinCE 平台的文檔稱為 perlce(在源代碼套件中為 README.ce),以避免與 8.3 限制文件系統上的 perlwin32 文檔混淆。
當 map() 生成的結果列表大於源列表時,map() 可能會變得極其緩慢。對於常見情況,性能已經得到了改善。 [561]
sort() 也完全可重入,也就是說 sort 函數本身可以調用 sort()。這在以前的版本中無法可靠工作。 [561]
sort() 的內部實現已經從早期的 quicksort 主要改為使用 mergesort。對於非常小的列表,這可能導致排序時間稍微變慢,但一般來說,加速比應該至少為 20%。額外的好處是 sort() 的最壞情況行為現在更好了(從計算機科學的角度來看,它現在以 O(N log N) 的時間運行,而不是 quicksort 的 Theta(N**2) 最壞情況運行時間行為),並且 sort() 現在是穩定的(這意味著具有相同鍵的元素將保持排序前的順序)。參見 sort
pragma 獲取信息。
更詳細的故事是:假設您想要自己服務一小片 π。
@digits = ( 3,1,4,1,5,9 );
對數字進行排序將產生(1,1,3,4,5,9),如預期。哪個 1
先出現很難知道,因為一個 1
看起來幾乎和其他任何一個一樣。您可以把這看作是完全微不足道的,或者有些深奧。但是,如果您只是想將偶數位數排在奇數位數之前,那麼會發生什麼
sort { ($a % 2) <=> ($b % 2) } @digits;
yield? The only even digit, 4
, will come first. But how about the odd numbers, which all compare equal? With the quicksort algorithm used to implement Perl 5.6 and earlier, the order of ties is left up to the sort. So, as you add more and more digits of Pi, the order in which the sorted even and odd digits appear will change. and, for sufficiently large slices of Pi, the quicksort algorithm in Perl 5.8 won't return the same results even if reinvoked with the same input. The justification for this rests with quicksort's worst case behavior. If you run
sort { $a <=> $b } ( 1 .. $N , 1 .. $N );
(something you might approximate if you wanted to merge two sorted arrays using sort), doubling $N doesn't just double the quicksort time, it quadruples it. Quicksort has a worst case run time that can grow like N**2, so-called quadratic behaviour, and it can happen on patterns that may well arise in normal use. You won't notice this for small arrays, but you will notice it with larger arrays, and you may not live long enough for the sort to complete on arrays of a million elements. So the 5.8 quicksort scrambles large arrays before sorting them, as a statistical defence against quadratic behaviour. But that means if you sort the same large array twice, ties may be broken in different ways.
Because of the unpredictability of tie-breaking order, and the quadratic worst-case behaviour, quicksort was almost replaced completely with a stable mergesort. Stable means that ties are broken to preserve the original order of appearance in the input array. So
sort { ($a % 2) <=> ($b % 2) } (3,1,4,1,5,9);
會產生(4,3,1,1,5,9)的結果,保證了偶數和奇數出現的順序與輸入相同。合併排序在最壞情況下的行為為 O(N log N),是可以達到的最佳值。具有諷刺意味的是,這種合併排序在快速排序變成二次方的情況下表現特別好:在 O(N) 時間內將 (1..$N, 1..$N) 排序完成。但是在某些輸入和平台上,快速排序比合併排序更快,因此在最後一刻挽救了快速排序。例如,如果你真的不在乎偶數和奇數數字的順序,快速排序將在 O(N) 時間內運行;它非常擅長對少量不同元素的多次重複進行排序。快速排序的分治策略在具有相對較小、非常快速的高速緩存的平台上效果很好。最終,問題被縮小到適合緩存的範圍,從而從增加的內存速度中受益。
通過實施排序 pragma 來拯救了快速排序,以控制排序的各個方面。 穩定 子 pragma 強制穩定行為,不管算法如何。 _quicksort 和 _mergesort 子 pragma 是選擇底層實現的笨拙方法。前導的 _
是提醒,這些子 pragma 可能在 5.8 之後不再存在。存在更適合選擇實現的機制,但它們來不及挽救快速排序。
哈希現在使用 Bob Jenkins 的 "One-at-a-Time" 哈希鍵算法(http://burtleburtle.net/bob/hash/doobs.html)。該算法在產生更好的散列值的同時,速度還算合理(原始哈希算法由 Chris Torek 最初創建,後來由 Ilya Zakharevich 調整)。通過對所有 3 字符可打印 ASCII 鍵的哈希執行該算法所產生的哈希值,更接近通過 DIEHARD 隨機數生成測試。根據 perlbench,此更改對 Perl 的整體速度沒有影響。
unshift() 現在應該會明顯更快。
現在 INSTALL 解釋了如何在非 64 位平台上配置 Perl 以使用 64 位整數。
Policy.sh 政策更改:如果您正在重用 Policy.sh 文件(參見 INSTALL),並且使用 Configure -Dprefix=/foo/bar 和在舊的 Policy 中 $prefix eq $siteprefix 和 $prefix eq $vendorprefix,它們現在都將更改為新的前綴 /foo/bar。(之前只有 $prefix 更改。)如果您不喜歡這種新行為,請明確指定前綴、siteprefix 和 vendorprefix。
Perl庫的新選擇性位置otherlibdirs現在可用。例如,它可用於供應商附加組件,而不會干擾Perl自己的庫目錄。
在許多平台上,供應商提供的“cc”過於簡化,無法構建Perl(基本上,“cc”不支援ANSI C)。如果是這種情況,而“cc”又不是GNU C編譯器“gcc”,則會自動嘗試查找並使用“gcc”。
gcc需要緊密跟蹤操作系統的發布版本,以避免構建問題。如果Configure發現gcc是為與正在運行的不同操作系統版本構建的,則現在會清楚可見地發出警告,表明可能會有問題。
由於Perl 5.8與先前版本的Perl不兼容,因此Configure不再建議將5.005模塊包含在@INC中。
Configure -S
現在可以以非互動方式運行。[561]
由於過時,已刪除了Configure對pdp11-style內存模型的支持。[561]
configure.gnu現在支持具有空格的選項。
installperl現在將所有輸出都發送到STDERR。
由於PerlIO現在是大多數平台的默認值,因此“-perlio”不再附加到$Config{archname}(也稱為$^O)。相反,如果您明確選擇不使用perlio(Configure命令行選項-Uuseperlio),則將附加“-stdio”。
與架構名稱相關的另一個變更是,只有在指針寬度為64位時才附加“-64all”(-Duse64bitall,或“最大64位”)。 (確切地說,use64bitall將被忽略。)
在AFS安裝中,可以使用Configure參數-Dafsroot=/some/where/else
將AFS的根目錄配置到與默認值/afs不同的位置。
已記錄了一個較少知名的配置時間定義APPLLIB_EXP。它可用於將站點特定目錄添加到Perl的默認搜索路徑(@INC)的開頭;詳細信息請參見INSTALL。
在Perl(假定是DB_File擴展)構建時使用的Berkeley DB版本現在可以從Perl中作為@Config{qw(db_version_major db_version_minor db_version_patch)}
以及從C中作為DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG DB_VERSION_PATCH_CFG
獲取。
已在INSTALL中記錄了為DB、NDBM和ODB的兼容模式構建Berkeley DB3。
如果您有CPAN訪問權限(無論是網絡還是本地副本,例如CD-ROM),您可以在Configure中指定額外的模塊來構建和安裝Perl,使用-Dextras=...選項。有關詳細信息,請參見INSTALL。
除了 config.over 之外,現在還有一個新的覆寫文件 config.arch 可供使用。這個文件應該由提示文件編寫者用於整個架構的更改(與 config.over 相對應,後者用於整個網站的更改)。
如果您的文件系統支持符號鏈接,您可以在源目錄之外構建 Perl,方法如下:
mkdir perl/build/directory
cd perl/build/directory
sh /path/to/perl/source/Configure -Dmksymlinks ...
這將在 perl/build/directory 中創建一個符號鏈接樹,指向 /path/to/perl/source 中的文件。原始文件保持不變。在 Configure 完成後,您只需執行:
make all test
Perl 將在 perl/build/directory 中構建和測試,所有這些都在其中進行。[561]
對於 Perl 開發人員,添加了幾個用於分析和調試的新的 make 目標;請參見 perlhack。
已將如何構建最小 Perl 安裝的指南添加到 INSTALL 中。
Thread 擴展現在在 ithreads 下根本不構建(Configure -Duseithreads
),因為它無論如何都不會工作(Thread 擴展需要使用 -Duse5005threads
進行配置)。
請注意,不支援和已棄用 5.005 版本的線程:如果您有為舊線程編寫的代碼,應將其遷移到新的 ithreads 模型。
Perl 用於將浮點數轉換為字符串的 Gconvert 宏($Config{d_Gconvert})現在對於使用 sprintf %.*g 規則進行轉換更加嚴格。一些以前使用 gcvt 的平台現在可能會轉而使用速度較慢的 sprintf。
通過說明特殊(例如,調試)版本的 perl 的過時方法:
make LIBPERL=libperld.a
已被刪除。請改用 -DDEBUGGING。
要查看已知支持 Perl 的平台列表,請參見 "perlport" 中的 "Supported Platforms"。
現在應該更好地支持 AIX 的動態加載。
AIX 現在應該與 gcc、線程和 64 位元工作得更好。此外,AIX 中的 long doubles 支持現在應該更好。請參見 perlaix。
AtheOS(http://www.atheos.cx/)是一個新平台。
BeOS 已被重新收購。
現在DG/UX平台支援5.005風格的線程。請參閱perldgux。
在或接近osvers 4.5.2版本上支援DYNIX/ptx平台(也稱為dynixptx)。
EBDIC平台(z/OS(又稱OS/390)、POSIX-BC和VM/ESA)已經重新支援。許多測試套件測試仍然失敗,Unicode和EBDIC的共存情況尚未完全解決,但情況比Perl 5.6時好得多。請參閱perlos390、perlbs2000(POSIX-BC)以及perlvmesa獲取更多資訊。(備註:對於VM/ESA的支援在Perl v5.18.0中被移除。相關資訊位於README.vmesa)
使用-Duseithreads或-Duse5005threads構建perl現在在HP-UX 10.20下可行(以前僅在10.30或更高版本下可行)。您需要安裝一個線程庫套件。請參閱README.hpux。[561]
Mac OS Classic現在在主流源代碼包中受到支援(當然自perl 5.004以來MacPerl一直可用,但現在標準Perl和MacPerl的源代碼基礎已同步)[561]
Mac OS X(或Darwin)現在即使在HFS+文件系統上也應該能夠構建Perl。(以前的不區分大小寫會使Perl構建過程混淆。)
現在支援NCR MP-RAS。[561]
所有NetBSD特定的補丁(除了特定於安裝的補丁)都已合併回主要發行版。
Novell的NetWare現在受到支援。請參閱perlnetware。
現在支援NonStop-UX。[561]
現在支援NEC SUPER-UX。
所有OpenBSD特定的補丁(除了特定於安裝的補丁)都已合併回主要發行版。
Perl已經與GNU pth用戶級線程包(https://gnu.dev.org.tw/software/pth/pth.html)進行過測試。現在Perl的所有線程測試都能正常工作,但需要在測試中添加一些yield(),因此,儘管pth(和其他用戶級線程實現)可以被認為與Perl ithreads“工作”,但請記住底層線程實現的可能非抢占性。
現在使用Perl的原生構建方法(Configure)支援Stratus VOS。這是在VOS上構建Perl的推薦方法。舊的方法仍然可用,這些方法構建miniperl。請參閱perlvos。[561+]
現在支援Amdahl UTS Unix主機平台。[561]
WinCE 現在受支持。參見 perlce。
z/OS(以前稱為 OS/390,以前稱為 MVS OE)現在支持動態加載。但默認情況下未選擇此功能,您必須在 Configure 的參數中指定 -Dusedl。[561]
已經解決了許多內存泄漏和未初始化的內存訪問問題。最重要的是,匿名子例程以前會泄漏大量內存。[561]
autouse 命令在 Multi::Part::Function::Names 中無法正常工作。
在某些情況下,caller() 可能會導致核心轉儲。Carp 有時會受到此問題的影響。特別是,caller() 現在對於從符號表中刪除的子例程會返回(unknown)
作為子例程名稱。
在列表上下文中,chop(@list) 返回的字符以相反的順序切割。這已被調整為正確的順序。[561]
在構建 Perl 二進制文件時,Configure 不再包括 DBM 库(dbm、gdbm、db、ndbm)。唯一的例外是需要它們的 SunOS 4.x。[561]
非十進制但是數字字符串常量(如 "0x23")的行為是依賴平台的:在一些平台上,這被視為 35,在一些平台上視為 0,在一些平台上視為浮點數(不要問)。這是由 Perl 在使用操作系統庫的情況下導致字符串轉換為數字的結果未定義所致:現在 Perl 在數值上下文中一致將這樣的字符串處理為零。
幾個調試器修復:退出碼現在反映了腳本的退出碼,條件"0"
現在正確處理,d
命令現在檢查行號,$.
不再被破壞,並且如果 RemotePort 被設置,所有調試器輸出現在正確地發送到套接字。[561]
調試器(perl5db.pl)已被修改以通過(CommandSet=580)提供更一致的命令接口。 perl5db.t 也已添加以測試這些更改,並作為進一步測試的占位符。
參見 perldebug。
調試器現在具有新的 dumpDepth
選項,用於控制嵌套結構被轉儲的最大深度。 x
命令已擴展,以便 x N EXPR
將 EXPR 的值轉儲到最多 N 層的深度。
如果安裝了 CPAN 模組 PadWalker,調試器現在可以顯示語法變量。
破壞順序現在更加可預測。
Perl 5.6.0 在將擴展靜態構建到 perl 時可能會發出關於重新定義 dl_error() 的虛假警告。這已得到更正。[561]
dprofpp -R 不起作用。
*foo{FORMAT}
現在可用。
無窮大現在被識別為數字。
UNIVERSAL::isa 不再錯誤地緩存方法。(這導致了 5.6.0 中的 Tk 擴展出現問題。)[561]
語法 I: 在 eval "" 外部的語法在 eval "" 內部的子程序定義中,如果它們在 eval""ed 代碼的頂層中尚未被引用,則不會正確解析。
語法 II: 在文件範圍洩漏到在語法之前聲明的子程序中的語法。
語法警告現在在範圍之間以及進入 eval "..."
正確傳遞。
use warnings qw(FATAL all)
未按預期工作。這已得到更正。[561]
warnings::enabled() 現在正確報告調用者是否使用語法警告的狀態。[561]
使用 eval 和 #line
的行重新編號現在可用。[561]
修復了許多內存泄漏問題,特別是在 eval "" 中。
本地化的 tied 變量不再泄漏內存
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Used to leak memory every time local() was called;
# in a loop, this added up.
local($tied_hash{Foo}) = 1;
本地化的哈希元素 (以及 %ENV) 正確取消本地化以不存在,如果它們在本地化之前不存在。
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Nothing has set the FOO element so far
{ local $tied_hash{FOO} = 'Bar' }
# This used to print, but not now.
print "exists!\n" if exists $tied_hash{FOO};
作為這個修復的副作用,tied 哈希接口 必須 定義 EXISTS 和 DELETE 方法。
mkdir() 現在忽略目錄名中的尾部斜杠,如 POSIX 所規定。
一些版本的 glibc 具有破損的 modfl()。這影響到使用 -Duselongdouble
構建的版本。此版本的 Perl 檢測到此破壞並對其進行了解決方法。已知 glibc 發布的 2.2.2 版本已修復了 modfl() 的錯誤。
無符號數字的模數現在有效 (4063328477 % 65535 以前返回 27406,而不是 27047)。[561]
消除了 5.6.0 中引入的一些 "非數字" 警告,以使其更與 5.005 兼容。無窮大現在被識別為數字。[561]
在某些情況下,數字轉換未正確識別字符串值的更改。[561]
屬性 (例如 :shared) 與 our() 不起作用。
our() 變量將不會引起虛假的 "變量不會保持共享" 警告。[561]
在兩個相鄰的區塊中聲明相同名稱的「我們」變數導致了關於變數「重新聲明」的虛假警告。問題已經修正。[561]
pack "Z"現在正確地以"\0"終止字符串。
修復了在某些影子密碼平台(例如HP-UX)中導致getpwent()返回每隔一個條目的密碼例程的問題。
對於傳遞Perl命令行參數的PERL5OPT環境變量,不再僅限於單個選項組。[561]
具有嵌入空格的PERL5OPT不再工作。
printf()不再將數字區域設置為「C」。
qw(a\\b)
現在正確解析為'a\\b'
:即三個字符,而不是四個。[561]
在早期版本中,pos()未在s///ge中返回正確值。這現在已正確處理。[561]
使用printf/sprintf打印四元(64位整數)現在無需q L ll前綴(假設您正在使用支持四元的平台)。
參考和重載標量上的正則表達式現在可以工作。[561+]
在許多情況下,右手邊魔法(GMAGIC)例如字符串串接可能被調用太多次。
scalar()現在即使在無效上下文中使用也強制標量上下文。
SOCKS支持現在更加穩健。
sort()參數現在在正確的wantarray上下文中編譯(它們意外地使用了sort()本身的上下文)。比較區塊現在在標量上下文中運行,並且要排序的參數始終以列表上下文提供。[561]
將POSIX字符類[[:space:]]
更改為包括(非常少用的)垂直制表符字符。添加了一個新的類POSIX字符類[[:blank:]]
,代表水平空白(當前,空格和制表符)。
sprintf()的污染行為已經合理化。它不再污染浮點格式的結果,使行為與字符串插值一致。[561]
已經修復了一些不一致的污染傳播案例(例如在哈希值內)。
Perl 5.6.0中找到的RE引擎意外地對某些類型的簡單模式匹配進行了悲觀化。這些現在處理得更好。[561]
正則表達式調試輸出(通過use re 'debug'
或通過-Dr
)現在看起來更好。[561]
像"a\nxb\n" =~ /(?!\A)x/m
這樣的多行匹配存在缺陷。錯誤已經修正。[561]
使用$&可能在某些情況下觸發核心轉儲。這現在已經避免。[561]
如果匹配失敗,正則表達式捕獲的子匹配($1、$2等)現在更一致地被取消設置,而不是在其中留下虛假數據。[561]
在以「吸入」模式打開的文件上的readline()在某些情況下可能會返回一個額外的""(空行)在末尾。已經修正了這個問題。[561]
特殊變量描述的符號引用的自動創建在${$num}
中意外地被禁用。這現在再次有效。[561]
Sys::Syslog忽略了LOG_AUTH
常量。
$AUTOLOAD、sort()、lock() 和同時在多個線程中生成子進程現在是線程安全的。
Tie::Array 的 SPLICE 方法已修復。
允許在非修改的 tr/// 的左手邊使用只讀字符串。
如果 STDERR 被綁定,由 warn 和 die 引起的警告現在會正確地傳遞給它。
幾個 Unicode 修正。
Perl 文件(腳本、模塊)開頭的 BOM(字節順序標記)現在應該會被透明地跳過。UTF-16 和 UCS-2 編碼的 Perl 文件現在應該會被正確地讀取。
字符表已更新為 Unicode 3.2.0。
與 utf8 數據比較不會自動將非 utf8 數據升級為 utf8。(例如,如果您將來自 I/O 和 Unicode 數據的數據混合在一起,這可能是一個問題:您的輸出可能已經被自動編碼為 UTF-8。)
生成非法的 Unicode 代碼點(例如 U+FFFE,或 UTF-16 替代字符)現在也會生成可選警告。
IsAlnum、IsAlpha 和 IsWord 現在匹配 titlecase。
使用 . 運算符連接或通過變量插值、eq、substr、reverse、quotemeta、x 運算符、s/// 替換、單引號 UTF-8,現在應該可以正常工作。
tr/// 運算符現在可以工作。請注意,tr///CU 功能已被刪除(但請參見 pack('U0', ...))。
eval "v200" 現在可以工作。
Perl 5.6.0 解析 m/\x{ab}/ 不正確,導致不必要的警告。這已經被修正。[561]
Unicode 類(例如 IsDigit)中缺少零項。
大的無符號數(超過 2**31 的數字)有時可能會失去其無符號性,在算術操作中導致虛假結果。[561]
Perl 解析器消耗隨機輸入和馬可夫鏈輸入進行了壓力測試,並修復了發現的幾個崩潰和死鎖。
BSDI 4.*
Perl 現在在 post-4.0 BSD/OSes 上運行。
所有 BSDs
現在設置 $0 已經可以工作(盡可能地;詳細請參見 perlvar)。
Cygwin
許多更新;目前與Cygwin 1.3.10同步。
先前的DYNIX/ptx在非阻塞I/O的Configure探針中存在問題。
EPOC
EPOC現在得到更好的支援。請參閱README.epoc。[561]
FreeBSD 3.*
Perl現在可以在3.0之後的FreeBSD上運作。
HP-UX
更新了README.hpux;Configure -Duse64bitall現在可用;現在使用HP-UX的malloc而不是Perl的malloc。
IRIX
許多編譯標誌和提示增強;不小心混合32位和64位庫(注定失敗的嘗試)變得更加困難。
Linux
長double現在應該可以工作(請參閱INSTALL)。[561]
在使用accept(),recvfrom()(在Perl中:recv()),getpeername()和getsockname()時,Linux以前存在與sockaddrlen相關的問題。
Mac OS Classic
如果您有Metrowerks開發環境和缺失的特定於Mac的工具包位元,則Mac OS Classic中的標準Perl發行版編譯現在應該可以工作。請聯繫macperl郵件列表獲取詳細信息。
MPE/iX
Perl 5.6.0後的MPE/iX更新。請參閱README.mpeix。[561]
NetBSD/threads:嘗試安裝GNU pth(應該在套件集合中,或https://gnu.dev.org.tw/software/pth/),並使用-Duseithreads進行配置。
NetBSD/sparc
Perl現在可以在NetBSD/sparc上運行。
OS/2
現在可以使用usethreads(請參閱INSTALL)。[561]
Solaris
使用Sun Workshop編譯器的64位現在可以工作。
Stratus VOS
本機構建方法需要至少VOS Release 14.5.0和GNU C++/GNU Tools 2.0.1或更高版本。Perl的pack功能現在將溢出的值映射到+無窮大,並將下溢的值映射到-無窮大。
Tru64(又稱Digital UNIX,又稱DEC OSF/1)
操作系統版本字母現在記錄在$Config{osvers}中。允許使用gcc進行編譯(以前是明確禁止的)。雖然建議不使用gcc進行編譯,因為即使使用gcc 2.95.2,仍會產生錯誤代碼。
Unicos
修復了各種導致在構建期間或以後核心崩潰的對齊問題;不再在運行時因數學錯誤而死亡;現在使用完整的四元整數(64位),以前僅使用46位整數以提高速度。
VMS
請參閱“VMS中的Socket擴展動態”和“OpenVMS Alpha上IEEE格式浮點默認值”的重要更改,這裡未列出其他更改。
即使存在CRT錯誤,chdir()現在也可以更好地工作;現在可以與MULTIPLICITY一起工作(請參閱INSTALL);現在可以與Perl的malloc一起工作。
先前未實現通過keys或values對%ENV元素進行污染。現在可以按照文檔進行操作。
等待waitpid
模擬已經改進。最嚴重的錯誤(現已修復)是,pid為-1會導致對系統上所有進程進行通配符搜索。
POSIX風格的信號在VMS 7.0之前的版本中現在模擬得更好。
system
函數和反引號運算符的功能和錯誤處理已經改進。[561]
文件訪問測試現在使用當前進程權限而不是用戶的默認權限,這有時可能導致報告的訪問與實際訪問不一致。這個改進僅適用於VMS v6.0及更高版本。
有一個基於sys$sigprc
的新kill
實現,允許舊的VMS系統(7.0之前)使用kill
發送信號,而不僅僅是強制退出。這個實現還允許稍後的系統從信號處理程序中調用kill
。
迭代邏輯名稱轉換現在模仿SHOW LOGICAL和其他OpenVMS工具的行為,限制為10次迭代。
Windows
信號處理現在比以前更加有效。它現在使用Windows消息循環實現,因此不太容易隨機崩潰。
fork()模擬現在更加穩健,但仍然存在一些奇特的錯誤和注意事項。詳情請參閱perlfork。[561+]
失敗的(虛擬)fork現在返回undef並將errno設置為EAGAIN。[561]
以下模塊現在在Windows上可用
ExtUtils::Embed [561]
IO::Pipe
IO::Poll
Net::Ping
IO::File::new_tmpfile()不再限於每進程32767次調用。
不存在的目錄的chdir()返回值更好。
現在支持使用64位Platform SDK工具編譯perl。
Win32::SetChildShowWindow()內建功能可以用於控制由子進程創建的窗口的可見性。詳情請參閱Win32。
通過waitpid($pid, &POSIX::WNOHANG)
支持對子進程(或虛擬進程)的非阻塞等待。
system()對於多個參數的行為已經合理化。每個未引用的參數將自動引用以保護空格,並且參數中的任何現有空格將被保留。這樣可以通過避免perl程序中需要Windows cmd
shell特定引用的方式來改進system(@args)的可移植性。
請注意,這意味著一些可能依賴於先前錯誤行為的腳本現在可能不再正確工作。例如,system("nmake /nologo", @args)
現在將嘗試運行文件nmake /nologo
,當找不到這樣的文件時將失敗。另一方面,perl現在可以正確執行代碼,如system("c:/Program Files/MyApp/foo.exe", @args)
。
perl頭文件不再抑制Microsoft Visual C++編譯器的常見警告。這意味著在編譯XS代碼時可能會出現額外的警告。
Borland C++ v5.5現在是一個支持的編譯器,可以構建Perl。但是,生成的二進制文件仍然與其他支持的編譯器(GCC和Visual C++)生成的二進制文件不兼容。[561]
在 Windows 9x 下,使用 open(F, ">&MYSOCK") 現在可以正常操作套接字處理程序。[561]
現在將 %ENV 中的當前目錄項正確傳遞給子進程。[561]
新的 %ENV 項目現在將傳遞給子進程。[561]
當處於驅動器根目錄時,Win32::GetCwd() 將正確返回 C:\ 而不是 C:。已修復 chdir() 和 Cwd::cwd() 中的其他錯誤。[561]
makefiles 現在默認使用 ActiveState ActivePerl(一個流行的 Win32 二進制發行版)中啟用的功能。[561]
HTML 文件現在將安裝在 c:\perl\html 而不是 c:\perl\lib\pod\html
perl 現在允許在註冊表設置中使用 REG_EXPAND_SZ 鍵。[561]
現在可以從所有線程而不僅僅是第一個線程發送 send()。[561]
ExtUtils::MakeMaker 現在使用 $ENV{LIB} 搜索庫。[561]
每個線程保留的堆棧較少,因此可以更多線程同時運行。(每個線程仍然保留 16M。)[561]
File::Spec->tmpdir()
現在更喜歡 C:/temp 而不是 /tmp(當 perl 作為服務運行時效果更好)。
在 ithreads 下改進了 UNC 路徑處理。[561]
在 Windows 9x 下,wait()、waitpid() 和反引號現在返回正確的退出狀態。[561]
已修復了 accept() 中的套接字處理程序泄漏。[561]
請參閱 perldiag 以獲取更多詳細信息。
在轉譯操作符中的模糊範圍(如 a-z-9)現在會產生警告。
chdir("") 和 chdir(undef) 現在會發出不建議的警告,因為它們可能導致意外 chdir 到主目錄。如果您真的是這樣的話,請說 chdir()。
新增了兩個調試選項:如果您使用調試編譯了您的 Perl,則可以使用 -DT [561] 和 -DR 選項來跟蹤標記化和向顯示變量添加引用計數。
語法警告類別 "deprecated" 不再是 "syntax" 類別的子類別。它現在是自己的頂級類別。
未裝飾的 dump() 現在會發出警告,建議如果真的需要的話使用明確的 CORE::dump()。
"未識別的轉義" 警告已擴展以包括 \8
、\9
和 \_
。不需要對任何 \w
字符進行轉義。
現在希望所有正則表達式編譯錯誤消息更容易理解,因為錯誤消息現在出現在失敗的正則表達式之前,並且失敗點現在明確標記為 <-- HERE
標記。
各種 I/O(和套接字)函數如 binmode()、close() 等現在更一致地警告,如果它們在尚未打開的文件處理程序(或套接字)上不合理使用或已經關閉,則會發出警告。
對文件處理程序使用 lstat() 現在會發出警告。(這是一個無意義的操作。)
現在,-M
和 -m
選項會在您未提供模組名稱時發出警告。
如果您在 use
中指定了所需的最低版本,則匹配名稱但未定義 $VERSION 的模組將導致致命失敗。
在 lvalue 上下文中使用負偏移量進行 vec() 現在會引發警告。
對 overload::constant 的奇數個參數現在會引發警告。
匿名哈希中的元素數目為奇數時現在會引發警告。
各種「僅為開啟」、「已關閉」、「從未開啟」的警告會針對 main::
前綴的文件句柄在 main
套件中進行省略,例如 STDIN
而不是 main::STDIN
。
現在更仔細檢查子例程原型,例如如果您使用了非原型字符,則可能會收到警告。
如果試圖將(非受保護的)引用用作陣列索引,則會給出警告。
push @a;
和 unshift @a;
(沒有要推送或未推送值)現在會發出警告。這可能對生成和 eval 的程式碼構成問題。
如果您嘗試使用 "C"
格式將小於 0 或大於 255 的數字進行 "pack" in perlfunc,則會收到可選警告。對於 "c"
格式和小於 -128 或大於 127 的數字也是如此。
pack P
格式現在要求明確的大小。
unpack w
現在會警告未終止的壓縮整數。
已添加與 PerlIO 使用相關的警告。
某些正則表達式修飾符(例如 (?o)
)僅在應用於整個正則表達式時才有意義。如果您嘗試以其他方式使用它們,則會收到可選警告。
變長回溯尚未實現,嘗試使用它將會收到相應警告。
已經過時一段時間了,不支援將陣列或哈希作為引用(例如 %foo->{bar}
)。現在您將收到可選警告。
已添加與新受限哈希功能使用相關的警告。
不支援陣列和哈希的自我綁定,甚至嘗試這樣做都會導致致命錯誤。
在純量上下文中使用 sort
現在會發出可選警告。這不會執行任何有用的排序,因為排序未執行。
在 split() 中使用 /g 修飾符是無意義的,將會導致警告。
現在在陣列末端使用 splice() 會導致警告。
畸形的 Unicode 編碼(UTF-8 和 UTF-16)會引發大量警告,試圖使用未實現的 UTF-16 替代(代理)也是如此。
在 I/O 流上使用 Unicode 字元而沒有標記流的編碼(使用 open() 或 binmode())將引發「寬字元」警告。
在 use/require 中使用 v-strings 會引發(向後)可攜性警告。
已新增與使用解譯器線程及其共享數據相關的警告。
PerlIO 現在是默認值。
perlapi.pod(perlguts 的附屬文件)現在試圖記錄內部 API。
現在可以建立一個名為 microperl 的真正最小化的 Perl。建立 microperl 不需要執行 Configure;make -f Makefile.micro
應該足夠。注意:microperl 做出了許多假設,其中一些可能太大膽;生成的可執行檔可能會以奇妙的方式崩潰或表現不當。僅適用於謹慎的駭客。
新增了 rsignal()、whichsig()、do_join()、op_clear、op_null、ptr_table_clear()、ptr_table_free()、sv_setref_uv() 和幾個 UTF-8 介面到公開 API。有關可用 API 的完整列表,請參閱 perlapi。
現在可以通過 croak() 傳播定制的異常。
現在 xsubs 可以像 subs 一樣具有屬性。(好吧,至少是內置的屬性。)
dTHR 和 djSP 已經過時;前者已被移除(因為它是一個無操作),後者被 dSP 替換。
已完全刪除 PERL_OBJECT。
已將 MAGIC 常量(例如 'P'
)宏化(例如 PERL_MAGIC_TIED
)以提高源代碼的可讀性和可維護性。
正則表達式編譯器現在維護一個結構,該結構將編譯的字節碼中的節點與原始正則表達式的語法特徵相對應。信息附加到 struct regexp
的新 offsets
成員上。有關更完整的信息,請參閱 perldebguts。
C 代碼已經更加符合 gcc -Wall
。在某些平台上仍然存在一些警告消息,因此如果您使用 gcc 編譯,您可能會看到一些關於可疑做法的警告。正在努力解決這些警告。
perly.c、sv.c 和 sv.h 現在已經被詳細注釋。
已添加了如何使用 Perl 源代碼存儲庫的文檔到 Porting/repository.pod。
現在有幾個分析製作目標。
(此更改已在 5.7.0 中進行,但在此重申。)(5.7.0 在 5.6.1 之前已經發布:開發分支 5.7 比維護分支 5.6 更早釋出)
Perl的可选组件suidperl在2000年8月被发现存在潜在的安全漏洞。suidperl默认情况下既不构建也不安装。截至2001年11月,唯一已知的易受攻击平台是Linux,很可能是所有Linux发行版。已经向CERT和各种供应商和分发商发出了有关此漏洞的警报。有关更多信息,请参阅http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt。
问题的根源是Perl试图使用外部程序/bin/mail报告一种被怀疑的安全漏洞尝试。在Linux平台上,/bin/mail程序具有一个未记录的功能,当与suidperl结合使用时,可以访问根Shell,导致严重的损害而不是报告漏洞尝试。如果您没有/bin/mail,或者如果您有“安全的setuid脚本”,或者如果未安装suidperl,则是安全的。
从Perl 5.8.0开始(以及维护版本5.6.1,并且还从所有Perl 5.7版本中删除),已完全删除了报告漏洞尝试的功能,因此不再存在该特定漏洞。但是,不幸的是,始终存在可能的进一步安全漏洞。suidperl功能很可能会在Perl 5.10中被删除。无论如何,suidperl应该只由确切知道自己在做什么以及为什么使用suidperl而不是其他解决方案(如sudo,参见http://www.courtesan.com/sudo/)的安全专家使用。
已添加了几个新测试,特别是针对lib和ext子部分。现在有大约69,000个单独的测试(分布在约700个测试脚本中),在回归套件中(5.6.1有大约11,700个测试,分布在258个测试脚本中)。确切的数字取决于所使用的平台和Perl配置。当然,许多新测试是由新模块引入的,但总体而言,Perl现在经过了更全面的测试。
由于测试数量庞大,运行回归套件所需的时间将比以前长得多:预计套件运行时间将比perl 5.6长4-5倍。在一台非常快的机器上,您可以希望在大约6-8分钟(挂钟时间)内完成套件。
測試現在的報告順序與早期的 Perl 不同。(這是因為來自 t/lib 下的測試腳本已經被移動到更靠近它們正在測試的庫/擴展。)
編譯器套件慢慢變得更好,但它仍然是高度實驗性的。不建議在生產環境中使用。
local %tied_array;
不像人們期望的那樣工作:舊值被不正確地恢復。這將在未來的版本中更改,但我們還不知道新的語義將會是什麼。無論如何,這個變化都會破壞依賴於當前(定義不清晰的)語義的現有代碼,所以一般情況下要避免這樣做。
一些擴展如 mod_perl 已知存在與“largefiles”相關的問題,這是由 Perl 5.6.0 引入的一個變化,其中文件偏移默認為64位寬,如果支持的話。模塊可能完全無法編譯,或者它們可能編譯並且工作不正常。目前,對於這個問題沒有好的解決方案,但 Configure 現在在 %Config 散列中提供了適當的非大文件 ccflags、ldflags、libswanted 和 libs(例如,$Config{ccflags_nolargefiles}),因此遇到問題的擴展可以嘗試在沒有 largefileness 的情況下進行配置。這無疑不是一個乾淨的解決方案,解決方案甚至可能根本行不通。一個潛在的失敗是是否可以(或者,如果可以的話,是否是一個好主意)將具有關於文件偏移的不同想法的二進制文件連接在一起;所有這些都取決於平台。
for (1..5) { $_++ }
能夠毫無怨言地工作。這不應該。 (您應該只能在循環內部修改 lvalue 元素。) 你可以通過將 1..5 替換為 1, 2, 3, 4, 5 來看到正確的行為。
請使用 mod_perl 1.27 或更高版本。
別驚慌。請參閱 INSTALL 中的 'make test' 部分。
請使用 libwww-perl 5.65 或更新版本。
請使用 PDL 2.3.4 或更新版本。
您可能會遇到類似 'Undefined symbol "Perl_get_sv"' 或 "can't resolve symbol 'Perl_get_sv'" 的錯誤,或者符號可能是 "Perl_sv_2pv"。這可能意味著您正在嘗試使用舊版本的共享 Perl 函式庫(或與之鏈接的擴展)與 Perl 5.8.0 可執行檔。Perl 曾經擁有這樣的一個子程式,但現在不再是這樣了。檢查您的共享庫路徑,以及這些目錄中的任何共享 Perl 函式庫。
有時這個問題也可能表示 Perl 5.8.0 安裝不完整,請參閱 "Mac OS X dyld undefined symbols" 了解示例以及如何處理。
數組和哈希的自綁定存在著相當深且難以修復的問題。作為暫時措施,以避免人們因神秘的結果(核心轉儲,最常見)而感到沮喪,現在禁止這樣做(即使您嘗試也會得到致命錯誤)。
對球形物的自綁定的更改導致它們被遞迴引用(參見:perlobj 中的 "Two-Phased Garbage Collection")。您現在需要顯式解除綁定以銷毀自綁定的球形物。此行為可能會在以後修復。
標量和 IO 物件的自綁定有效。
如果此測試失敗,則表明您的 libc(C 函式庫)不是線程安全的。此特定測試通過對 localtime() 調用進行壓力測試,以確定它是否是線程安全的。有關更多信息,請參閱 perlthrtut。
請注意,對於 5.005 風格的線程支援已被棄用,屬於實驗性質且幾乎不受支援。預計在 5.10 版本中將其移除。您應該將您的代碼遷移到 ithreads。
由於 5.005 線程實現中存在根本性問題,已知以下測試會失敗。這些並非新的失敗--Perl 5.005_0x 也存在相同的錯誤,但沒有這些測試。
../ext/B/t/xref.t 255 65280 14 12 85.71% 3-14
../ext/List/Util/t/first.t 255 65280 7 4 57.14% 2 5-7
../lib/English.t 2 512 54 2 3.70% 2-3
../lib/FileCache.t 5 1 20.00% 5
../lib/Filter/Simple/t/data.t 6 3 50.00% 1-3
../lib/Filter/Simple/t/filter_only. 9 3 33.33% 1-2 5
../lib/Math/BigInt/t/bare_mbf.t 1627 4 0.25% 8 11 1626-1627
../lib/Math/BigInt/t/bigfltpm.t 1629 4 0.25% 10 13 1628-
1629
../lib/Math/BigInt/t/sub_mbf.t 1633 4 0.24% 8 11 1632-1633
../lib/Math/BigInt/t/with_sub.t 1628 4 0.25% 9 12 1627-1628
../lib/Tie/File/t/31_autodefer.t 255 65280 65 32 49.23% 34-65
../lib/autouse.t 10 1 10.00% 4
op/flip.t 15 1 6.67% 15
這些失敗不太可能得到修復,因為 5.005 風格的線程被認為是根本性地有問題的。(基本上發生的情況是競爭線程可能會破壞共享全局狀態,一個很好的例子是正則表達式引擎的狀態。)
由於時間問題,以下測試可能會間歇性地失敗,例如如果系統負載很重。
t/op/alarm.t
ext/Time/HiRes/HiRes.t
lib/Benchmark.t
lib/Memoize/t/expmod_t.t
lib/Memoize/t/speed.t
如果發生失敗,請嘗試手動運行它們,例如
./perl -Ilib ext/Time/HiRes/HiRes.t
對於普通數組,$foo = \$bar[1]
會將 $bar[1]
分配為 undef
(假設之前不存在),但對於綁定/神奇數組和哈希,這樣的自動創建不會發生,因為目前沒有辦法捕獲引用的創建。同樣的問題也影響到對綁定/神奇數組/哈希不存在的索引/鍵的切片。
您可以在標識符名稱中使用 Unicode,但在包/類名稱或子程序名稱中不行。雖然截至 Perl 5.8.0,對此的一些有限功能是存在的,但那更多是偶然而非設計的;對於這些用途使用 Unicode 是不受支持的。
這種未完成的原因之一是它(目前)固有的不可移植性:由於包名和子程序名可能需要映射到文件和目錄名,文件系統的 Unicode 能力變得重要-- 而不幸的是,目前沒有可移植的答案。
如果使用 AIX 原生的 make 命令,而不僅僅是 "make",請發出 "make all"。在某些設置中,前者已知會尝試運行 "make install"。或者,您可能想要使用 GNU make。
在 AIX 4.2 中,使用 C++ 函數的 Perl 擴展可能會存在問題,因為靜態變量沒有被初始化。在更新的 AIX 版本中,已通過將 Perl 鏈接到 libC_r 库來解決此問題,但不幸的是,在 AIX 4.2 中,該庫存在一個不明顯的錯誤,其中與時間有關的各種功能(如 time() 和 gettimeofday())返回不正確的值,因此在 AIX 4.2 中 Perl 未與 libC_r 鏈接。
vac 5.0.0.0 可能會為 Perl 生成有缺陷的代碼
AIX C 編譯器 vac 版本 5.0.0.0 可能會產生錯誤的程式碼,導致部分隨機測試在執行「make test」時失敗,但是當這些失敗的測試手動執行時,它們會成功。我們建議升級至至少 vac 版本 5.0.1.0,已知它可以正確編譯 Perl。使用「lslpp -L|grep vac.C」可以查詢 vac 的版本。請參閱 README.aix。
如果要建立多執行緒 Perl,您可能會從 pp_sys.c 中收到編譯警告。
"pp_sys.c", line 4651.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
這是無害的;它是由於 getnetbyaddr() 和 getnetbyaddr_r() 的第一個參數類型略有不同所致。
如果在 Linux/alpha 或 *BSD/Alpha 中看到 op/pack、op/pat、op/regexp 或 ext/Storable 測試失敗,那麼現在可能是升級您的 gcc 的時候了。2.95.3 之前的 gcc 絕對不夠好,而 3.1 可能更好。(RedHat Linux/alpha 使用 gcc 3.1 沒有報告問題,Linux 2.4.18 使用 gcc 2.95.4 也沒有問題。)(在 Tru64 中,最好使用捆綁的 C 編譯器。)
Perl 5.8.0 在 AmigaOS 上無法建置。在執行 ithreads 工作期間的某個時候它發生了故障,我們找不到 Amiga 專家來解決問題。Perl 5.6.1 仍然可以在 AmigaOS 上運行(5.7.2 開發版本也是如此)。
在 BeOS Personal 5.03 上,5.8.0 Perl 上的以下測試失敗
t/op/lfs............................FAILED at test 17
t/op/magic..........................FAILED at test 24
ext/Fcntl/t/syslfs..................FAILED at test 17
ext/File/Glob/t/basic...............FAILED at test 3
ext/POSIX/t/sigaction...............FAILED at test 13
ext/POSIX/t/waitpid.................FAILED at test 1
(注意:更多資訊曾經在 README.beos 中提供,直到 Perl v5.18.0 中移除對 BeOS 的支援)
例如,在為 Cygwin 建置 Tk 擴展時,您可能會收到一條錯誤訊息,說明「無法重新映射」。這是 Cygwin 的已知問題,並且這裡有一個詳細的解決方法:http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html
在 FAT 檔案系統上可以建置但無法安裝(或測試建置)NDBM_File。在 NTFS 上安裝(或建置)沒問題。如果嘗試在 FAT 安裝(或建置)上進行測試,則預期會出現以下失敗
../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71
../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ??
../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4
../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11
../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4
run/fresh_perl.t 97 1 1.03% 91
NDBM_File 失敗,而 ODBM_File 僅會核心轉儲。
如果您打算僅在 FAT 上運行(或在 FAT 上使用 AnyDBM_File),請使用 -Ui_ndbm 和 -Ui_dbm 選項運行 Configure 以防止建置 NDBM_File 和 ODBM_File。
t/op/stat............................FAILED at test 29
lib/File/Find/t/find.................FAILED at test 1
lib/File/Find/t/taint................FAILED at test 1
lib/h2xs.............................FAILED at test 15
lib/Pod/t/eol........................FAILED at test 1
lib/Test/Harness/t/strap-analyze.....FAILED at test 8
lib/Test/Harness/t/test-harness......FAILED at test 23
lib/Test/Simple/t/exit...............FAILED at test 1
上述問題在 5.8.0 版本中已知,使用長檔名進行本地構建時出現,但在 dosemu 下運行可能還有一些限制(可能是由於 dosemu 的限制,也可能是由於錯誤)。
t/comp/cpp...........................FAILED at test 3
t/op/inccode.........................(crash)
還有一些 lib/ExtUtils 測試,以及幾百個 Encode/t/Aliases.t 失敗,這些測試在使用長檔名時運行良好。因此,您可能真的更喜歡本地構建和長檔名。
這是 FreeBSD 4.5 版本中 readdir_r() 的已知錯誤,在 FreeBSD 4.6 中已經修復(請參閱 perlfreebsd(README.freebsd))。
在 FreeBSD 中,ISO 8859-15 地區設定可能會導致測試 117 失敗。這是由於字元 \xFF(帶兩點的 y)和 \xBE(帶兩點的 Y)在不區分大小寫時無法正確匹配。顯然,這個問題已經在最新的 FreeBSD 版本中修復。(http://www.freebsd.org/cgi/query-pr.cgi?pr=34308)
IRIX 使用 MIPSpro 7.3.1.2m 或 7.3.1.3m 編譯器可能會在 List::Util 測試 ext/List/Util/t/shuffle.t 中導致核心轉儲。這似乎是編譯器錯誤,因為如果使用 gcc 編譯,就不會發生核心轉儲,而且在任何其他平台上都沒有看到該測試失敗。
同樣地,構建 Digest::MD5 擴展也已知失敗,顯示“*** 終止碼 139(bu21)”。
解決方法是降低優化級別(Configure -Doptimize=-O2)。
如果 perl 配置為 -Duse64bitall,則 lib/posix 的子測試 10 的成功結果可能會在子測試 9 的成功結果之前到達,這使得測試工具混淆,認為子測試 9 失敗了。
這是 glibc 2.2.5 中關於 long long 整數的已知錯誤。(http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612)
沒有已知的修復方法。
請記得在運行 "make test" 前將您的環境變數 LC_ALL 設置為 "C" (setenv LC_ALL C),以避免 Mac OS X 關於破損地區設置的大量警告。
由於 Mac OS X 中包含的 Berkeley DB 的錯誤 (舊) 實現,以下測試已知會失敗於 Mac OS X 10.1.5
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------
../ext/DB_File/t/db-btree.t 0 11 ?? ?? % ??
../ext/DB_File/t/db-recno.t 149 3 2.01% 61 63 65
如果您在 UFS 分割上構建,您也可能會看到 t/op/stat.t 子測試 #9 失敗。這是由 Darwin 的 UFS 不支持 inode 更改時間所導致的。
此外,ext/POSIX/t/posix.t 子測試 #10 失敗,但目前已被跳過,因為失敗是蘋果的錯,而不是 Perl 的 (阻塞的信號丟失)。
如果您使用 ithreads 進行配置,ext/threads/t/libc.t 將失敗。同樣,這不是 Perl 的錯誤 - Mac OS X 的 libc 不是線程安全的 (在此特定測試中,localtime() 調用被發現是不安全的)。
如果在安裝 Perl 5.8.0 後您收到有關缺少符號的警告,例如
dyld: perl Undefined symbols
_perl_sv_2pv
_perl_get_sv
您可能在 /Library/Perl 中擁有一個舊的 Perl 5.8.0 之前安裝 (或部分安裝) (未定義的符號曾在 5.8.0 之前的 Perl 中存在)。似乎由於某種原因,“make install” 不總是完全覆蓋 /Library/Perl 中的文件。您可以這樣將舊的 Perl 共享庫移到一邊
cd /Library/Perl/darwin/CORE
mv libperl.dylib libperlold.dylib
然後重新發行 “make install”。請注意,上述方法對於任何使用 /usr/local/bin/perl 的東西當然都是非常破壞性的。如果這沒有幫助,您可能需要嘗試從 /Library/Perl 下面刪除所有 .bundle 文件,然後再次進行 “make install”。
以下測試在 OS/2 上已知失敗 (僅顯示失敗,而不是完整的錯誤消息)
../lib/ExtUtils/t/Mkbootstrap.t 1 256 18 1 5.56% 8
../lib/ExtUtils/t/Packlist.t 1 256 34 1 2.94% 17
../lib/ExtUtils/t/basic.t 1 256 17 1 5.88% 14
lib/os2_process.t 2 512 227 2 0.88% 174 209
lib/os2_process_kid.t 227 2 0.88% 174 209
lib/rx_cmprt.t 255 65280 18 3 16.67% 16-18
op/sprintf 測試 91、129 和 130 在某些平台上已知失敗。例如,使用 sfio 的任何平台以及 Compaq/Tandem 的 NonStop-UX。
測試 91 在 QNX6 (nto) 上已知失敗,因為 sprintf '%e',0
不正確地產生 0.000000e+0
而不是 0.000000e+00
。
對於測試 129 和 130,失敗的平台不符合 ANSI C 標準:確切地說,ANSI X3.159 1989 第 134 頁的第 19ff 行 (使用 printf 格式 "%.0f" 格式化 0.6 和 -0.6 時,它們產生的不是 “1” 和 “-1”,而是通常產生 “0” 和 “-0”)。
在 SCO 3.2v5.0 上已知 socketpair 測試不正常。
ext/Socket/socketpair.t...............FAILED tests 15-45
如果您仍在使用 Solaris 2.5(又名 SunOS 5.5),您可能會在 lib/locale.t 中遇到失敗(測試核心轉儲)。建議解決方案是升級您的 Solaris。
以下測試在配置為使用 64 位整數的 Perl 中已知在 Solaris x86 上失敗
ext/Data/Dumper/t/dumper.............FAILED at test 268
ext/Devel/Peek/Peek..................FAILED at test 7
以下測試在 SUPER-UX 上已知失敗
op/64bitint...........................FAILED tests 29-30, 32-33, 35-36
op/arith..............................FAILED tests 128-130
op/pack...............................FAILED tests 25-5625
op/pow................................
op/taint..............................# msgsnd failed
../ext/IO/lib/IO/t/io_poll............FAILED tests 3-4
../ext/IPC/SysV/ipcsysv...............FAILED tests 2, 5-6
../ext/IPC/SysV/t/msg.................FAILED tests 2, 4-6
../ext/Socket/socketpair..............FAILED tests 12
../lib/IPC/SysV.......................FAILED tests 2, 5-6
../lib/warnings.......................FAILED tests 115-116, 118-119
op/pack 失敗("在 op/pack.t 第 126 行無法壓縮負數")是嚴重的,但目前尚未解決。它指向了一些與 C 編譯器處理帶符號性的問題,就像 64bitint、arith 和 pow 失敗一樣。其餘大部分指向了與 SysV IPC 相關的問題。
請使用 Term::ReadKey 2.20 或更新版本。
在配置期間,測試
Guessing which symbols your C compiler and preprocessor define...
可能會出現錯誤消息,如下
CC-20 cc: ERROR File = try.c, Line = 3
The identifier "bad" is undefined.
bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
^
CC-65 cc: ERROR File = try.c, Line = 3
A semicolon is expected at this point.
這是由於 UNICOS/mk 的 awk 實用工具中的一個錯誤引起的。您可以忽略此錯誤,但這確實造成了一個小問題:您無法完全受益於 h2ph 實用工具(參見 h2ph),該工具用於將 C 標頭轉換為 Perl 庫,主要用於能夠從 Perl 訪問使用 C 預處理器 cpp 定義的常量。由於上述錯誤,部分轉換後的標頭將是不可見的。幸運的是,這些天對 h2ph 的需求很少。
如果使用解釋器線程(ithreads)構建 Perl,由於 UNICOS/mk 多線程支持中的一個錯誤,getgrent()、getgrnam() 和 getgrgid() 函數無法返回群組成員列表。這意味著在列表上下文中,這些函數將僅返回三個值,而不是四個。
有幾個已知的測試失敗。 (注意: 相關信息在 Perl v5.18.0 中刪除了對 UTS 的支持之前,可以在 README.uts 中找到)
當在 VOS Release 14.5.0 和 GNU C++/GNU Tools 2.0.1 上使用本地構建流程構建 Perl 時,所有嘗試的測試都通過或結果為 TODO(忽略)失敗。
雖然有許多測試被標記為待辦事項(TODO),指出需要進一步調試和/或移植工作的區域,但使用默認配置應該不會報告任何測試失敗。
在多CPU框中,I/O緩衝存在一些問題:有些輸出可能會出現兩次。
使用XML::Parser 2.31或更高版本。
z/OS有相當多的測試失敗,但實際情況比5.6.0時好得多;只是因為增加了許多新的模塊和測試。
Failed Test Stat Wstat Total Fail Failed List of Failed
---------------------------------------------------------------------------
../ext/Data/Dumper/t/dumper.t 357 8 2.24% 311 314 325 327
331 333 337 339
../ext/IO/lib/IO/t/io_unix.t 5 4 80.00% 2-5
../ext/Storable/t/downgrade.t 12 3072 169 12 7.10% 14-15 46-47 78-79
110-111 150 161
../lib/ExtUtils/t/Constant.t 121 30976 48 48 100.00% 1-48
../lib/ExtUtils/t/Embed.t 9 9 100.00% 1-9
op/pat.t 922 7 0.76% 665 776 785 832-
834 845
op/sprintf.t 224 3 1.34% 98 100 136
op/tr.t 97 5 5.15% 63 71-74
uni/fold.t 780 6 0.77% 61 169 196 661
710-711
dumper.t和downgrade.t中的失敗是測試中的問題,io_unix和sprintf中的失敗是USS(UDP套接字和printf格式)中的問題。pat、tr和fold的失敗是由EBCDIC(以及在pat和fold案例中,與Unicode結合)引起的真正的Perl問題。Constant和Embed可能是測試中的問題(因為它們測試Perl構建擴展的能力,而這似乎運行得相當順利)。
雖然在大多數情況下工作,但EBCDIC平台上的Unicode支持仍存在問題。已知的一個這樣的問題是對於小於256的代碼點的\p{}
和\P{}
正則表達式構造: pP
測試Unicode代碼點,不知道EBCDIC。
Time::Piece
(以前稱為Time::Object
)被移除,因為覺得它在核心模塊中沒有足夠的價值。然而,這仍然是一個有用的模塊,可以從CPAN獲得。
不幸的是,Perl 5.8無法在AmigaOS上構建;這是在某個時候意外中斷的。由於Amiga開發者不太多,我們無法及時解決並進行測試以修復此問題,以便在5.8.0之前。 Perl 5.6.1仍然可以在AmigaOS上運行(5.7.2開發版本也是如此)。
在 5.8.0 版之前,PerlIO::Scalar
和 PerlIO::Via
(大寫)被重新命名為 PerlIO::scalar
和 PerlIO::via
(全小寫)。主要原因是讓所有核心 PerlIO 層的名稱都是全小寫。"插件" 的命名保持不變,例如 PerlIO::via::QuotedPrint
。
在 5.8.0 版之前,threads::shared::queue
和 threads::shared::semaphore
被重新命名為 Thread::Queue
和 Thread::Semaphore
。主要原因是使線程模塊遵循常規命名,Thread::
(threads
和 threads::shared
本身更像是 pragma,它們影響編譯時期,所以保持小寫)。
如果您發現了您認為是錯誤的問題,您可以查看最近發布到 comp.lang.perl.misc 新聞組和 perl 錯誤數據庫(http://bugs.perl.org/)的文章。也可能在 Perl Home Page(http://www.perl.com/)上找到信息。
如果您認為您發現了一個未報告的錯誤,請運行隨您的版本發行的 perlbug 程序。請確保將您的錯誤減少到一個小但足夠的測試案例。您的錯誤報告和 perl -V
的輸出將被發送到 perlbug@perl.org 以供 Perl 移植團隊分析。
請查閱 Changes 文件以獲取詳細的變更信息。
請查閱 INSTALL 文件以獲取 Perl 的構建方法。
請查閱 README 文件以獲取一般信息。
請查閱 Artistic 和 Copying 文件以獲取版權信息。
作者是 Jarkko Hietaniemi <jhi@iki.fi>。