目錄

名稱

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 版本的變更)。

5.8.0 版本的亮點

不相容的變更

二進制不相容性

Perl 5.8 與之前的 Perl 版本不兼容。

您必須重新編譯您的 XS 模組。

(純 Perl 模組應該繼續運作。)

不相容性的主要原因是稱為 PerlIO 的新 IO 架構。PerlIO 是默認配置,因為如果沒有它,Perl 5.8 的許多新功能將無法使用。換句話說:您只需重新編譯包含 XS 代碼的模組,對此表示抱歉。

在 Perl 的未來版本中,不支援 PerlIO 的 XS 模組可能會完全不被支援。然而,對於模組作者來說,這應該不會太困難:PerlIO 已經被設計為 stdio 介面的一個可插拔替代品(在源代碼層面)。

根據您的平台,我們決定破壞二進制兼容性的其他原因也有其他原因,請繼續閱讀。

64 位元平台和 malloc

如果您的指標是 64 位元寬,Perl malloc 將不再使用,因為它與 8 位元指標不兼容。而且,通常這些平台上的系統 malloc 比 Perl malloc 更好地優化了如此大的內存模型。一些對內存需求很高的 Perl 應用程序(如 PDL)不適用於 Perl 的 malloc。最後,除 Perl 外的其他應用程序(如 mod_perl)往往更喜歡系統 malloc。這些平台包括 Alpha 和 64 位元 HPPA、MIPS、PPC 和 Sparc。

AIX 動態加載

在 AIX 4.3 版本及更新版本中,AIX 動態加載現在使用 AIX 的原生 dlopen 介面,而不是舊的模擬介面。這個變更可能會破壞與編譯模組的向後兼容性。這個變更是為了使 Perl 更符合使用 AIX 原生介面的其他應用程序,如 mod_perl。

my 變數的屬性現在在運行時處理

my EXPR : ATTRS 語法現在在運行時應用變數屬性。(子程序和 our 變數仍然在編譯時應用屬性。)參見 attributes 以獲取更多詳細信息。特別是,這允許變數屬性對於 tie 介面是有用的,這是先前版本的一個不足之處。請注意,新的語義不適用於 Attribute::Handlers 模組(截至版本 0.76)。

在 VMS 中的動態 Socket 擴展

Socket 擴展現在是動態加載的,而不是靜態構建的。對於古老的 VMS TCP/IP 堆棧,這可能是一個問題,我們無法確定,因為我們無法在這種配置下測試 Perl。

在 OpenVMS Alpha 上的 IEEE 格式浮點數默認值

Perl 現在在 OpenVMS Alpha 上使用 IEEE 格式(T_FLOAT)作為默認的內部浮點數格式,可能會破壞與外部庫或現有數據的二進制兼容性。G_FLOAT 仍然作為配置選項可用。VAX 上的默認值(D_FLOAT)未更改。

新的 Unicode 語義(幾乎不再使用 utf8)

以前在 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 屬性

現在支持 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(...) 取代 SCALAR(...)

對參考的參考現在會被串列化為 "REF(0x81485ec)",而不是 "SCALAR(0x81485ec)",以使其與 ref() 的返回值更一致。

pack/unpack D/F 循環利用

未記錄的 pack/unpack 模板字母 D/F 已經被循環利用以更好地使用:現在它們代表長雙精度(如果平台支援)和 NV(Perl 內部浮點類型)。 (它們以前是 d/f 的別名,但您可能不知道。)

glob() 現在以字母順序返回檔案名稱

glob() 得到的檔案名稱列表(或 <...>)現在默認按字母順序排序,以符合 csh 標準(這在大多數 Unix 平台上以前已經發生)。 (bsd_glob() 仍然會依平台原生地排序,ASCII 或 EBCDIC,除非指定了 GLOB_ALPHASORT。)[561]

廢棄項目

核心增強

Unicode 大改版

一般來說,Unicode 現在應該比 Perl 5.6.0(甚至比 5.6.1)更易於使用。Unicode 可以用於雜湊鍵中,正則表達式中的 Unicode 現在應該可以運作,tr/// 中的 Unicode 現在應該可以運作,I/O 中的 Unicode 現在應該可以運作。請參閱 perluniintro 進行簡介,以及 perlunicode 進行詳細了解。

PerlIO 現在是預設值

ithreads

新的解釋器線程(簡稱"ithreads")實現了多線程,由 Arthur Bergman 負責,取代了舊的 "5.005 線程" 實現。在 ithreads 模型中,線程之間的任何數據共享都必須是明確的,而不是數據共享是隱式的模型。參見 threadsthreads::shared,以及 perlthrtut

作為 ithreads 實現的一部分,Perl 還將使用任何必要且可檢測到的可重入 libc 接口。

受限哈希

受限哈希被限制為某一組特定的鍵,不能添加集合外的鍵。還可以限制單個鍵,以使鍵無法被刪除且值無法更改。沒有涉及新的語法:Hash::Util 模組是接口。

安全信號

以前,Perl 很脆弱,因為信號在不恰當的時刻到達時可能會損壞 Perl 的內部狀態。現在 Perl 延遲處理信號直到安全(在操作碼之間)。

這個改變可能會帶來意外的副作用,因為信號不再立即中斷 Perl。Perl 現在會首先完成它正在做的任何事情,比如完成內部操作(比如 sort())或外部操作(比如 I/O 操作),然後才查看已到達的信號(並在開始下一個操作之前)。由於當前操作始終首先完成,所以不會再有損壞的內部狀態,但信號可能需要更長的時間才能被聽到。請注意,從可能阻塞的操作中跳出應該仍然有效。

數字理解

總的來說,Perl 在對數字(整數和浮點數)理解方面進行了很多修復。由於在許多系統中,標準的數字解析函數,如 strtoul()atof(),似乎存在缺陷,Perl 試圖解決它們的不足之處。這希望能產生更準確的數字。

Perl 現在在數值轉換和基本算術運算(+ - * /)中儘可能使用整數值,如果參數是整數,它會嘗試內部轉換為整數,並且也會嘗試保持結果內部存儲為整數。這個變化通常會導致算術運算稍微更快,並且總是更少損失。(之前 Perl 在其數學運算中始終優先使用浮點數。)

陣列現在總是會在雙引號字串中插值[561]

在雙引號字串中,無論如何,陣列現在都會插值。在 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。

其他變更

模組和語法

新模組和語法

已更新和改進的模塊和Pragma

實用工具變更

新文檔

在安裝前可在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

性能增強

安裝和配置改進

一般改進

新的或改進的平台

要查看已知支持 Perl 的平台列表,請參見 "perlport" 中的 "Supported Platforms"

選定的錯誤修復

已經解決了許多內存泄漏和未初始化的內存訪問問題。最重要的是,匿名子例程以前會泄漏大量內存。[561]

平台特定的更改和修正

新的或已更改的診斷信息

請參閱 perldiag 以獲取更多詳細信息。

內部更改

安全漏洞已關閉 [561]

(此更改已在 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/)的安全专家使用。

新测试

已添加了几个新测试,特别是针对libext子部分。现在有大约69,000个单独的测试(分布在约700个测试脚本中),在回归套件中(5.6.1有大约11,700个测试,分布在258个测试脚本中)。确切的数字取决于所使用的平台和Perl配置。当然,许多新测试是由新模块引入的,但总体而言,Perl现在经过了更全面的测试。

由于测试数量庞大,运行回归套件所需的时间将比以前长得多:预计套件运行时间将比perl 5.6长4-5倍。在一台非常快的机器上,您可以希望在大约6-8分钟(挂钟时间)内完成套件。

測試現在的報告順序與早期的 Perl 不同。(這是因為來自 t/lib 下的測試腳本已經被移動到更靠近它們正在測試的庫/擴展。)

已知問題

編譯器套件仍然非常實驗性

編譯器套件慢慢變得更好,但它仍然是高度實驗性的。不建議在生產環境中使用。

本地化 Tied Arrays 和 Hashes 已損壞

local %tied_array;

不像人們期望的那樣工作:舊值被不正確地恢復。這將在未來的版本中更改,但我們還不知道新的語義將會是什麼。無論如何,這個變化都會破壞依賴於當前(定義不清晰的)語義的現有代碼,所以一般情況下要避免這樣做。

構建擴展可能因為大文件而失敗

一些擴展如 mod_perl 已知存在與“largefiles”相關的問題,這是由 Perl 5.6.0 引入的一個變化,其中文件偏移默認為64位寬,如果支持的話。模塊可能完全無法編譯,或者它們可能編譯並且工作不正常。目前,對於這個問題沒有好的解決方案,但 Configure 現在在 %Config 散列中提供了適當的非大文件 ccflags、ldflags、libswanted 和 libs(例如,$Config{ccflags_nolargefiles}),因此遇到問題的擴展可以嘗試在沒有 largefileness 的情況下進行配置。這無疑不是一個乾淨的解決方案,解決方案甚至可能根本行不通。一個潛在的失敗是是否可以(或者,如果可以的話,是否是一個好主意)將具有關於文件偏移的不同想法的二進制文件連接在一起;所有這些都取決於平台。

在 for(..) 內部修改 $_

for (1..5) { $_++ }

能夠毫無怨言地工作。這不應該。 (您應該只能在循環內部修改 lvalue 元素。) 你可以通過將 1..5 替換為 1, 2, 3, 4, 5 來看到正確的行為。

mod_perl 1.26 不能與 Threaded Perl 一起構建

請使用 mod_perl 1.27 或更高版本。

lib/ftmp-security tests 警告 '系統可能不安全'

別驚慌。請參閱 INSTALL 中的 'make test' 部分。

libwww-perl(LWP)失敗 base/date #51

請使用 libwww-perl 5.65 或更新版本。

PDL 一些測試失敗

請使用 PDL 2.3.4 或更新版本。

Perl_get_sv

您可能會遇到類似 '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 物件的自綁定有效。

ext/threads/t/libc

如果此測試失敗,則表明您的 libc(C 函式庫)不是線程安全的。此特定測試通過對 localtime() 調用進行壓力測試,以確定它是否是線程安全的。有關更多信息,請參閱 perlthrtut

Thread(5.005 樣式)測試失敗

請注意,對於 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 不起作用

您可以在標識符名稱中使用 Unicode,但在包/類名稱或子程序名稱中不行。雖然截至 Perl 5.8.0,對此的一些有限功能是存在的,但那更多是偶然而非設計的;對於這些用途使用 Unicode 是不受支持的。

這種未完成的原因之一是它(目前)固有的不可移植性:由於包名和子程序名可能需要映射到文件和目錄名,文件系統的 Unicode 能力變得重要-- 而不幸的是,目前沒有可移植的答案。

特定平台問題

AIX

舊版 gcc 的 Alpha 系統失敗了幾個測試

如果在 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 編譯器。)

AmigaOS

Perl 5.8.0 在 AmigaOS 上無法建置。在執行 ithreads 工作期間的某個時候它發生了故障,我們找不到 Amiga 專家來解決問題。Perl 5.6.1 仍然可以在 AmigaOS 上運行(5.7.2 開發版本也是如此)。

BeOS

在 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 "無法重新映射"

例如,在為 Cygwin 建置 Tk 擴展時,您可能會收到一條錯誤訊息,說明「無法重新映射」。這是 Cygwin 的已知問題,並且這裡有一個詳細的解決方法:http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html

Cygwin ndbm 測試在 FAT 上失敗

在 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。

DJGPP 失敗

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 使用 ithreads 構建時,讀取大目錄時會核心轉儲

這是 FreeBSD 4.5 版本中 readdir_r() 的已知錯誤,在 FreeBSD 4.6 中已經修復(請參閱 perlfreebsd(README.freebsd))。

FreeBSD ISO 8859-15 地區設定測試 117 失敗

在 FreeBSD 中,ISO 8859-15 地區設定可能會導致測試 117 失敗。這是由於字元 \xFF(帶兩點的 y)和 \xBE(帶兩點的 Y)在不區分大小寫時無法正確匹配。顯然,這個問題已經在最新的 FreeBSD 版本中修復。(http://www.freebsd.org/cgi/query-pr.cgi?pr=34308)

IRIX 失敗於 ext/List/Util/t/shuffle.t 或 Digest::MD5

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)。

HP-UX lib/posix 配置為 LP64 時,子測試 9 失敗

如果 perl 配置為 -Duse64bitall,則 lib/posix 的子測試 10 的成功結果可能會在子測試 9 的成功結果之前到達,這使得測試工具混淆,認為子測試 9 失敗了。

Linux 使用 glibc 2.2.5 在 -Duse64bitint 情況下失敗 t/op/int 子測試 #6

這是 glibc 2.2.5 中關於 long long 整數的已知錯誤。(http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612)

Linux 使用 Sfio 失敗 op/misc 測試 48

沒有已知的修復方法。

Mac OS X

請記得在運行 "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() 調用被發現是不安全的)。

Mac OS X dyld 未定義符號

如果在安裝 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 測試失敗

以下測試在 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

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

在 SCO 3.2v5.0 上已知 socketpair 測試不正常。

ext/Socket/socketpair.t...............FAILED tests 15-45

Solaris 2.5

如果您仍在使用 Solaris 2.5(又名 SunOS 5.5),您可能會在 lib/locale.t 中遇到失敗(測試核心轉儲)。建議解決方案是升級您的 Solaris。

Solaris x86 使用 -Duse64bitint 失敗測試

以下測試在配置為使用 64 位整數的 Perl 中已知在 Solaris x86 上失敗

ext/Data/Dumper/t/dumper.............FAILED at test 268
ext/Devel/Peek/Peek..................FAILED at test 7

SUPER-UX(NEC SX)

以下測試在 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 在 Win32 上無法工作

請使用 Term::ReadKey 2.20 或更新版本。

UNICOS/mk

UTS

有幾個已知的測試失敗。 (注意: 相關信息在 Perl v5.18.0 中刪除了對 UTS 的支持之前,可以在 README.uts 中找到)

VOS(Stratus)

當在 VOS Release 14.5.0 和 GNU C++/GNU Tools 2.0.1 上使用本地構建流程構建 Perl 時,所有嘗試的測試都通過或結果為 TODO(忽略)失敗。

VMS

雖然有許多測試被標記為待辦事項(TODO),指出需要進一步調試和/或移植工作的區域,但使用默認配置應該不會報告任何測試失敗。

Win32

在多CPU框中,I/O緩衝存在一些問題:有些輸出可能會出現兩次。

XML::Parser not working

使用XML::Parser 2.31或更高版本。

z/OS (OS/390)

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構建擴展的能力,而這似乎運行得相當順利)。

Unicode Support on EBCDIC Still Spotty

雖然在大多數情況下工作,但EBCDIC平台上的Unicode支持仍存在問題。已知的一個這樣的問題是對於小於256的代碼點的\p{}\P{}正則表達式構造: pP測試Unicode代碼點,不知道EBCDIC。

Seen In Perl 5.7 But Gone Now

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::ScalarPerlIO::Via(大寫)被重新命名為 PerlIO::scalarPerlIO::via(全小寫)。主要原因是讓所有核心 PerlIO 層的名稱都是全小寫。"插件" 的命名保持不變,例如 PerlIO::via::QuotedPrint

在 5.8.0 版之前,threads::shared::queuethreads::shared::semaphore 被重新命名為 Thread::QueueThread::Semaphore。主要原因是使線程模塊遵循常規命名,Thread::threadsthreads::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 文件以獲取一般信息。

請查閱 ArtisticCopying 文件以獲取版權信息。

歷史

作者是 Jarkko Hietaniemi <jhi@iki.fi>。