目錄

名稱

perl5120delta - Perl v5.12.0的新功能

描述

此文件描述了5.10.0版本和5.12.0版本之間的差異。

5.12.0中的許多錯誤修正已經包含在5.10.1維護版本中。

您可以在5.10.1版本的發布說明中看到這些變更的列表(perl5101delta)。

核心增強功能

新的package NAME VERSION語法

這種新語法允許模塊作者在聲明名稱空間時設置命名空間的$VERSION。它消除了our $VERSION = ...和類似構造的需要。例如:

package Foo::Bar 1.23;
# $Foo::Bar::VERSION == 1.23

這有幾個優點

它不會破壞只有package NAME的舊代碼,但是使用package NAME VERSION的代碼將需要限制為perl 5.12.0或更新版本,這類似於從兩個參數到三個參數的open的更改。需要最新Perl的用戶將受益,也許幾年後,它將成為一種標準做法。

然而,package NAME VERSION需要一種新的“嚴格”版本號格式。有關詳細信息,請參見“版本號格式”

“...”運算符

添加了一個新的運算符,...,暱稱為Yada Yada運算符。它旨在標記尚未實現的佔位代碼。請參見perlop中的“Yada Yada Operator”

隱式嚴格模式

使用版本號大於或等於 5.11.0 的 use VERSION 語法將在語法上啟用嚴格模式,就像 use strict 會做的一樣(除了啟用功能)。以下

use 5.12.0;

表示

use strict;
use feature ':5.12';

Unicode 改進

Perl 5.12 附帶 Unicode 5.2,這是我們在發行時可用的最新版本。此版本的 Unicode 於 2009 年 10 月發布。有關此標準版本的更多詳細信息,請參閱 http://www.unicode.org/versions/Unicode5.2.0。有關安裝和使用其他版本的 Unicode 的說明,請參閱 perlunicode

此外,Perl 的開發人員已大幅改進了 Perl 的 Unicode 實現。有關詳細信息,請參閱下面的 "Unicode 大修"

Y2038 兼容

Perl 的核心與時間相關的功能現在已符合 Y2038。 (對你可能不意味著太多,但你的孩子會喜歡的!)

qr 過載

現在可以過載 qr// 運算子,即轉換為正則表達式,就像已經可以過載對象的布爾值、字符串或數字轉換一樣。當對象出現在 =~ 運算符的右邊時,或者當它被插入到正則表達式中時,將調用它。參見 overload

可插拔關鍵詞

擴展模塊現在可以清晰地鉤入 Perl 解析器,以定義新類型的以關鍵詞為首的表達式和復合語句。關鍵詞後面的語法完全由擴展定義。這允許完全非 Perl 子語言在內聯中進行解析,並生成正確的操作。

有關機制,請參見 Perl 核心源代碼發行版中的 "perlapi 中的 PL_keyword_plugin"。 Perl 核心源分發還包括一個新模塊 XS::APItest::KeywordRPN,它通過可插拔關鍵詞實現了逆波蘭表示法算術。該模塊主要用於測試目的,通常不安裝,但也作為如何使用新機制的示例。

Perl 的開發人員認為此功能是實驗性的。我們可能會在 Perl 5.14 中刪除它或以不向後兼容的方式更改它。

更多內部功能的API

現在語法分析器的最底層和部分 pad 系統都提供了供 XS 擴展使用的 C API。這些API對於支持可插入關鍵字的正確使用是必要的,但也有其他用途。這些新的API是實驗性的,僅涵蓋了應該完全利用核心功能所需的一小部分。預計 Perl 5.13 開發週期將增加一系列清潔、受支持的介面。

Perl 的開發人員認為此功能是實驗性的。我們可能會在 Perl 5.14 中刪除它或以不向後兼容的方式更改它。

可覆寫的函數查找

當擴展模組掛鉤創建 rv2cv ops 以修改子程序查找過程時,現在對於裸字子程序呼叫可以正確工作。這意味著以這種方式引用的子程序的原型將被正確處理。(先前,裸字子程序名稱首先是通過一種不可鉤住的機制進行解析,因此擴展只能正確影響出現帶有 & 符號的子程序名稱。)

可插入方法解析順序的正確介面

從 Perl 5.12.0 開始,提供了一個新的介面,用於插入和使用除了默認的線性深度優先搜索之外的方法解析順序。在 Perl 5.10.0 中添加的 C3 方法解析順序已被重新實現為一個插件,而不會更改其 Perl 空間介面。有關更多信息,請參見 perlmroapi

\N 實驗性正則表達式逃脫

Perl 現在支持 \N,這是一個新的正則表達式逃脫,您可以將其視為 \n 的反向。它將匹配任何不是換行符的字符,與單行匹配修飾符 /s 的存在或缺失無關。它不能在字符類中使用。 \N{3} 表示匹配 3 個非換行符;\N{5,} 表示至少匹配 5 個。 \N{NAME} 仍然表示名為 NAME 的字符或序列,但 NAME 現在不能是像 35, 這樣的東西。

這將破壞一個 自定義字符名轉換器,該轉換器允許使用數字作為字符名,因為現在 \N{3} 將意味著匹配 3 個非換行字符,而不是其名稱為 3 的字符。(Unicode 標準定義的名稱不包含數字,因此只有自定義轉換器可能受到影響。)

Perl的開發者對現有的\N{...}結構可能導致用戶混淆感到有些擔憂,該結構通過其Unicode名稱匹配字符。因此,這個功能是實驗性的。我們可能會在Perl 5.14中刪除它或以不兼容的方式進行更改。

DTrace支援

Perl現在對DTrace提供了一些支援。請參見《INSTALL》中的“DTrace支援”。

在CPAN模塊元數據中支援configure_requires

CPANCPANPLUS現在都支援最近的CPAN發行版中包含的META.yml元數據文件中的configure_requires關鍵字。這允許發行版作者在運行Makefile.PLBuild.PL之前指定必須安裝的配置前提條件。

有關在為CPAN創建發行版時如何指定configure_requires的詳細信息,請參見ExtUtils::MakeMakerModule::Build的文檔。

eachkeysvalues現在更靈活

eachkeysvalues函數現在可以操作於數組上。

when作為一個語句修改器

when現在可以被用作一個語句修改器。

$,的靈活性

變量$,現在可以被綁定。

在when子句中的//

//現在在when子句中的行為類似於||

從您的shell環境啟用警告

您現在可以從PERL5OPT環境變量設置-W

delete local

delete local現在允許您在本地刪除哈希條目。

對抽象命名空間套接字的新支持

抽象命名空間套接字是Linux特有的套接字類型,位於AF_UNIX家族中,稍微濫用它以能夠使用任意字符數組作為地址:它們以空字節開頭,並且不以空字節結尾,而是以傳遞給socket()系統調用的長度結尾。

刪除substr參數的32位限制

現在已經移除對 substr 參數的 32 位元限制。系統的有符號和無符號整數現在都可用於 pos 和 len 參數。

潛在的不相容性變更

預設警告已過時

多年來,Perl 的開發人員出於各種原因棄用了許多語言功能。Perl 現在默認發出警告,如果使用了棄用的語言功能。Perl 現在警告您有關的棄用已經存在多年。您可以在發行版的 perl5xxdelta.pod 檔案中找到每個發行版中棄用的內容清單。

要在特定詞法範圍內禁用此功能,您應該使用 no warnings 'deprecated'; 有關棄用的語言功能及各種棄用警告的解釋,請參閱 perldiag。參見下面的 "棄用" 部分,以查看 Perl 開發人員作為此發行版的一部分棄用的功能和模組清單。

版本號碼格式

可接受的版本號碼格式已經正式化為 "strict" 和 "lax" 規則。package NAME VERSION 採用嚴格的版本號碼。UNIVERSAL::VERSION 和 version 物件建構函式採用寬鬆的版本號碼。提供無效版本將導致致命錯誤。use NAME VERSION 中的版本參數首先解析為數字字面值或 v-字串,然後傳遞給 UNIVERSAL::VERSION(然後必須通過 "lax" 格式測試)。

這些格式在 version 模組中有完整的文件。初步估計,"strict" 版本號碼是一個沒有指數或至少三個組件的小數位數(整數或小數分數)的正數,否則是具有前導 'v' 字元並且至少具有三個組件的點分十進位 v-字串。 "lax" 版本號允許少於三個組件或沒有前導 'v' 的 v-字串。根據 "lax" 規則,小數位數和點分十進位版本可能在小數或點分十進位組件之後通過底線字符分隔的 "alpha" 組件之後具有後綴 "alpha" 組件。

version 模組添加了 version::is_strict 和 version::is_lax 函式來根據這些規則檢查純量。

@INC 重新組織

@INC 中,ARCHLIBPRIVLIB 現在會在目前版本的 site_perlvendor_perl 之後出現。安裝到 site_perlvendor_perl 中的模組將優先於安裝在 ARCHLIBPRIVLIB 中的模組被載入。

正則運算式現在是第一類

在內部,Perl 現在將編譯後的正則運算式(例如使用 qr// 創建的那些)視為第一類實體。需要序列化、反序列化或以其他方式與 Perl 內部數據結構進行深度交互的 Perl 模組需要根據這一變化進行更新。截至本文撰寫時,大多數受影響的 CPAN 模組已經更新。

Switch 陳述式變更

與 Perl 5.10.0 相比,given/when switch 陳述式現在更好地處理複雜的陳述式(這些增強功能也適用於 5.10.1 和後續的 5.10 版本)。現在有兩種新情況,其中 when 現在將其參數解釋為布林值,而不是要用於智能匹配的表達式。

翻轉範圍運算符

..... 翻轉範圍運算符現在在布林上下文中進行評估,遵循它們的通常語義;請參見 "Range Operators" in perlop

請注意,與 perl 5.10.0 一樣,when (1..10) 將無法用於測試給定值是否為介於 1 和 10 之間的整數;您應該改用 when ([1..10])(注意陣列引用)。

然而,與 5.10.0 相反,在布林上下文中評估翻轉範圍運算符確保它現在可以在 when() 中發揮作用,特別是用於實現雙穩態條件,如下所示

when (/^=begin/ .. /^=end/) {
  # do something
}
defined-or 運算符

涉及 defined-or 運算符的復合表達式,如 when (expr1 // expr2),如果第一個表達式是布林值,則將其視為布林。 (這只是將適用於常規或運算符的現有規則擴展,如 when (expr1 || expr2)。)

智能匹配變更

自 Perl 5.10.0 開始,Perl 的開發人員已對智能匹配運算子進行了多項更改。當然,這些更改也會改變智能匹配隱含使用的 switch 陳述式的行為。這些更改也適用於 5.10.1 版本,並將保留在隨後的 5.10 版本中。

類型基於分派的更改

智能匹配運算子 ~~ 不再是交換律的。現在,智能匹配的行為主要取決於其右手參數的類型。此外,在幾種情況下,其語義已經調整以提供更一致或更有用的功能。雖然保留了一般的向後兼容性,但仍需要注意幾個更改

智能匹配運算子的完整分派表在 perlsyn 中的“智能匹配詳細信息” 中給出。

智能匹配和重載

根據基於最右引數類型的調度規則,當物件重載 ~~ 出現在運算子的右側時,重載例程將總是被呼叫(第3個引數設置為true值,參見 overload)。然而,當物件出現在左側時,僅當最右引數是簡單純量時,才會呼叫重載例程。這樣,智慧比對在陣列之間的分配性不會被破壞,以及與複雜類型(程式參考、雜湊、正則表達式)的其他行為。因此,智慧比對的重載例程的撰寫者大多只需關心與純量的比對,以及可能的字串化重載;其他常見情況將自動一致處理。

~~ 現在將拒絕在不重載它的物件上工作(為了避免依賴物件的基礎結構)。 (然而,如果物件重載了字串化或數字化運算子,並且如果重載回退是啟用的,則將使用它,如常。)

其他潛在不相容的變更

已棄用項目

不時地,Perl 的開發人員發現有必要棄用之前作為核心發行版的一部分提供的功能或模組。我們深知對於使用 Perl 構建或維護軟件的開發人員來說,對 Perl 進行向後不兼容的更改可能帶來的痛苦和沮喪。您可以放心,當我們棄用一個功能或語法時,這並不是我們輕率做出的選擇。有時,我們選擇棄用功能或語法是因為發現其設計或實現不佳。有時,這是因為它們阻礙了其他功能的開發或導致性能問題。有時,原因更加複雜。在可能的情況下,我們會盡量保持棄用功能在至少一個主要版本中以其先前的形式提供給開發人員使用。只要棄用的功能不會主動干擾我們維護和擴展 Perl 的能力,我們將盡可能保留它。

現在已棄用以下項目

suidperl

suidperl 不再是 Perl 的一部分。它曾经提供了一种机制来模拟在不正确支持它的系统上的 setuid 权限位。

使用 := 表示空属性列表

Perl 解析器的意外使得这些构造都是等效的

my $pi := 4;
my $pi : = 4;
my $pi :  = 4;

: 视为属性列表的开始,该列表在 = 之前结束。由于这里空格不重要,因此所有的解析为一个空属性列表,因此上述所有内容都等效于,并且最好写为

my $pi = 4;

因为空列表不需要进行属性处理。

现在,这意味着 := 不能用作新的标记,否则会在不知不觉中更改现有代码的含义。因此,该特定形式现在已被弃用,并将成为语法错误。如果绝对需要空属性列表(例如,由于代码生成器的原因),则在 = 前添加一个空格以避免警告。

UNIVERSAL->import()

方法 UNIVERSAL->import() 现已被弃用。尝试向 use UNIVERSAL 语句传递导入参数将导致弃用警告。

使用 "goto" 跳转到构造内部

现已弃用使用 goto 从外部范围跳转到内部范围。这种罕见的用例在作用域的实现中造成问题。

在 \N{name} 中不像名称的自定义字符名称

\N{name} 中,name 几乎可以是任何内容。标准 Unicode 名称的领域非常有限,但自定义名称转换器可以创建完全由标点符号组成的名称,例如。现已弃用创建不以字母开头且不是字母数字的名称,也不包含其他字符,除了空格、破折号、括号和冒号之外的少量字符。由于 \N 的附加含义(请参阅 "\N" 实验性正则表达式转义),看起来像花括号括起来的量词的名称将不起作用。例如,\N{3,4} 现在意味着匹配 3 到 4 个非换行符;在此之前,可以创建一个自定义名称 3,4

已弃用的模块

以下模組將在未來的版本中從核心發行版中移除,應改從 CPAN 安裝。在 CPAN 上需要這些模組的發行版應將它們添加到其先決條件中。這些模組的核心版本將發出棄用警告。

如果您發行 Perl 的封裝版本,無論是獨立地還是作為較大系統的一部分,您都應仔細考慮核心模組棄用的影響。您可能希望考慮將 Perl 的默認版本與一些或全部棄用模組的封裝版一起提供,這些封裝版將安裝到 vendorsite perl 庫目錄中。這將抑制棄用警告。

或者,您可能希望考慮修補 lib/deprecate.pm,以提供與您的封裝系統或 Perl 發行版相關的棄用警告,與您的封裝系統或發行版如何管理從提供給定功能的單個封裝版本的發行版到後來需要知道安裝多個封裝版本以獲得相同功能的發行版的過渡一致。

您可以通過從 CPAN 安裝相關模組來使這些棄用警告消失。要安裝它們的最新版本,只需安裝 Task::Deprecations::5_12

Class::ISA
Pod::Plainer
Shell
Switch

Switch 有錯誤,應該避免使用。您可能會發現 Perl 的新的 given/when 功能是一個合適的替代。更多信息請參見 perlsyn 中的 "Switch statements"

對 $[ 的賦值
在子例程上使用 :locked 屬性
在屬性 pragma 中使用 "locked"
在屬性 pragma 中使用 "unique"
Perl_pmflag

Perl_pmflag 不再是 Perl 的公共 API 的一部分。現在調用它會生成一個棄用警告,並且將在未來的版本中移除。儘管被列為 API 的一部分,但它從未被文檔化,並且只在 toke.c 和 5.10 之前的 regcomp.c 中使用。在核心中,它已被靜態函數取代。

許多 Perl 4 時代的庫

termcap.pl, tainted.pl, stat.pl, shellwords.pl, pwd.pl, open3.pl, open2.pl, newgetopt.pl, look.pl, find.pl, finddepth.pl, importenv.pl, hostname.pl, getopts.pl, getopt.pl, getcwd.pl, flush.pl, fastcwd.pl, exceptions.pl, ctime.pl, complete.pl, cacheout.pl, bigrat.pl, bigint.pl, bigfloat.pl, assert.pl, abbrev.pl, dotsh.pl,和 timelocal.pl 現在都已被棄用。早期,Perl 的開發人員打算在 5.14.0 版本中從 Perl 的核心中刪除這些庫。

在釋出 5.12.0 版本前的最終測試期間,幾位開發人員發現目前的生產代碼使用了這些古老的庫,其中一些還在 Perl 核心內部。因此,Pumpking 允許它們繼續存在。它們將在 5.14.0 版本中開始警告其已廢棄的狀態,並將在 5.16.0 版本中移除。

Unicode 大更新

Perl 的開發人員努力更新 Perl,使其與最新的 Unicode 標準同步。這些變化包括:

Perl 現在可以處理每個 Unicode 字符的屬性。新的文檔 perluniprops 列出了所有可用的非統一漢字字符屬性。默認情況下,perl 不會公開統一漢字、已廢棄或 Unicode 內部屬性。詳細信息請參閱下面的部分,在 pod 中也有一節列出了這些內容,並解釋了為什麼它們不會被公開。

Perl 現在完全支持使用 =: 寫正則表達式的 Unicode 複合風格:\p{property=value}\p{property:value}(兩者意思相同)。

Perl 現在完全支持 \p{...} 構造中大括號內文本的 Unicode 寬鬆匹配規則。此外,Perl 允許數字之間使用下劃線。

Perl 現在接受所有 Unicode 定義的屬性和屬性值的同義詞。

qr/\X/,它與 Unicode 邏輯字符匹配,已擴展以更好地支持各種亞洲語言。它現在被定義為擴展字詞群集。 (請參閱 http://www.unicode.org/reports/tr29/)。任何先前匹配並且有意義的內容將繼續被接受。此外

否則,對於不受影響的語言,此更改應該是透明的。

\p{...} 使用 Canonical_Combining_Class 屬性進行匹配在以前的 Perl 發行版中完全失效。現在它們應該正常工作。

在 Perl 5.12 之前,Unicode 的 Decomposition_Type=Compat 屬性和一個 Perl 擴展具有相同的名稱,這導致兩者都無法匹配所有正確的值(其中一個有超過 100 個錯誤,另一個有幾千個錯誤)。Perl 擴展現在已經更名為 Decomposition_Type=Noncanonical(簡稱:dt=noncanon)。它的含義與之前預期的相同,即所有非規範分解類型的聯集,其中 Unicode Compat 只是其中之一。

\p{Decomposition_Type=Canonical} 現在包括韓文音節。

\p{Uppercase}\p{Lowercase} 現在按照 Unicode 標準的要求工作。這意味著它們各自匹配的字符比以前多一些。

\p{Cntrl} 現在與 \p{Control} 匹配相同的字符。這意味著它不再匹配私有使用(gc=co)、代理(gc=cs)或格式(gc=cf)的字符。格式字符表示可能存在的最大問題。除了 36 個字符外,它們中的所有字符都已經正式棄用或強烈建議不再使用。在這 36 個字符中,可能最廣泛使用的是軟連字號(U+00AD)、BOM、ZWSP、ZWNJ、WJ 和類似字符,以及雙向控制字符。

\p{Alpha} 現在與 \p{Alphabetic} 匹配相同的字符。在 5.12 之前,Perl 的定義包括一些實際上不是字母的事物(所有標記),而省略了許多實際上是字母的事物。 \p{Alnum}\p{Word} 的定義取決於 Alpha 的定義,並相應地發生了變化。

\p{Word} 不再錯誤地匹配非字元字符,如分數。

\p{Print} 不再匹配行控制字符:Tab、LF、CR、FF、VT 和 NEL。這使其符合標準和文檔。

\p{XDigit} 現在與 \p{Hex_Digit} 匹配相同的字符。這意味著除了它目前匹配的字符外,[A-Fa-f0-9],它還將匹配 22 個全角等效字符,例如 U+FF10: FULLWIDTH DIGIT ZERO。

數字類型屬性已擴展以包括 Unihan 字元。

有一個新的 Perl 擴展,名為 'Present_In' 或簡稱 'In' 屬性。這是 Unicode 年齡屬性的擴展,但 \p{In=5.0} 匹配任何其使用已經確定的 Unicode 版本 5.0 的代碼點。 \p{Age=5.0} 僅匹配在 Unicode 版本 5.0 中添加的代碼點。

現在,許多屬性的未分配代碼點都具有正確的值。受影響的屬性包括 Bidi_Class、East_Asian_Width、Joining_Type、Decomposition_Type、Hangul_Syllable_Type、Numeric_Type 和 Line_Break。

Default_Ignorable_Code_Point(預設可忽略程式碼點)、ID_Continue(ID_繼續)和ID_Start(ID 開始)屬性現在已根據當前 Unicode 定義進行了更新。

早期版本的 Perl 誤植了某些應僅供 Unicode 內部使用的屬性。如果啟用,將會在正則表達式中使用這些屬性時生成一條過時警告消息。這些屬性包括:Other_Alphabetic(其他字母)、Other_Default_Ignorable_Code_Point(其他預設可忽略程式碼點)、Other_Grapheme_Extend(其他字符延伸)、Other_ID_Continue(其他 ID 繼續)、Other_ID_Start(其他 ID 開始)、Other_Lowercase(其他小寫)、Other_Math(其他數學)和 Other_Uppercase(其他大寫)。

現在可以根據每個安裝進行更改 Perl 所理解的 Unicode 屬性。如上所述,某些屬性默認已關閉。這些包括所有 Unihan 屬性(應通過 CPAN 模塊 Unicode::Unihan 進行訪問)和 Perl 從未公開的任何過時或僅供 Unicode 內部使用的屬性。

lib/unicore/To 目錄中生成的文件現在標記更清晰,可以直接供應用程序使用。其中的新哈希條目給出了普通條目的格式,這使得機器解析更加容易。Perl 可以為此目錄中的任何屬性生成文件,盡管大多數已被抑制。您可以在 perluniprops 中找到更改指令。

模組和 Pragmata

新模組和 Pragmata

autodie

autodieFatal 模組的新的區域範圍替代方案。捆綁版本為 2.06_01。請注意,在此版本中,當 autodie 生效時,使用字符串評估可能導致 autodie 行為泄漏到周圍範圍。請參閱 "autodie 中的 BUGS" 以獲取更多詳細信息。

版本 2.06_01 已添加到 Perl 核心中。

Compress::Raw::Bzip2

版本 2.024 已添加到 Perl 核心中。

overloading

overloading 允許您在某些或所有操作中區域性地禁用或啟用過載。

版本 0.001 已添加到 Perl 核心中。

parent

parent 在編譯時建立與基類的 ISA 關係。它提供了 base 的主要功能,而不會引入進一步不需要的行為。

版本 0.223 已添加到 Perl 核心中。

Parse::CPAN::Meta

版本 1.40 已添加到 Perl 核心中。

VMS::DCLsym

版本 1.03 已添加到 Perl 核心中。

VMS::Stdio

版本 2.4 已添加到 Perl 核心。

XS::APItest::KeywordRPN

版本 0.003 已添加到 Perl 核心。

更新的 Pragmata

base

從版本 2.13 升級到 2.15。

bignum

從版本 0.22 升級到 0.23。

charnames

charnames 現在包含 Unicode 的 NameAliases.txt 數據庫文件。這將使一些額外的 \N 字符名得到識別,以前不會被識別;例如,"\N{LATIN CAPITAL LETTER GHA}"

從版本 1.06 升級到 1.07。

constant

從版本 1.13 升級到 1.20。

diagnostics

diagnostics 現在在內部支持 %.0f 格式。

diagnostics 不再壓制 Use of uninitialized value in range (or flip) 警告。[perl #71204]

從版本 1.17 升級到 1.19。

feature

feature 中,:5.10:5.10.X 功能捆綁的含義略有變化。如果有的話,最後一個組件(即 X)將被忽略。這是基於一個假設,即新功能一般不會添加到維護版本中。因此,:5.10:5.10.X 具有相同的效果。這是對 5.10.0 文檔中記錄的行為的更改。

feature 現在包括 unicode_strings 功能

use feature "unicode_strings";

此特性打開了對於不具有內部 UTF-8 標誌但包含介於 128 和 255 之間的單字節字符的字符串的 Unicode 語義的支持(uclcucfirstlcfirst)。

從版本 1.11 升級到 1.16。

less

less 現在包括 stash_name 方法,以允許 less 的子類選擇將其 stash 存儲在 %^H 的位置。

從版本 0.02 升級到 0.03。

lib

從版本 0.5565 升級到 0.62。

mro

mro 現在作為 XS 擴展實現。文檔化的接口沒有改變。依賴於某些 mro:: 方法在任何時候都可用的代碼將會“保留兩者”。

從版本 1.00 升級到 1.02。

overload

overload 現在允許對 'qr' 進行過載。

從版本 1.06 升級到 1.10。

threads

從版本 1.67 升級到 1.75。

threads::shared

從版本 1.14 升級到 1.32。

version

version 現在支援本文件及其自身文檔中早期描述的"版本號格式"

從版本 0.74 升級到 0.82。

warnings

warnings 新增了一個 warnings::fatal_enabled() 函數。它還包括了一個新的 illegalproto 警告類別。請參見 "新或更改的診斷" 了解此更改的詳細信息。

從版本 1.06 升級到 1.09。

已更新模組

Archive::Extract

從版本 0.24 升級到 0.38。

Archive::Tar

從版本 1.38 升級到 1.54。

Attribute::Handlers

從版本 0.79 升級到 0.87。

AutoLoader

從版本 5.63 升級到 5.70。

B::Concise

從版本 0.74 升級到 0.78。

B::Debug

從版本 1.05 升級到 1.12。

B::Deparse

從版本 0.83 升級到 0.96。

B::Lint

從版本 1.09 升級到 1.11_01。

CGI

從版本 3.29 升級到 3.48。

Class::ISA

從版本 0.33 升級到 0.36。

注意: Class::ISA 已被棄用,可能會在未來版本中刪除。

Compress::Raw::Zlib

從版本 2.008 升級到 2.024。

CPAN

從版本 1.9205 升級到 1.94_56。

CPANPLUS

從版本 0.84 升級到 0.90。

CPANPLUS::Dist::Build

從版本 0.06_02 升級到 0.46。

Data::Dumper

從版本 2.121_14 升級到 2.125。

DB_File

從版本 1.816_1 升級到 1.820。

Devel::PPPort

從版本 3.13 升級到 3.19。

Digest

從版本 1.15 升級到 1.16。

Digest::MD5

從版本 2.36_01 升級到 2.39。

Digest::SHA

從版本 5.45 升級到 5.47。

Encode

從版本 2.23 升級到 2.39。

Exporter

從版本 5.62 升級到 5.64_01。

ExtUtils::CBuilder

從版本 0.21 升級到 0.27。

ExtUtils::Command

從版本 1.13 升級到 1.16。

ExtUtils::Constant

從版本 0.2 升級到 0.22。

ExtUtils::Install

從版本 1.44 升級到 1.55。

ExtUtils::MakeMaker

從版本 6.42 升級到 6.56。

ExtUtils::Manifest

從版本 1.51_01 升級到 1.57。

ExtUtils::ParseXS

從版本 2.18_02 升級到 2.21。

File::Fetch

從版本 0.14 升級到 0.24。

File::Path

從版本 2.04 升級到 2.08_01。

File::Temp

從版本 0.18 升級到 0.22。

Filter::Simple

從版本 0.82 升級到 0.84。

Filter::Util::Call

從版本 1.07 升級到 1.08。

Getopt::Long

已從版本 2.37 升級至 2.38。

IO

已從版本 1.23_01 升級至 1.25_02。

IO::Zlib

已從版本 1.07 升級至 1.10。

IPC::Cmd

已從版本 0.40_1 升級至 0.54。

IPC::SysV

已從版本 1.05 升級至 2.01。

Locale::Maketext

已從版本 1.12 升級至 1.14。

Locale::Maketext::Simple

已從版本 0.18 升級至 0.21。

Log::Message

已從版本 0.01 升級至 0.02。

Log::Message::Simple

已從版本 0.04 升級至 0.06。

Math::BigInt

已從版本 1.88 升級至 1.89_01。

Math::BigInt::FastCalc

已從版本 0.16 升級至 0.19。

Math::BigRat

已從版本 0.21 升級至 0.24。

Math::Complex

已從版本 1.37 升級至 1.56。

Memoize

已從版本 1.01_02 升級至 1.01_03。

MIME::Base64

已從版本 3.07_01 升級至 3.08。

Module::Build

已從版本 0.2808_01 升級至 0.3603。

Module::CoreList

已從版本 2.12 升級至 2.29。

Module::Load

已從版本 0.12 升級至 0.16。

Module::Load::Conditional

已從版本 0.22 升級至 0.34。

Module::Loaded

已從版本 0.01 升級至 0.06。

Module::Pluggable

已從版本 3.6 升級至 3.9。

Net::Ping

已從版本 2.33 升級至 2.36。

NEXT

已從版本 0.60_01 升級至 0.64。

Object::Accessor

從版本 0.32 升級到 0.36。

Package::Constants

已從版本 0.01 升級至 0.02。

PerlIO

從版本 1.04 升級到 1.06。

Pod::Parser

從版本 1.35 升級到 1.37。

Pod::Perldoc

從版本 3.14_02 升級到 3.15_02。

Pod::Plainer

從版本 0.01 升級到 1.02。

注意: Pod::Plainer 已被棄用,可能會在未來的 Perl 版本中移除。

Pod::Simple

從版本 3.05 升級到 3.13。

Safe

從版本 2.12 升級到 2.22。

SelfLoader

從版本 1.11 升級到 1.17。

Storable

從版本 2.18 升級到 2.22。

Switch

從版本 2.13 升級到 2.16。

注意: Switch 已被棄用,可能會在未來的 Perl 版本中移除。

Sys::Syslog

從版本 0.22 升級到 0.27。

Term::ANSIColor

從版本 1.12 升級到 2.02。

Term::UI

從版本 0.18 升級到 0.20。

Test

從版本 1.25 升級到 1.25_02。

Test::Harness

從版本 2.64 升級到 3.17。

Test::Simple

從版本 0.72 升級到 0.94。

Text::Balanced

從版本 2.0.0 升級到 2.02。

Text::ParseWords

從版本 3.26 升級到 3.27。

Text::Soundex

從版本 3.03 升級到 3.03_01。

Thread::Queue

從版本 2.00 升級到 2.11。

Thread::Semaphore

從版本 2.01 升級到 2.09。

Tie::RefHash

從版本 1.37 升級到 1.38。

Time::HiRes

從版本 1.9711 升級到 1.9719。

Time::Local

從版本 1.18 升級到 1.1901_01。

Time::Piece

從版本 1.12 升級到 1.15。

Unicode::Collate

從版本 0.52 升級到 0.52_01。

Unicode::Normalize

從版本 1.02 升級到 1.03。

Win32

從版本 0.34 升級到 0.39。

Win32API::File

從版本 0.1001_01 升級到 0.1101。

XSLoader

從版本 0.08 升級到 0.10。

已移除的模組與 Pragmata

attrs

從 Perl 核心中移除。之前的版本為 1.02。

CPAN::API::HOWTO

從 Perl 核心中移除。之前的版本為 'undef'。

CPAN::DeferedCode

從 Perl 核心中移除。之前的版本為 5.50。

CPANPLUS::inc

從 Perl 核心中移除。之前的版本為 'undef'。

DCLsym

從 Perl 核心中移除。之前的版本為 1.03。

ExtUtils::MakeMaker::bytes

從 Perl 核心中移除。之前的版本為 6.42。

ExtUtils::MakeMaker::vmsish

從 Perl 核心中移除。之前的版本為 6.42。

Stdio

從 Perl 核心中移除。之前的版本為 2.3。

Test::Harness::Assert

從 Perl 核心中移除。之前的版本為 0.02。

Test::Harness::Iterator

從 Perl 核心中移除。之前的版本為 0.02。

Test::Harness::Point

從 Perl 核心中移除。之前的版本為 0.01。

Test::Harness::Results

從 Perl 核心中移除。之前的版本為 0.01。

Test::Harness::Straps

從 Perl 核心中移除。之前的版本為 0.26_01。

Test::Harness::Util

從 Perl 核心中移除。之前的版本為 0.01。

XSSymSet

已從 Perl 核心中移除。先前版本為 1.1。

已廢棄的模組與語法

請參閱上方的 "已廢棄的模組"

文件

新文件

現有文件的更改

選定的性能增強

安裝和配置改進

內部變更

每個 Perl 的發布版本都會有大量的內部變更,這些變更不應該影響日常使用,但對於使用 Perl 源代碼的開發人員來說仍然是值得注意的。

測試

測試改進

並行測試

核心發行版現在可以在類 Unix 平台上並行運行其回歸測試。不再運行 make test,請在您的環境中設置 TEST_JOBS 為要並行運行的測試數量,然後運行 make test_harness。在 Bourne-like shell 中,可以這樣做

TEST_JOBS=3 make test_harness  # Run 3 tests in parallel

使用環境變量而不是並行 make 本身,因為 TAP::Harness 需要能夠自己安排單個不衝突的測試腳本,而且沒有標準接口可以與它們的作業調度器進行交互。

請注意,目前某些測試腳本可能在並行運行時失敗(特別是 ext/IO/t/io_dir.t)。如有必要,只需再次按順序運行失敗的腳本,並查看失敗是否消失。

測試韌性

現在可以在 t/TEST 中覆蓋 PERL5OPT 和相關參數

測試監控

如果某些測試失敗可能會永遠掛起,現在已經加入了“監控”功能,將在超時後終止它們,這有助於確保 make testmake test_harness 自動完成。

新測試

Perl 的開發人員已經向核心添加了許多新測試。除下面列出的項目外,從 CPAN 更新的許多模塊還包含新測試。

新增或更改的診斷

新增診斷

已更改的診斷信息

許多現有的診斷消息已得到改進或修正。

以下診斷訊息已移除

效用變更

選定的 Bug 修正

平台特定变更

Perl 具有极高的可移植性。一般来说,如果一个平台有一个 C 编译器,那么就有人将 Perl 移植到该平台上(或即将移植)。我们很高兴地宣布,Perl 5.12 支持几个新平台。与此同时,是时候告别一些(非常)老的朋友了。

新平台

Haiku

Perl 的开发人员已经合并了来自 Haiku 维护者的补丁。Perl 现在应该能在 Haiku 上构建。

MirOS BSD

Perl 现在应该能在 MirOS BSD 上构建。

已停用平台

Domain/OS
MiNT
Tenon MachTen

更新的平台

AIX
  • 对于 AIX 5L 和 6.1,移除了 libbsd。只有从 libbsd 中使用了 flock()

  • 如果安装了 libgdbm < 1.8.3-5,将移除 AIX 5L 和 6.1 上的 libgdbm。在 AIX Toolbox 中,libgdbm 作为一个可选包提供。不幸的是,版本低于 1.8.3-5 的版本是有问题的。

  • 提示的更改意味着 AIX 4.2 應該能夠正常運作。

Cygwin
  • Perl 現在在 Cygwin 1.7 及更新版本上支援 IPv6。

  • 在 Cygwin 上,我們現在會從 DLL 中刪除最後一個數字。這已經是 cygwin.com 构建的行為多年來了。提示文件已經更新。

Darwin(Mac OS X)
  • 跳過在 Darwin 10(Mac OS X 10.6)上測試 be_BY.CP1131 地區設置,因為它仍然存在問題。

  • 修正在 Darwin 8 和 9(分別是 Mac OS X 10.4 和 10.5)上用於識別有問題地區設置的正則表達式中的錯誤。

DragonFly BSD
  • 修正了線程庫的選擇 [perl #69686]。

FreeBSD
  • 提示文件現在在 FreeBSD 7 及更新版本上識別正確的線程庫。

Irix
  • 我們現在解決了 Irix 6.5 編譯器中一個奇怪的預處理器錯誤: cc -E - 不幸地進入了 K&R 模式,但是 cc -E file.c 卻不會。

NetBSD
  • 提示現在支援 5.* 版本。

OpenVMS
  • -UDEBUGGING 現在在 VMS 上是默認值。

    就像很久很久以前在其他地方一樣。還使得在 configure.com 中命令行選擇 -UDEBUGGING 和 -DDEBUGGING 成功;在這之前,唯一的關閉方式是在互動問題中選擇否。

  • 在 VMS 上,64 位系統的默認管道緩衝區大小已經更新為 8192。

  • 如果 $/ 設置為數字引用(表示記錄式讀取),則 PerlIO::scalar 的內存臨時文件的讀取將失敗。現在已經修復了這個問題。

  • VMS 現在支援 getgrgid

  • 對 VMS 文件名處理和轉換代碼進行了許多改進和清理。

  • 現在啟用 PERL_VMS_POSIX_EXIT 邏輯名稱會在 VMS 條件值中編碼 POSIX 退出狀態,以更好地與 GNV 的 bash shell 和其他依賴 POSIX 退出值的實用程序進行交互。有關詳細信息,請參見 perlvms 中的 "$?"

  • File::Copy 現在在 VMS 上檢測到 Unix 兼容模式。

Stratus VOS
  • 各種從Stratus衍生的變更已經合併。

Symbian
  • 現在支援Symbian S60 3.2 SDK和S60 5.0 SDK。

Windows
  • Perl 5.12支援Windows 2000及更高版本。對於舊版Windows的支援代碼仍然包含在內,但將在下一個開發周期中移除。

  • 現在提供使用MinGW-w64構建Perl的初始支援。

  • perl.exe現在包含一個清單資源,用於指定Windows Vista及更高版本的trustInfo設置。沒有這個設置,Windows將會將perl.exe視為舊版應用程式,並應用各種啟發式,例如將對受保護的文件系統區域(如“Program Files”文件夾)的訪問重定向到用戶的“VirtualStore”,而不是生成適當的“權限被拒絕”錯誤。

    清單資源還會要求Microsoft Common-Controls版本6.0(Windows XP引入的主題控制)。請查看CPAN上的Win32::VisualStyles模組,以切換回舊式未主題化控制,以供舊版應用程式使用。

  • -t檔案測試運算符現在只有在文件處理程序連接到控制台窗口時才返回true。在以前的Perl版本中,它將對所有字符模式設備返回true,包括NULLPT1

  • -p檔案測試運算符現在正常工作,並且在使用Microsoft Visual C編譯Perl時定義了Fcntl::S_IFIFO常數。在以前的Perl版本中,-p始終返回false值,並且未定義Fcntl::S_IFIFO常數。

    此錯誤特定於Microsoft Visual C,從未影響使用MinGW構建的Perl二進制文件。

  • 現在更廣泛地支援套接字錯誤代碼:POSIX模塊將定義符號名稱,例如POSIX::EWOULDBLOCK,並且$!中的套接字錯誤代碼的字串化也正常工作;

    C:\>perl -MPOSIX -E "$!=POSIX::EWOULDBLOCK; say $!"
    A non-blocking socket operation could not be completed immediately.
  • flock()現在會在$!中設置明智的錯誤代碼。以前的Perl版本將$^E的值複製到$!中,這導致了很多混亂。

  • select()現在更正確地支援所有空的fd_set

  • '.\foo''..\foo'dorequire中與'./foo''../foo'被處理方式不同[RT #63492]。

  • 改進的消息窗口處理意味著在競爭條件下alarmkill消息將不再丟失。

  • Perl 的建構基礎設施在發布時不再轉換為 win32 行結尾。如果這對您造成困擾,請使用隨 perl 附帶的 perlbug 程式報告問題。

已知問題

這是一些重要但未修復的 bug 清單,這些 bug 是從 5.10.x 或 5.8.x 版本中產生的回歸。

勘誤

致謝

Perl 5.12.0 自 Perl 5.10.0 以來約兩年的開發,包含超過 750,000 行的變更,跨越 3,000 多個文件,由 200 多位作者和提交者貢獻。

Perl 在第三個十年中繼續蓬勃發展,這要歸功於活躍的使用者和開發者社區。以下人員已知貢獻了成為 Perl 5.12.0 的改進

Aaron Crane, Abe Timmerman, Abhijit Menon-Sen, Abigail, Adam Russell, Adriano Ferreira, Ævar Arnfjörð Bjarmason, Alan Grover, Alexandr Ciornii, Alex Davies, Alex Vandiver, Andreas Koenig, Andrew Rodland, andrew@sundale.net, Andy Armstrong, Andy Dougherty, Jose AUGUSTE-ETIENNE, Benjamin Smith, Ben Morrow, bharanee rathna, Bo Borgerson, Bo Lindbergh, Brad Gilbert, Bram, Brendan O'Dea, brian d foy, Charles Bailey, Chip Salzenberg, Chris 'BinGOs' Williams, Christoph Lamprecht, Chris Williams, chromatic, Claes Jakobsson, Craig A. Berry, Dan Dascalescu, Daniel Frederick Crisman, Daniel M. Quinlan, Dan Jacobson, Dan Kogai, Dave Mitchell, Dave Rolsky, David Cantrell, David Dick, David Golden, David Mitchell, David M. Syzdek, David Nicol, David Wheeler, Dennis Kaarsemaker, Dintelmann, Peter, Dominic Dunlop, Dr.Ruud, Duke Leto, Enrico Sorcinelli, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frank Wiegand, Gabor Szabo, Gene Sullivan, Geoffrey T. Dairiki, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Graham Barr, Green, Paul, Hans Dieter Pearcey, Harmen, H. Merijn Brand, Hugo van der Sanden, Ian Goodacre, Igor Sutton, Ingo Weinhold, James Bence, James Mastros, Jan Dubois, Jari Aalto, Jarkko Hietaniemi, Jay Hannah, Jerry Hedden, Jesse Vincent, Jim Cromie, Jody Belka, John E. Malmberg, John Malmberg, John Peacock, John Peacock via RT, John P. Linderman, John Wright, Josh ben Jore, Jos I. Boumans, Karl Williamson, Kenichi Ishigaki, Ken Williams, Kevin Brintnall, Kevin Ryde, Kurt Starsinic, Leon Brocard, Lubomir Rintel, Luke Ross, Marcel Grünauer, Marcus Holland-Moritz, Mark Jason Dominus, Marko Asplund, Martin Hasch, Mashrab Kuvatov, Matt Kraai, Matt S Trout, Max Maischein, Michael Breen, Michael Cartmell, Michael G Schwern, Michael Witten, Mike Giroux, Milosz Tanski, Moritz Lenz, Nicholas Clark, Nick Cleaton, Niko Tyni, Offer Kaye, Osvaldo Villalon, Paul Fenwick, Paul Gaborit, Paul Green, Paul Johnson, Paul Marquess, Philip Hazel, Philippe Bruhat, Rafael Garcia-Suarez, Rainer Tammer, Rajesh Mandalemula, Reini Urban, Renée Bäcker, Ricardo Signes, Ricardo SIGNES, Richard Foley, Rich Rauenzahn, Rick Delaney, Risto Kankkunen, Robert May, Roberto C. Sanchez, Robin Barker, SADAHIRO Tomoyuki, Salvador Ortiz Garcia, Sam Vilain, Scott Lanning, Sébastien Aperghis-Tramoni, Sérgio Durigan Júnior, Shlomi Fish, Simon 'corecode' Schubert, Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steffen Ullrich, Stepan Kasal, Steve Hay, Steven Schubiger, Steve Peters, Tels, The Doctor, Tim Bunce, Tim Jenness, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tom Wyant, Tony Cook, Torsten Schoenfeld, Tye McQueen, Vadim Konovalov, Vincent Pit, Hio YAMASHINA, Yasuhiro Matsumoto, Yitzchak Scott-Thoennes, Yuval Kogman, Yves Orton, Zefram, Zsban Ambrus

這是非常不完整的,因為它是從版本控制歷史自動生成的。特別是,它不包括那些在以前版本的 Perl 中報告問題並幫助改進 Perl 5.12.0 的(非常感謝的)貢獻者的名字。要查看 Perl 所有歷史貢獻者的更完整清單,請參閱 Perl 5.12.0 發行中的 AUTHORS 檔案。

我們的「退休」核心開發者 Nicholas Clark 和 Rafael Garcia-Suarez 應特別致謝他們的卓越和實質性持續貢獻。Nicholas 自 5.10.0 以來個人編寫了超過 30% 的補丁。Rafael 在補丁作者中排名第二,佔 11%,但在提交他人編寫的補丁後排名第一,佔提交的 44%,並且通常在提供大量指導後提交補丁作者的補丁。這些統計數據絕不涵蓋他們所有的貢獻,但以簡短方式表達了沒有他們我們無法完成這一切。

這個版本中包含的許多變更源於 Perl 核心中包含的 CPAN 模組。我們感謝整個 CPAN 社區幫助 Perl 蓬勃發展。

報告錯誤

如果您發現了您認為是一個錯誤,您可以檢查最近在 comp.lang.perl.misc 新聞群組和 Perl bug 資料庫發表的文章,網址為 http://rt.perl.org/perlbug/。在 http://www.perl.org/ 也許有相關資訊,這是 Perl 的首頁。

如果您認為您發現了一個未報告的錯誤,請執行隨附您版本的 perlbug 程式。請確保將您的錯誤減少到一個足夠小但具有代表性的測試案例。您的錯誤報告連同 perl -V 的輸出將被發送到 perlbug@perl.org,以便由 Perl 移植團隊進行分析。

如果您要報告的錯誤具有安全性影響,使其不適合發送到公開存檔的郵件列表,請將其發送至 perl5-security-report@perl.org。這將指向一個封閉的訂閱未存檔的郵件列表,其中包括所有核心貢獻者,他們將能夠幫助評估問題的影響,找出解決方案,並協調發布修補程式,以減輕或解決所有 Perl 支援的平台上的問題。請只將此地址用於 Perl 核心的安全問題,不要用於獨立在 CPAN 上分發的模組。

參見

用於查看變更的詳細資訊的 Changes 檔案的解釋。

用於建置 Perl 的 INSTALL 檔案。

一般資訊的 README 檔案。

版權資訊的 ArtisticCopying 檔案。

http://dev.perl.org/perl5/errata.html 提供了此版本後發現的問題列表,以及已知不相容此版本的 CPAN 模組列表。