perl5200delta - perl v5.20.0 的新功能
本文描述了 5.18.0 版本與 5.20.0 版本之間的差異。
如果您從較早版本升級,如 5.16.0,請首先閱讀 perl5180delta,其中描述了 5.16.0 與 5.18.0 之間的差異。
將參數列表展開為詞法變量的聲明性語法。 sub foo ($a,$b) {...}
檢查參數數量並將參數放入詞法變量中。簽名與現有的 sub foo { my($a,$b) = @_; ... }
惯用法不等同。只有在啟用非默認功能時才可使用簽名,並會產生關於實驗性的警告。啟用簽名時,原型的語法衝突通過禁用簽名時的短原型語法來管理。
詳情請參見 perlsub 中的"Signatures"。
sub
現在帶有prototype
屬性在聲明或定義 sub
時,現在可以在名稱後的括號中指定原型,而不是在括號內指定。
例如,sub foo($$){}
可以重寫為 sub foo : prototype($$){}
。
多個分號在子程序原型中一直被容忍並被視為單個分號。唯一的例外是這種情況。以 "*" 或 ";*" 開頭的子程序可能會影
空格長期以來一直允許在子程式原型中存在,因此 sub( $ $ )
等同於 sub($$)
,但是直到現在,在解析子程式時,空格會被去除。因此,以前由 Scalar::Util::set_prototype
設置的原型中不允許空格。現在允許,並且解析器不再去除空格。這意味著 prototype &mysub
返回原始原型,包括空格。
rand
現在使用一致的隨機數生成器以前,perl 將使用特定於平台的隨機數生成器,從 libc 的 rand()、random() 到 drand48() 不等。
這意味著 perl 的隨機數質量會因平台而異,從 Windows 上的 15 位 rand() 到像 Linux 上的 drand48() 這樣的 POSIX 平台上的 48 位。
Perl 現在在所有平台上使用自己內部的 drand48() 實現。這並不意味著 perl 的 rand
具有加密安全性。[perl #115928]
新的 %hash{...}
和 %array[...]
語法返回一個鍵/值(或索引/值)對列表。請參見perldata 中的“鍵/值哈希切片”。
當啟用 postderef
功能時,將設置以下語法等價性
$sref->$*; # same as ${ $sref } # interpolates
$aref->@*; # same as @{ $aref } # interpolates
$href->%*; # same as %{ $href }
$cref->&*; # same as &{ $cref }
$gref->**; # same as *{ $gref }
$aref->$#*; # same as $#{ $aref }
$gref->*{ $slot }; # same as *{ $gref }{ $slot }
$aref->@[ ... ]; # same as @$aref[ ... ] # interpolates
$href->@{ ... }; # same as @$href{ ... } # interpolates
$aref->%[ ... ]; # same as %$aref[ ... ]
$href->%{ ... }; # same as %$href{ ... }
標記為內插的僅在關聯的 postderef_qq
功能也啟用時進行內插。該功能是 實驗性的,在使用時將觸發 experimental::postderef
類別的警告,除非它們被抑制。
有關更多信息,請參閱perlref 中的後置解參照語法部分。
Perl 現在支持並隨附 Unicode 6.3(儘管 Perl 也可以重新編譯為任何先前的 Unicode 版本)。Unicode 6.3 變更的詳細列表在http://www.unicode.org/versions/Unicode6.3.0/。
\p{Unicode}
正則表達式模式屬性這是 \p{Any}
的同義詞,匹配範圍為 Unicode 定義的 0 - 0x10FFFF 的一組代碼點。
在 64 位平台上,內部數組函數現在使用 64 位偏移,允許 Perl 數組容納超過 2**31 個元素,如果您有可用的內存。
正則表達式引擎現在支持長度超過 2**31 字符的字符串。[perl #112790, #116907]
函數 PerlIO_get_bufsiz、PerlIO_get_cnt、PerlIO_set_cnt 和 PerlIO_set_ptrcnt 現在返回值和參數為 SSize_t,而不是 int。
use locale
現在適用於 UTF-8 地區設置在此版本之前,僅支持單字節地區設置,如 ISO 8859 系列。現在,越來越普遍的多字節 UTF-8 地區設置也得到支持。 UTF-8 地區設置是指字符集為 Unicode,編碼為 UTF-8 的地區設置。在此類地區設置下,POSIX LC_CTYPE
類別操作(大小寫轉換(如 lc()
,"\U"
),字符分類(\w
,\D
,qr/[[:punct:]]/
))的行為就像沒有地區設置一樣,而是像 use feature 'unicode_strings'
一樣,只是遵循了責任規則。排序在此版本中仍按照代碼點順序進行。[perl #56820]。
use locale
現在可以在不具有地區能力的系統上編譯以前這樣做會導致程序無法編譯。在其作用域內,程序的行為就像在“C”地區設置下一樣。因此,為支持地區的平台編寫的程序可以在沒有地區設置的平台上運行而無需更改。當然,試圖將地區設置更改為非“C”地區設置將失敗。
如果在 Perl 啟動期間出現區域設定錯誤,它將立即放棄並嘗試使用 "C"
區域。現在它首先嘗試使用環境變數給定的其他區域,詳細信息請參閱 "perllocale" 中的 "ENVIRONMENT"。例如,如果 LC_ALL
和 LANG
都被設置,且使用 LC_ALL
區域失敗,Perl 現在將嘗試使用 LANG
區域,僅在該操作失敗後才會回退到 "C"
。在 Windows 機器上,如果所有環境變數給定的區域失敗,Perl 將在使用 "C"
之前嘗試系統默認區域。
-DL
运行时选项用于跟踪區域設定這是為了幫助 Perl 核心開發人員在現場調試有關區域的錯誤。
以前,沒有 -a 的 -F 是無操作的,而沒有 -n 或 -p 的 -a 也是無操作的。有了這個改變,如果您提供了 -F,則會隱含使用 -a 和 -n,如果您提供了 -a,則會隱含使用 -n。
您仍然可以使用 -p 進行額外的行為。[perl #116190]
在 sort
中使用的特殊變量 $a 和 $b 現在免於 "used once" 警告,即使 sort
沒有使用。這使得 CPAN 模塊更容易提供使用 $a 和 $b 進行相似用途的功能。[perl #120462]
在 Perl 程序以 heredoc 結束並且磁盤上的最後一行沒有終止的換行符的不尋常情況下,可能會讀取已釋放的記憶體。這現在已經修復。
do
現在不能用於調用子程序自 Perl v5.0.0 以來,do SUBROUTINE(LIST)
形式已經產生過時警告,現在是語法錯誤。
在雙引號字串("..." 或 qq(...))或正規表示式中的 \c
後面的字元現在必須是可列印字元,不能是 {
。
\B
或 \b
後面的文字 {
現在會導致致命錯誤。
這些在 perl v5.14.0 中已經被廢棄。
這影響了正規表示式匹配和在 use locale
範圍內改變字符串大小寫(lc
, "\U"
, 等等)。根據文件(perlsec、perllocale 中的 "SECURITY")的說明,結果現在基於操作而被汙染,無論字符串的內容是什麼。以前,在大小寫變更操作中,如果字符串不包含任何可能受地域設置影響的字符,則結果將不被汙染。例如,對於空字符串或僅包含上拉丁1代碼點的字符串的 uc()
現在會被汙染,而以前不會。這導致了更一致的汙染結果。正規表示式模式會汙染其非二進制結果(如 $&
, $2
),僅當該模式包含依賴於當前(可能被汙染)地域的匹配元素時。與大小寫變更函數一樣,字符串的實際內容現在不再重要,而以前是。例如,如果模式包含 \w
,則結果將被汙染,即使匹配不需要使用該模式的部分來成功或失敗,因為 \w
的匹配取決於地域。但是,例如,模式中的 .
不會啟用汙染,因為點匹配任何單個字符,而當前地域不會以任何方式改變匹配和不匹配。
\p{}
, \P{}
的匹配方式已經改變,針對非 Unicode 代碼點。\p{}
和 \P{}
只在 Unicode 定義的代碼點(U+0000
到 U+10FFFF
)上被 Unicode 定義。 它們在匹配這些合法的 Unicode 代碼點時的行為保持不變,但是對於代碼點 0x110000
及以上的情況有所更改。 以前,Perl 將匹配 \p{}
和 \P{}
得到的結果對待為 undef
,這導致結果為“false”。 對於 \P{}
,這被補充為“true”。 當發生這種情況時,應該會發出警告。 但是,各種優化可能會防止出現警告,結果通常是反直覺的,匹配及其看似的補充都是 false。 現在,所有非 Unicode 代碼點都被視為典型的未分配 Unicode 代碼點。 這通常更符合 Do-What-I-Mean。 只有在結果與嚴格的 Unicode 方法可能不同以及與 Perl 以前的做法可能不同時才會發出警告。 需要嚴格遵守 Unicode 標準的代碼可以使此警告變為致命,然後 Perl 始終會發出警告。
詳細信息請參閱 "Beyond Unicode code points" in perlunicode。
\p{All}
已擴展為匹配所有可能的代碼點Perl 定義的正則表達式模式元素 \p{All}
,在 CPAN 上未使用,以前僅匹配 Unicode 代碼點; 現在它匹配所有可能的代碼點; 也就是說,它等同於 qr/./s
。 因此,\p{All}
不再等同於 \p{Any}
,\p{Any}
繼續僅匹配 Unicode 代碼點,正如 Unicode 所說明的那樣。
根據 Data::Dumper 轉儲的數據結構和設置,轉儲的輸出可能與以前的版本不同。
如果您的測試取決於 Data::Dumper 的確切輸出,則可能會失敗。
為了避免這個問題,請在代碼中對比評估轉儲結構後的數據結構,而不是對比轉儲本身。
use locale
scope這實際上是一個錯誤修正,但一些程式碼已經依賴於該錯誤的存在,因此此更改在此列出。程式執行時的當前語言環境不應該對 Perl 程式碼可見,除非在 use locale
範圍內。然而,直到現在,在某些情況下,用於小數點的字元(通常是逗號)會泄漏到範圍之外。如果您的程式碼受到此更改的影響,只需添加一個 use locale
即可。
在以前的 Perl 版本中,Windows sockets 錯誤代碼由 WSAGetLastError() 返回,並將其分配給 $!,而某些常數(如 VC++(或各種 Windows 版本的 gcc)中的 ECONNABORTED)未在 errno.h 中定義,但被定義為對應的 WSAE* 值,以便允許對 $! 進行 E* 常數的測試,這些常數由 Errno 和 POSIX 匯出。
這在之前的版本中運作良好,直到 VC++ 2010 及之後引入了新的 E* 常數並賦予值 > 100 到 errno.h 中,其中一些被 perl 重新定義為 WSAE* 值。這在將 XS 程式碼與其他使用原始 errno.h 常數定義的庫進行鏈接時導致問題。
為了避免此不相容性,perl 現在會將 WSAE* 錯誤代碼映射到可能的 E* 值,並將這些值分配給 $!。由 Errno 和 POSIX 匯出的 E* 常數已經更新以匹配,以便對其進行測試 $!,在先前可能的情況下,將繼續按預期工作,並且現在將 errno.h 中找到的所有 E* 常數以其原始 errno.h 值匯出。
為了避免現有的 Perl 程式碼中出現問題,將 WSAE* 值分配給 $!,perl 現在會攔截分配並執行與內部分配給 $! 本身時相同的映射到 E* 值的操作。
然而,仍然存在一個向後不相容性問題:現有的 Perl 代碼將 $! 與以前分配給 $! 的 WSAE* 錯誤碼的數值進行比較,將在已經分配了相應的 E* 值的情況下出現問題。對於那些 E* 值 < 100,這只是一個問題,這些值始終從 Errno 和 POSIX 中導出它們的原始 errno.h 值,因此不能用於 WSAE* 錯誤碼測試(例如,WSAEINVAL 是 10022,但相應的 EINVAL 是 22)。 (如果存在 E* 值 > 100,則已重新定義為 WSAE* 值,因此可以通過使用 E* 常量來實現兼容性,這將在此更改之前和之後都有效,儘管在底層使用不同的數值。)
PerlIO_vsprintf
和 PerlIO_sprintf
已被移除這兩個函數沒有文檔,並且在 CPAN 中未使用,存在問題,因此已被移除。
/\C/
字符類別 /\C/
的正則表達式已被棄用。從 perl 5.22 開始,它將產生警告,並且從 perl 5.24 開始,它將成為正則表達式編譯器錯誤。如果您需要檢查構成 UTF8 編碼字符的個別字節,則首先對字符串(或其副本)使用 utf8::encode()
。
此棄用項目會影響到類似 $\cT 的東西,其中 \cT 是源代碼中的文字控制(例如 NAK
或 NEGATIVE ACKNOWLEDGE
字符)。令人驚訝的是,最初這似乎是訪問像 $^T 這樣的變量的規範方式,而插入符號形式只是作為一種替代方式添加的。
文字控制形式之所以被棄用,主要有兩個原因。它們可能存在無法修復的錯誤,例如 $\cI 未作為 $^I 的別名工作,而且它們的使用不可移植到非 ASCII 平台:雖然 $^T 將在所有地方都起作用,但 \cT 在 EBCDIC 中是空格。 [perl #119123]
$/
中引用非整數和非正整數將 $/
設置為零的引用或負整數的引用現在已被棄用,並且將 完全 與設置為 undef
的行為相同。如果您希望實現吸入行為,請將 $/
明確設置為 undef
。
設定 $/
為非整數的參照現已被禁止,並將引發錯誤。Perl 從未記錄在此情況下會發生什麼,雖然它曾經的行為與將來將會如何設定 $/
為參照的地址相同,但我們已禁止此用法。
在 POSIX
模組中使用以下任何函數現已被棄用:isalnum
, isalpha
, iscntrl
, isdigit
, isgraph
, islower
, isprint
, ispunct
, isspace
, isupper
和 isxdigit
。這些函數存在錯誤並且無法在 UTF-8 編碼的字串上正常工作。有關更多信息,請參閱它們在 POSIX 中的條目。
在代碼中的每個調用它們的地方,第一次調用任何一個函數都會引發警告。(因此,在循環中的重複語句將僅引發一次警告。)
Perl 提供的“基於解釋器的線程”並不是人們可能期望或希望的快速、輕量級的多任務系統。線程的實現方式使它們容易被誤用。很少有人知道如何正確使用它們或能夠提供幫助。
在 perl 中使用基於解釋器的線程現已正式不再鼓勵使用。
以下模組將在將來的版本中從核心發行版中移除,屆時將需要從 CPAN 安裝。在 CPAN 上需要這些模組的發行版將需要將它們列為先決條件。
這些模組的核心版本現在將發出“棄用”
類別的警告,以提醒您此事實。要消除這些棄用警告,請從 CPAN 安裝相應的模組。
請注意,這些模組從核心中移除的計劃不反映代碼質量的判斷,也不應該被解釋為建議停止使用它們。它們從核心中移除主要取決於它們對啟動一個完全功能的、支持 CPAN 的 Perl 安裝的必要性,而不是對其設計的考慮。
以下實用工具將在未來的版本中從核心發行版中移除,屆時將需要從 CPAN 安裝。
Perl 新增了一種新的複製時寫入機制,當從一個純量賦值給另一個純量時,避免了需要複製內部字串緩衝區的必要。這使得複製大型字串看起來更快。在賦值後修改其中一個(或多個)字串將強制內部複製。這使得為了效率而傳遞字串時不需要通過參考。
此功能已經在 5.18.0 中可用,但並未默認啟用。現在已成為默認值,因此您不再需要使用 Configure 參數構建 perl。
-Accflags=-DPERL_NEW_COPY_ON_WRITE
可以在 perl 構建中(暫時)禁用此功能
-Accflags=-DPERL_NO_COW
在某些操作系統上,Perl 可以編譯成這樣的方式,任何試圖修改被多個 SVs 共享的字串緩衝區的嘗試都將導致崩潰。這樣 XS 作者可以測試其模塊是否正確處理複製時寫入純量。有關詳細信息,請參見 "Copy on Write" in perlguts。
Perl 具有正則表達式模式的優化器。它分析模式以查找諸如匹配所需的最小長度等信息。它現在更好地處理位於 Latin1 範圍之外的代碼點。
在幾種情況下,執行包含 ^
定位符(或其在 /m
標誌下的變體)的正則表達式將變得更快。
在方法查找期間,現在在更多地方使用了預先計算的哈希值。
常數哈希鍵查找($hash{key}
而不是 $hash{$key}
)一直在編譯時計算內部哈希值,以加快查找速度。此優化現在也應用於哈希切片。
在空上下文中組合 and
和 or
運算符,例如對於生成的 unless ($a && $b)
和 if ($a || b)
,現在直接短路到語句的末尾。[perl #120128]
在某些情況下,當 return
是子例程主作用域中的最後一條語句時,它將被優化掉。這意味著像這樣的代碼現在將行為如下
sub baz { return $cat; }
將像下面這樣
sub baz { $cat; }
這顯著地更快。
[perl #120765]
像這樣的程式碼
my $x; # or @x, %x
my $y;
現在被優化為
my ($x, $y);
結合在 v5.18.0 中介紹的 padrange 優化,這意味著更長的未初始化的 my 變數聲明也被優化了,因此
my $x; my @y; my %z;
變成
my ($x, @y, %z);
[perl #121077]
某些類型的列表的創建,包括數組和哈希切片,現在更快了。
對於使用小常數整數索引的數組的優化現在適用於範圍為 -128..127 的整數,而不是 0..255。這應該會加速使用像 $x[-1]
這樣的表達式的 Perl 代碼,但會以 (可能更罕見的) 使用像 $x[200]
的代碼為代價。
對於一個大哈希的第一次迭代(使用 keys
或 each
)現在更快了。這是通過預先分配哈希的內部迭代器狀態來實現的,而不是在首次迭代哈希時才懶惰地創建它。(對於小哈希,迭代器仍然僅在首次需要時創建。假設是小哈希更可能用作對象,因此從不分配。對於大哈希,這種情況不太可能發生,而分配迭代器的成本被分配哈希本身的成本淹沒了。)
在對來自 readline
或 <>
運算符的字符串進行全局正則表達式匹配時,數據不再被不必要地複製。[perl #121259]
當 $obj
是一個具有重載方法但沒有重載解引用方法 @{}
、%{}
等的類的實例時,解引用(如 $obj->[0]
或 $obj->{k}
)現在更快了。
Perl 的優化器不再跳過在某些 eval {}
表達式之後的代碼的優化(包括那些具有明顯無限循環的代碼)。
實現現在在運行時更好地避免無意義的工作。內部無效的「空」操作(在解析 Perl 程序時的副作用)通常在編譯期間被刪除。現在在一些以前未處理的情況下也應用了該刪除。
當處理涵蓋連續三個範圍的 Unicode 屬性時,Perl 現在在處理磁盤 I/O 時更少。
experimental 0.007 已添加到 Perl 核心。
IO::Socket::IP 0.29 已添加到 Perl 核心。
Archive::Tar 已從版本 1.90 升級至 1.96。
arybase 已從版本 0.06 升級至 0.07。
Attribute::Handlers 已從版本 0.94 升級至 0.96。
attributes 已從版本 0.21 升級至 0.22。
autodie 已從版本 2.13 升級至 2.23。
AutoLoader 已從版本 5.73 升級至 5.74。
autouse 已從版本 1.07 升級至 1.08。
B 已從版本 1.42 升級至 1.48。
B::Concise 已從版本 0.95 升級至 0.992。
B::Debug 已從版本 1.18 升級至 1.19。
B::Deparse 已從版本 1.20 升級至 1.26。
base 已從版本 2.18 升級至 2.22。
Benchmark 已從版本 1.15 升級至 1.18。
bignum 已從版本 0.33 升級至 0.37。
Carp 已從版本 1.29 升級至 1.3301。
charnames 已從版本 1.36 升級至 1.40。
Class::Struct 已從版本 0.64 升級至 0.65。
Compress::Raw::Bzip2 已從版本 2.060 升級至 2.064。
Compress::Raw::Zlib 已從版本 2.060 升級至 2.065。
Config::Perl::V 已從版本 0.17 升級至 0.20。
constant 已從版本 1.27 升級至 1.31。
CPAN 已從版本 2.00 升級至 2.05。
CPAN::Meta 已從版本 2.120921 升級至 2.140640。
CPAN::Meta::Requirements 已從版本 2.122 升級至 2.125。
CPAN::Meta::YAML 已從版本 0.008 升級至 0.012。
Data::Dumper 已從版本 2.145 升級至 2.151。
DB 已從版本 1.04 升級至 1.07。
DB_File 已從版本 1.827 升級至 1.831。
DBM_Filter 已從版本 0.05 升級至 0.06。
deprecate 已從版本 0.02 升級至 0.03。
Devel::Peek 已從版本 1.11 升級至 1.16。
Devel::PPPort 已從版本 3.20 升級至 3.21。
diagnostics 已從版本 1.31 升級至 1.34。
Digest::MD5 已從版本 2.52 升級至 2.53。
Digest::SHA 已從版本 5.84 升級至 5.88。
DynaLoader 已從版本 1.18 升級至 1.25。
Encode 已從版本 2.49 升級至 2.60。
encoding 已從版本 2.6_01 升級至 2.12。
English 已從版本 1.06 升級至 1.09。
$OLD_PERL_VERSION
被添加為 $]
的別名。
Errno 已從版本 1.18 升級至 1.20_03。
Exporter 已從版本 5.68 升級至 5.70。
ExtUtils::CBuilder 已從版本 0.280210 升級至 0.280216。
ExtUtils::Command 已從版本 1.17 升級至 1.18。
ExtUtils::Embed 已從版本 1.30 升級至 1.32。
ExtUtils::Install 已從版本 1.59 升級至 1.67。
ExtUtils::MakeMaker 已從版本 6.66 升級至 6.98。
ExtUtils::Miniperl 已從版本升級至 1.01。
ExtUtils::ParseXS 已從版本 3.18 升級至 3.24。
ExtUtils::Typemaps 已從版本 3.19 升級至 3.24。
ExtUtils::XSSymSet 已從版本 1.2 升級至 1.3。
feature 已從版本 1.32 升級至 1.36。
fields 已從版本 2.16 升級至 2.17。
File::Basename 已從版本 2.84 升級至 2.85。
File::Copy 已從版本 2.26 升級至 2.29。
File::DosGlob 已從版本 1.10 升級至 1.12。
File::Fetch 已從版本 0.38 升級至 0.48。
File::Find 已從版本 1.23 升級至 1.27。
File::Glob 已從版本 1.20 升級至 1.23。
File::Spec 已從版本 3.40 升級至 3.47。
File::Temp 已從版本 0.23 升級至 0.2304。
FileCache 已從版本 1.08 升級至 1.09。
Filter::Simple 已從版本 0.89 升級至 0.91。
Filter::Util::Call 已從版本 1.45 升級至 1.49。
Getopt::Long 已從版本 2.39 升級至 2.42。
Getopt::Std 已從版本 1.07 升級至 1.10。
Hash::Util::FieldHash 已從版本 1.10 升級至 1.15。
HTTP::Tiny 已從版本 0.025 升級至 0.043。
I18N::Langinfo 已從版本 0.10 升級至 0.11。
I18N::LangTags 已從版本 0.39 升級至 0.40。
if 已從版本 0.0602 升級至 0.0603。
inc::latest 已從版本 0.4003 升級至 0.4205。注意:inc::latest 已被標記為過時,可能在未來的 Perl 版本中被移除。
integer 已從版本 1.00 升級至 1.01。
IO 已從版本 1.28 升級至 1.31。
IO::Compress::Gzip 及其相關模組已從版本 2.060 升級至 2.064。
IPC::Cmd 已從版本 0.80 升級至 0.92。
IPC::Open3 已從版本 1.13 升級至 1.16。
IPC::SysV 已從版本 2.03 升級至 2.04。
JSON::PP 已從版本 2.27202 升級至 2.27203。
List::Util 已從版本 1.27 升級至 1.38。
locale 已從版本 1.02 升級至 1.03。
Locale::Codes 已從版本 3.25 升級至 3.30。
Locale::Maketext 已從版本 1.23 升級至 1.25。
Math::BigInt已從版本1.9991升級至1.9993。
Math::BigInt::FastCalc已從版本0.30升級至0.31。
Math::BigRat已從版本0.2604升級至0.2606。
MIME::Base64已從版本3.13升級至3.14。
Module::Build已從版本0.4003升級至0.4205。注意:Module::Build已被棄用,可能會在未來版本的Perl中被移除。
Module::CoreList已從版本2.89升級至3.10。
Module::Load已從版本0.24升級至0.32。
Module::Load::Conditional已從版本0.54升級至0.62。
Module::Metadata已從版本1.000011升級至1.000019。
mro已從版本1.11升級至1.16。
Net::Ping已從版本2.41升級至2.43。
Opcode已從版本1.25升級至1.27。
Package::Constants已從版本0.02升級至0.04。注意:Package::Constants已被棄用,可能會在未來版本的Perl中被移除。
Params::Check已從版本0.36升級至0.38。
parent已從版本0.225升級至0.228。
Parse::CPAN::Meta已從版本1.4404升級至1.4414。
Perl::OSType已從版本1.003升級至1.007。
perlfaq已從版本5.0150042升級至5.0150044。
PerlIO已從版本1.07升級至1.09。
PerlIO::encoding已從版本0.16升級至0.18。
PerlIO::scalar已從版本0.16升級至0.18。
PerlIO::via已從版本0.12升級至0.14。
Pod::Escapes已從版本1.04升級至1.06。
Pod::Functions已從版本1.06升級至1.08。
Pod::Html已從版本1.18升級至1.21。
Pod::Parser已從版本1.60升級至1.62。
Pod::Perldoc已從版本3.19升級至3.23。
Pod::Usage已從版本1.61升級至1.63。
POSIX已從版本1.32升級至1.38_03。
re已從版本0.23升級至0.26。
Safe已從版本2.35升級至2.37。
Scalar::Util已從版本1.27升級至1.38。
SDBM_File已從版本1.09升級至1.11。
Socket已從版本2.009升級至2.013。
Storable已從版本2.41升級至2.49。
strict已從版本1.07升級至1.08。
subs已從版本1.01升級至1.02。
Sys::Hostname已從版本1.17升級至1.18。
Sys::Syslog已從版本0.32升級至0.33。
Term::Cap已從版本1.13升級至1.15。
Term::ReadLine已從版本1.12升級至1.14。
Test::Harness已從版本3.26升級至3.30。
Test::Simple已從版本0.98升級至1.001002。
Text::ParseWords已從版本3.28升級至3.29。
Text::Tabs已從版本2012.0818升級至2013.0523。
Text::Wrap已從版本2012.0818升級至2013.0523。
Thread已從版本3.02升級至3.04。
Thread::Queue已從版本3.02升級至3.05。
threads已從版本1.86升級至1.93。
threads::shared已從版本1.43升級至1.46。
Tie::Array已從版本1.05升級至1.06。
Tie::File已從版本0.99升級至1.00。
Tie::Hash已從版本1.04升級至1.05。
Tie::Scalar已從版本1.02升級至1.03。
Tie::StdHandle已從版本4.3升級至4.4。
Time::HiRes已從版本1.9725升級至1.9726。
Time::Piece已從版本1.20_01升級至1.27。
Unicode::Collate已從版本0.97升級至1.04。
Unicode::Normalize已從版本1.16升級至1.17。
Unicode::UCD已從版本0.51升級至0.57。
utf8已從版本1.10升級至1.13。
version已從版本0.9902升級至0.9908。
vmsish 已從版本 1.03 升級至 1.04。
warnings 已從版本 1.18 升級至 1.23。
Win32 已從版本 0.47 升級至 0.49。
XS::Typemap 已從版本 0.10 升級至 0.13。
XSLoader 已從版本 0.16 升級至 0.17。
這份文件已被移除(實際上,被重新命名為 perlgit,並且經過大幅改版),在 Perl v5.14 中導致 Perl 文件網站顯示 Perl v5.12 中現已過時的版本為最新版本。現已以草稿形式恢復,指引讀者前往查閱最新資訊。
已新增部分以記錄新的索引/值陣列片段和鍵/值哈希片段的語法。
DB::goto
和 DB::lsub
調試器子程序現已有文件化。[perl #77680]
\s
匹配 \cK
現已標記為實驗性功能。
ithreads 自 Perl v5.8.0 開始被接受(但自 Perl v5.20.0 起不建議使用)。
長雙精度數值不再被視為實驗性功能。
正則表達式中的程式碼、正則表達式回溯動詞以及 lvalue 子程序不再列為實驗性功能。(這也影響到 perlre 和 perlsub。)
chop
和 chomp
現已註記可以重置哈希迭代器。
exec
處理參數的方式現已更清楚地文件化。
eval EXPR
現已加入對於某些地區浮點數擴展的注意事項。
goto EXPR
現已文件化,處理將求值為代碼引用的表達式,如同 goto &$coderef
。這個行為至少已經存在十年。
自 Perl v5.10 起,@INC
中的子程序可以返回一個引用到包含要添加到檔案前面的初始源代碼的純量的參考。這已經被文件化。
ref
的文件已更新,建議在處理對象引用時使用 blessed
、isa
和 reftype
。
此版本中已經進行了許多微小的更改,以反映 perl 內部的更改。
新增了關於唯讀值和Copy on Write的新章節。
超快速補丁指南部分已更新。
文件已更新,包含更多有關gdb
使用的示例。
perllexwarn文件曾描述warnings pragma 理解的警告類別的層次結構。該描述現在已移至warnings文件本身,將perllexwarn留作指向該文件的存根。此更改將所有詞彙警告的文件整合到單一位置。
文件現在提到fc()和\F
,並在一般情況下包含許多澄清和更正。
Perl的語言設計一直要求單形運算符。這現在已明確提到。
open
教程由 Tom Christiansen 完全重新撰寫,現在專注於僅涵蓋基礎知識,而不是提供對所有可打開物件的全面參考。這次重寫是由 Alexander Hartmaier 撰寫的一組對現有perlopentut的改進引發的 perl5-porters 上的熱烈討論的結果。在後續版本的 perl 中可能會有一份"關於 open
的更多資訊"文件。
已經記錄了正規表達式引擎不會試圖調用 (?{}) 和 (??{}) 構造的事實,而是會基本上按照期望的方式處理成功的匹配。
現在已記錄了/r
修飾符(用於非破壞性替換)。 [perl #119151]
/x
和(?# comment)
的文檔已擴展和澄清。
文檔已根據對regcomp.c的最近更改進行了更新。
現在已記錄了爲了使原型在遞歸調用中受到尊重,需要預先聲明遞歸函數的原型。 [perl #2726]
現在包含了 Perl 實作中使用的子程序名稱清單。[perl #77680]
現在有一個JavaScript部分。
文件已更新以反映 Unicode 6.3 中的 Bidi_Class
變更。
新增了一個新部分,解釋了 $`、$& 和 $' 的性能問題,包括解決方法以及不同版本 Perl 中的更改。
從文件中刪除了三個長期被記錄但實際不存在的 English 變數名稱。這些是 $OLD_PERL_VERSION
、$OFMT
和 $ARRAY_BASE
。
(實際上,OLD_PERL_VERSION
從這個修訂版本開始存在,但直到 Perl 5.22.0 才被記錄。)
修正了 MY_CXT
示例中的幾個問題。
對診斷輸出(包括警告和致命錯誤消息)進行了以下新增或更改。完整的診斷消息列表,請參見 perldiag。
(F) 您使用了索引/值數組切片語法(%array[...]
)作為 delete
的參數。您可能想用帶有 @ 符號的 @array[...]
代替。
(F) 您使用了鍵/值哈希切片語法(%hash{...}
)作為 delete
的參數。您可能想用帶有 @ 符號的 @hash{...}
代替。
(F) 您將神奇數組分配給了存儲元素,然後嘗試從相同的槽中使用子程序。您要求 Perl 做一些它無法做的事情,詳細信息可能會在 Perl 版本之間變化。
"自動解參照"功能是實驗性的。
從 v5.14.0 開始,您可以將 push、pop、keys 和其他內建函數不僅用於聚合類型,而且用於對它們的引用。該功能未按其原始預期規格部署,現在可能會變得多餘以後綴解參照。它一直被歸類為實驗性功能,在 v5.20.0 中也會發出警告。
在編譯時檢測到這些操作時,將發出警告。
no if $] >= 5.01908, warnings => "experimental::autoderef";
儘管如此,請考慮替換這些特性的使用,因為它們可能在變得穩定之前再次更改行為。
這兩個涉及 \N{...}
的廢棄警告被錯誤地實施了。它們未默認警告(現在已經可以),並且不能通過 use warnings FATAL => 'deprecated'
使其成為致命的(現在可以)。
屬性 prototype(%s) 拋棄了相同子例中早期原型屬性
(W misc) 例如,一個子例被聲明為 sub foo : prototype(A) : prototype(B) {}
。由於每個子例只能有一個原型,因此早期的聲明將被拋棄,而最後一個則被應用。
(W syscalls) 自 5.20 版本起,路徑名或其他系統調用參數中的嵌入式 \0 字符將產生警告。以前系統調用忽略 \0 後的部分。
匹配非 Unicode 代碼點 0x%X 對 Unicode 屬性; 可能不可移植.
這取代了消息"代碼點 0x%X 不是 Unicode,所有 \p{} 匹配都失敗; 所有 \P{} 匹配都成功"。
(W illegalproto) 使用 [
開始的分組,但從未使用 ]
閉合。
(W syntax) 使用控制流運算符(例如 return
)和低優先順序運算符(例如 or
)混合可能存在問題。請考慮
sub { return $a or $b; }
這被解析為
sub { (return $a) or $b; }
實際上只是
sub { return $a; }
請使用括號或運算符的高優先順序變體。
注意,這也可能觸發類似的構造
sub { 1 if die; }
(S experimental::postderef) 如果您使用實驗性的後置解引用語法,則將發出此警告。如果您想使用該功能,只需抑制該警告,但請知道這樣做會冒使用一個實驗性功能的風險,該功能可能會在未來的 Perl 版本中更改或被刪除。
no warnings "experimental::postderef";
use feature "postderef", "postderef_qq";
$ref->$*;
$aref->@*;
$aref->@[@indices];
... etc ...
原型 '%s' 被 %s 中的屬性 'prototype(%s)' 覆蓋
(W prototype) 在子例名稱後的括號中聲明了一個原型,並通過原型屬性聲明了原型。括號中的原型是無用的,因為在它被使用之前,它將被屬性中的原型替換。
(W 語法)在標量上下文中,您使用了一個陣列索引/值切片(由%表示)來選擇陣列的單個元素。通常最好要求標量值(由$表示)。不同之處在於$foo[&bar]
在返回值和評估其引數時始終行為像一個標量,而%foo[&bar]
對其下標提供列表上下文,如果您只期望一個下標可能會出現奇怪的情況。在列表上下文中調用時,它還返回索引(&bar
返回的內容)以及值。
(W 語法)在標量上下文中,您使用了哈希鍵/值切片(由%表示)來選擇哈希的單個元素。通常最好要求標量值(由$表示)。不同之處在於$foo{&bar}
在返回值和評估其引數時始終行為像一個標量,而@foo{&bar}
對其下標提供列表上下文,如果您只期望一個下標可能會出現奇怪的情況。在列表上下文中調用時,它還返回鍵以及值。
(S)當在PL_exit_flags
中設置PERL_EXIT_WARN
時,exit()
被調用或腳本以其他方式優雅地完成。
(S)當在PL_exit_flags
中設置PERL_EXIT_WARN
時,未捕獲die()
被調用。
(D 已棄用)在源代碼中使用文字控制字符來引用^FOO變量,例如$^X和${^GLOBAL_PHASE}現在已被棄用。這只影響像$\cT這樣的代碼,在源代碼中\cT是一個控制字符(像一個SOH
):${"\cT"}和$^T仍然有效。
這修復了[Perl#42957]。
正則表達式引擎中的警告和錯誤現在已經是UTF-8清潔的。
“未知開關條件”錯誤消息有些輕微的更改。當在(?(foo))
條件中有未知條件時,會觸發此錯誤。錯誤消息之前是這樣讀取的
Unknown switch condition (?(%s in regex;
但是%s可能會主要取決於運氣。對於(?(foobar))
,您可能已經看到了"fo"或"f"。對於Unicode字符,您通常會得到一個損壞的字符串。此消息已更改為:
Unknown switch condition (?(...)) in regex;
此外,錯誤中的'<-- HERE'
標記現在將指向正確的正則表達式中的正確位置。
"%s "\x%X" 不對應到Unicode" 警告現在正確列為嚴重警告,而不是致命錯誤。
在罕見情況下,有時會得到一個"Can't coerce readonly REF to string" 而不是通常的"Modification of a read-only value"。已刪除此替代錯誤消息。
"Ambiguous use of * resolved as operator *": 在某些情況下,以前會發生類似的警告,其中類型所引用的運算符不存在,因此警告是完全錯誤的。已修復此問題[perl #117535, #76910]。
有關畸形子程序原型的警告現在在渲染原型方面更加一致。一些這些警告將截斷包含空值的原型。在其他情況下,一個警告會壓制另一個警告。關於原型中的非法字符的警告不再說"after '_'" 如果壞字符在下劃線之前。
Perl摺疊規則對於0x%X不是最新的;請使用perlbug工具進行報告;在正則表達式中;由 <-- HERE 標記
此消息現在僅位於正則表達式類別中,而不是已棄用類別中。它仍然是默認(即嚴重)警告[perl #89648]。
此警告現在對於在編譯時已知為標量上下文的任何%array[$index]
或%hash{key}
都會發生。之前的用語是"Scalar value %%s[%s] better written as $%s[%s]"。
在正則表達式中未識別到開關條件;由 <-- HERE 標記在 m/%s/:
此診斷的描述已擴展到覆蓋可能發生警告的所有情況。有關箭頭指示器位置的問題也已解決。
對於my($a?$b$c)
和my(do{})
的錯誤消息現在分別提到"條件表達式"和"do block",而不是閱讀'Can't declare null operation in "my"'。
當use re "debug"
執行包含反向引用的正則表達式時,調試輸出現在顯示正在匹配的字符串。
現在的致命錯誤消息Character following "\c" must be ASCII
已被改為Character following "\c" must be printable ASCII
以強調在\cX
中,X必須是可打印(非控制)ASCII字符。
修正了當嘗試訪問緩衝區開始之前的位置時可能發生的一個 off-by-one 錯誤而導致的潛在崩潰。[perl #120244]
git 二分搜索工具 Porting/bisect.pl 已經進行了許多增強。
它作為源代碼分發的一部分提供,但未安裝,因為它不是獨立的,它依賴於從 git 檢出中運行。同時請注意,它不會嘗試修復測試、糾正運行時錯誤或製作一些有用的安裝程序 - 它的目的是進行最小程度的更改,以使任何感興趣的歷史修訂版本盡可能接近“原樣”地構建和運行,從而使 git bisect
容易使用。
可以選擇性地使用超時運行測試用例。
現在可以在乾淨的 git 檢出中原地運行。
可以在 valgrind
下運行測試用例。
可以在構建之前將用戶提供的補丁和修復應用到源檢出中。
現在具有修補程序,可以啟用構建更多 bleadperl 的歷史範圍,這對於查明錯誤或行為更改的起源可能很有用。
find2perl 現在正確處理 ?
通配符。[perl #113054]
perlbug 現在具有一個 -p
選項,用於附加補丁與錯誤報告。
perlbug 已修改為在 Windows 上使用 CRLF 行結尾提供報告模板。[GH #13612]
perlbug 現在對於錯誤報告的編碼盡可能少做假設。這在將來可能會更改為默認假設為 UTF-8,但允許用戶覆蓋。
SDBM_File 的 Makefile.PL 現在生成更好的 Makefile,避免了並行構建期間可能導致構建失敗的競爭條件。這是已知的並行構建問題的最後一個(在 *nix 平台上),因此我們相信並行構建現在應該始終是無錯誤的。
installperl和installman的選項處理已被重構為使用Getopt::Long。這兩者被Makefile install
目標使用,並未安裝,因此這些更改只可能影響自定義安裝腳本。
單字母選項現在也有長名稱。
無效選項現在被拒絕。
不是選項的命令行參數現在被拒絕。
每個都有一個--help
選項來顯示使用訊息。
所有有效的已記錄呼叫的行為保持不變。
在構建純Perl擴展時,現在會盡量避免遞迴調用make,而不會從構建中移除任何並行性。目前約有80個擴展可以直接由make_ext.pl工具處理,這意味著不再進行80次make和160次miniperl的調用。
在使用GCC或Clang編譯且啟用連結時優化(-flto
選項)時,構建系統現在能正常運作([perl #113022])。
使用d_libname_unique
獨特的庫名。
使用此選項編譯perl時,XS模塊的庫文件被命名為“unique” -- 例如,Hash/Util/Util.so變為Hash/Util/PL_Hash__Util.so。這個行為類似於當前在VMS上發生的情況,並作為Android移植的基礎。
sysroot
選項指示gcc和clang下的邏輯根目錄。
使用此選項構建時,Configure和編譯器將在此新sysroot下搜索所有標頭和庫,而不是/。
如果是交叉編譯,這將大大節省時間,但如果您的工具鏈文件具有非標準位置,也可以對本機構建有所幫助。
交叉編譯模型已經更新。有幾個新選項和一些不兼容的更改
我們現在為miniperl和generate_uudmap構建二進制文件以在主機上使用,而不是在目標上運行每個miniperl調用;這意味著,除了'make test',我們在完成Configure後不再需要訪問目標系統。您可以通過hostperl
和hostgenerate
選項向Configure提供已經構建的二進制文件。
此外,如果從ASCII主機目標EBCDIC平台,或反之,您需要使用-Uhostgenerate
運行Configure,以指示在目標上運行generate_uudmap。
最後,還有一種方法可以在交叉編譯時在構建主機二進制文件後立即結束Configure,而不指定targethost
。
不兼容的更改包括不再使用xconfig.h、xlib或Cross.pm,因此預設的配置文件和Makefile必須更新。
與上述相關的是,現在可以指定目標系統上sh(或等效物)的位置:targetsh
。
例如,Android 將其 sh 存放在 /system/bin/sh 中,因此如果從具有 /bin/sh 中 sh 的更正常的 Unixy 系統交叉編譯,"targetsh" 將最終成為 /system/bin/sh,而 "sh" 將成為 /bin/sh。
預設情況下,gcc 4.9 會進行一些會破壞 perl 的優化。 -fwrapv 選項會禁用這些優化(可能還有其他優化),因此對於 4.3 以後的 gcc(因為在之前的版本中可能存在類似的問題,但是 -fwrapv 在 4.3 之前是有問題的,且這些優化可能不會消失),Configure 現在會添加 -fwrapv,除非用戶要求禁用 -fwrapv 的 -fno-wrapv,或者要求使用 -fsanitize=undefined,將 -fwrapv 忽略的溢出轉換為運行時錯誤。 [GH #13690]
現在,test.valgrind
的製作目標允許並行運行測試。這個目標允許在 Valgrind 下運行 Perl 的測試套件,可以檢測到某些類型的 C 編程錯誤,但運行時間成本高昂。在適當的硬件上,允許並行執行可以大幅降低額外成本。[perl #121431]
當 perl .git 目錄在 perl 樹之外並且由 $GIT_DIR
指向時,t/porting/ 中的各種測試不再被跳過。[perl #120505]
當用戶的交互式 shell 保持 $PWD
環境變量時,但用於運行測試的 /bin/sh 沒有時,測試套件不再失敗。
現在可以為 Android 架構(ARM、MIPS 和 x86)上的所有三個當前版本進行本機或通過交叉編譯構建 Perl,在各種版本上都可以。
已添加對 Bitrig 的編譯支援,這是 OpenBSD 的一個分支。
已添加對 FreeMiNT 的支援,這是 Atari ST 系統及其後續版本的一個免費開源操作系統,基於官方採用的原始 MiNT。
Synology 將其 NAS 箱子配備了一個精簡的 Linux 發行版(DSM),運行在相對便宜的 CPU 上(例如 Marvell Kirkwood mv6282 - ARMv5tel 或 Freescale QorIQ P1022 ppc - e500v2),並非用於工作站或開發。這些箱子現在應該可以構建了。基本問題是工具的非標準位置。
sfio
已移除支援 sfio
I/O 系統的相關程式碼。
Perl 5.004 新增了對使用 AT&T 的 Safe/Fast I/O library (sfio) 的本機 API 的支援。這段程式碼仍然可以在 v5.8.0 中建置,但有許多回歸測試失敗,並在 v5.8.1 釋出之前不小心破壞了,這意味著它自那時以來在任何釋出的 Perl 版本上都無法運作。在十多年的時間裡,我們沒有收到關於這個問題的任何錯誤回報,因此顯然沒有人在任何仍受到任何程度支援的 Perl 版本上使用這個功能。
已移除對 3b1 的配置支援,也就是 AT&T Unix PC(以及類似的 AT&T 7300)。
DG/UX 是由 Data General 銷售的 Unix。最後一個釋出版本於 2001 年 4 月。它僅運行於 Data General 自家的硬體上。
在缺乏定期的煙霧回報的情況下,用於支援本機 EBCDIC 平台的程式碼將在 Perl 5.22.0 之前被移除。
在已連接的處理序上使用 recv() 將填充返回的發送者地址,該地址將填充工作緩衝區中的任何內容。現在,當 recvfrom(2) 不修改提供的地址長度時,recv() 現在使用類似於 Win32 recv() 包裝器的解決方法並返回一個空字符串。[perl #118843]
修復了 Cygwin 1.7.28 上的 cygwin.c 中的編譯錯誤。
現在測試處理當 cygserver
未運行時發生的錯誤。
BSD 相容性庫 libbsd
不再需要進行建置。
提示文件現在僅在也要求 libgdbm
的情況下才尋找 libgdbm_compat
。前者沒有後者永遠是無用的,在某些情況下,包括它實際上可能會阻止建置。
建置系統現在尊重由運行 Configure 的使用者提供的 ld
設定。
objformat
在 MidnightBSD 的 0.4-RELEASE 版本中被移除,並且在早期版本中已經被棄用。這導致構建環境錯誤地配置為 a.out
而不是 elf
。這已經被修正。
已經移除了對混合字節序平台上的 pack
和 unpack
操作的代碼支持。我們相信 Perl 早已無法在混合字節序架構上構建(例如 PDP-11),因此我們不認為此更改會影響到能夠構建 v5.18.0 的任何平台。
在 Win32 上,rename
和 link
現在在適當時將 $! 設置為 ENOSPC 和 EDQUOT。[perl #119857]
用於將一些或(幾乎)所有擴展靜態鏈接(到 perl520.dll,以及到單獨的 perl-static.exe)的 BUILD_STATIC 和 ALL_STATIC makefile 選項在 MinGW 構建中失效。這已經修復。
ALL_STATIC 選項還改進為包括 Encode 和 Win32 擴展(對於 VC++ 和 MinGW 構建)。
添加了使用 Visual C++ 2013 構建的支持。目前存在兩種可能的測試失敗(請參見 "Testing Perl on Windows" in perlwin32),希望能盡快解決。
添加了使用 Intel C++ Compiler 構建的實驗性支持。可以使用 nmake makefile(win32/Makefile)和 dmake makefile(win32/makefile.mk)。由於 cpan/CGI/t/url.t,"nmake test" 目前無法通過。
使用 perlfunc 中的 "kill" 和負信號殺死進程樹,在 5.18.0 中開始失效。在這個錯誤中,kill
對於負信號始終返回 0,即使對於有效的 PID 也是如此,並且不會終止任何進程。這已經被修復 [perl #121230]。
在 Windows 上構建 perl 所需的時間顯著減少(通常可以節省約 30-40% 的時間),這是通過減少每個 require()
(僅對於 miniperl.exe)的 I/O 調用次數(通常失敗的)來實現的。 [GH #13566]
由於一個 bug,使得測試所用的超時監視器在測試完成後無法取消,且在運行下一個測試文件之前完整的超時期間過去,因此在執行 make test
時,約有 15 分鐘的閒置睡眠時間被移除。 [GH #13647]
在沒有虛擬分叉的 perl 環境中(虛擬分叉的建置不受此 bug 影響),使用 kill()
函數並使用負訊號來殺死一個進程樹導致 kill()
函數反轉返回值。例如,如果 kill()
函數殺死了一個進程樹的 PID,則返回值不是 1,而是 0;如果 kill()
函數傳入了 2 個無效的 PID,則返回值不是 0,而是 2。這個問題很可能存在於 Win32 上實現進程樹殺死功能時。現在已經根據文件記錄的行為進行了修正。 [GH #13595]
在建置 64 位元 perl 時,建置過程中使用的 miniperl.exe 出現未初始化的記憶體讀取,可能導致創建一個 4GB 的 wperl.exe。這個問題現在已經修復。(請注意,perl.exe 本身不受影響,但顯然 wperl.exe 會完全失效。) [GH #13677]
現在可以使用 gcc 版本 4.8.1 從 http://www.mingw.org 建置 Perl。這之前因為 perl 的一個源代碼文件中 DllMain() 的定義錯誤而無法建置。使用 w32api 套件的版本 4 時,之前的 gcc 版本也受到影響。從 http://mingw-w64.sourceforge.net/ 獲得的 gcc 版本不受影響。 [GH #13733]
當 Perl 在 FAT 驅動器上建置,而 Windows 作業系統在 NTFS 驅動器上時,測試工具現在不再失敗。 [GH #6348]
在模擬 fork() 中克隆上下文堆棧時,Perl_cx_dup() 函數會因為無參數的上下文堆棧條目(如 &foo;
)而崩潰。 [GH #13763]
由 [GH #12161] 引入的一個問題,在大多數 Win32 Perl 從 5.18.0 開始的版本中,每次調用 system
和反引號( ``
)時都會有內存泄漏。如果在 Win32 Perl 的版本中啟用了虛擬分叉並在 Server 2003 R2 或更新的作業系統上運行,則會出現內存泄漏。在 WinXP SP3 上不會出現這種泄漏。 [GH #13741]
大部分 XS 模組的建置已經大幅修復。有幾個仍然無法(暫時)建置,但現在已經可以僅需進行少量進一步的修補(對 Socket 和 ExtUtils::MakeMaker),希望很快能夠納入。
現在可以透過執行 nmake -f Makefile.ce all
在 WinCE 上一次性地建置 Perl,無需使用者干預。
已經恢復了使用 EVC (Embedded Visual C++) 4 進行建置的支援。Perl 也可以使用 Smart Devices for Visual C++ 2005 或 2008 進行建置。
對於匹配變數 $1、$2 等,以及 $`、$&、$'、${^PREMATCH}、${^MATCH} 和 ${^POSTMATCH} 的內部表示已經更改。它在查找時使用的記憶體稍微少一些,避免了字串比較和數字轉換,並且減少了 23 行 C 代碼。這個變更不應該影響任何外部代碼。
數組現在內部使用 NULL 來表示未使用的插槽,而不是 &PL_sv_undef。&PL_sv_undef 不再被視為特殊值,因此 av_store(av, 0, &PL_sv_undef) 將導致該數組的元素 0 包含一個只讀未定義的標量。 $array[0] = anything
將會抛出異常,而 \$array[0]
將與 \undef
相等。
當哈希鍵未存儲為 SV 時,HeSVKEY_force() 返回的 SV 現在正確反映了基礎哈希鍵的 UTF8 屬性。[perl #79074]
現在已經對 XS 代碼可用的某些很少使用的函數和宏進行了棄用。這些包括:utf8_to_uvuni_buf
(改用 utf8_to_uvchr_buf
)、valid_utf8_to_uvuni
(改用 utf8_to_uvchr_buf
)、NATIVE_TO_NEED
(這本來就沒有正常工作),以及 ASCII_TO_NEED
(這本來就沒有正常工作)。
從這個版本開始,幾乎不再需要應用程式代碼區分平台的字符集和 Latin1,Latin1 是 Unicode 的最低 256 個字符所基於的字符集。新代碼不應該使用 utf8n_to_uvuni
(改用 utf8_to_uvchr_buf
),也不應該使用 uvuni_to_utf8
(改用 uvchr_to_utf8
)。
許多很少(或從不)使用的測試和分析目標的 Makefile 快捷目標已經被移除,或者合併到唯一使用它們的其他 Makefile 目標中。具體來說,這些目標已經消失,並且已經刪除了參考它們或解釋如何使用它們的文檔
check.third check.utf16 check.utf8 coretest minitest.prep
minitest.utf16 perl.config.dashg perl.config.dashpg
perl.config.gcov perl.gcov perl.gprof perl.gprof.config
perl.pixie perl.pixie.atom perl.pixie.config perl.pixie.irix
perl.third perl.third.config perl.valgrind.config purecovperl
pureperl quantperl test.deparse test.taintwarn test.third
test.torture test.utf16 test.utf8 test_notty.deparse
test_notty.third test_notty.valgrind test_prep.third
test_prep.valgrind torturetest ucheck ucheck.third ucheck.utf16
ucheck.valgrind utest utest.third utest.utf16 utest.valgrind
仍然可以通過手動運行相應的命令來執行這些命令,沒有刪除底層功能。
現在可以防止 Perl 初始化地區設定的功能。就大多數而言,Perl 不會注意地區設定。(請參閱 perllocale。)儘管如此,直到現在,在啟動時,它總是初始化地區設定為系統預設值,以防萬一執行的程序最終使用地區設定。(這是地區感知程序應該做的第一件事情之一,早在 Perl 知道是否實際需要之前。)這運作良好,除了當 Perl 嵌入到另一個希望使用非系統預設值的應用程式時。現在,如果在啟動 Perl 時設置了環境變數 PERL_SKIP_LOCALE_INIT
,則會跳過此初始化步驟。在此之前,在 Windows 平台上,對於這個缺陷唯一的解決方法是使用內部 Perl 代碼的修改版本。需要使用舊版 Perl 的應用程式可以通過測試 C 預處理器符號 HAS_SKIP_LOCALE_INIT
未定義來發現它們正在使用的嵌入式 Perl 是否需要此解決方法。[RT #38193]
BmRARE
和 BmPREVIOUS
已被刪除。它們在任何地方都未被使用,也不是 API 的一部分。對於 XS 模塊,它們現在被 #defined 為 0。
sv_force_normal
通常在只讀值上發出 croak,以前允許在編譯時修改只讀值。這已更改為無論如何都會對只讀值發出 croak。此更改揭示了幾個核心錯誤。
Perl 的新的寫時拷貝機制(現在默認已啟用)允許任何 SvPOK
标量在拷貝時自動升級為寫時拷貝标量。字符串緩衝區的引用計數存儲在字符串緩衝區本身中。
例如
$ perl -MDevel::Peek -e'$a="abc"; $b = $a; Dump $a; Dump $b'
SV = PV(0x260cd80) at 0x2620ad8
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
SV = PV(0x260ce30) at 0x2620b20
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
請注意,這兩個標量共享相同的 PV 緩衝區,並且具有大於零的 COW_REFCNT。
這意味著希望修改 SV 的 SvPVX()
緩衝區的 XS 代碼應該首先調用 SvPV_force()
或類似的函數,以確保一個有效(且未共享)的緩衝區,然後調用 SvSETMAGIC()
。事實上,這一直是這樣的(例如,哈希鍵已經是寫時拷貝);這一變化只是將寫時拷貝行為擴展到更多類型的 SV。
一個重要的區別是在 5.18.0 之前,共享哈希鍵標量的 SvREADONLY
標誌已經設置;現在不再如此。
這種新行為仍然可以通過使用 Configure 運行 -Accflags=-DPERL_NO_COW 來禁用。這個選項可能會在 Perl 5.22 中被刪除。
PL_sawampersand
現在是一個常數。此變量提供的開關(根據是否見過 $&
來啟用/禁用預先匹配的拷貝)已被刪除並替換為寫時拷貝,從而消除了一些錯誤。
先前的行為仍然可以通過執行 Configure 並使用 -Accflags=-DPERL_SAWAMPERSAND 來啟用。
函數 my_swap
、my_htonl
和 my_ntohl
已經被移除。不清楚為什麼這些函數曾被標記為 A,即 API 的一部分。XS 代碼無法直接調用它們,因為它無法依賴於它們是否已編譯。毫不奇怪,CPAN 上沒有任何代碼引用它們。
Perl_re_intuit_start()
正則表達式函數的簽名已更改;正則引擎插件結構中的函數指針 intuit
也相應更改了。新增了一個參數 strbeg
;這與 Perl_regexec_flags
中同名參數的含義相同。先前,intuit 會嘗試從傳遞的 SV(如果有的話)猜測字符串的開頭,有時會猜錯(例如,對於重載的 SV)。
Perl_regexec_flags()
正則表達式函數的簽名已更改;正則引擎插件結構中的函數指針 exec
也相應更改以匹配。現在 minend
參數的類型為 SSize_t
,以更好地支持 64 位系統。
XS 代碼可以使用各種宏來改變字符或代碼點的大小寫(例如 toLOWER_utf8()
)。直到現在,只有少數這些被文檔記錄了;現在應該優先使用這些宏而不是調用底層函數。參見 perlapi 中的 "字符大小寫更改"。
代碼對 uid 和 gid 的處理相當不一致。一些地方假設它們可以安全地存儲在 UVs 中,其他地方存儲在 IVs 中,其他地方存儲在 ints 中。引入了四個新的宏:SvUID()、sv_setuid()、SvGID() 和 sv_setgid()
新增了 sv_pos_b2u_flags
到 API。它類似於 sv_pos_b2u
,但支持 64 位平台上的長字符串。
PL_exit_flags
現在可以被 Perl 嵌入程序或其他 XS 代碼使用,以使 perl 在嘗試退出時發出 warn
或 abort
。[perl #52000]
使用 -Accflags=-PERL_BOOL_AS_CHAR
現在允許 C99 和 C++ 編譯器模擬 perl 對 C89 編譯器的布爾別名到字符的別名。[perl #120314]
在"perlapi"中的"sv_2pv_flags"、"perlapi"中的"sv_2iv_flags"、"perlapi"中的"sv_2uv_flags"以及"perlapi"中的"sv_2nv_flags"以及它們的舊包裹sv_2pv、sv_2iv、sv_2uv、sv_2nv的sv
參數現在是非NULL的。現在傳遞NULL將導致崩潰。當非NULL標記於5.9.3中大量引入時,這些函數被標記為非NULL,但自5.0 alpha 2中的SV API的創建以來,如果傳遞NULL,這些函數將返回0或偽類型值。支援sv
參數為非NULL的代碼可追溯到5.0 alpha 2,以及間接地追溯到Perl 1.0(5.0 api之前)。在5.11.0中,修正了函數接受NULL sv
的缺乏文檔,並且在5.11.0和5.19.5之間,這些函數被標記為NULLOK。作為一種優化,現在已經刪除了NULLOK代碼,並且函數再次變為非NULL標記,因為核心getter類型的宏從不將NULL傳遞給這些函數,並且在傳遞NULL之前會導致崩潰。
NULL sv
被傳遞給sv_2*v*函數的唯一方法是如果XS代碼直接調用sv_2*v*。這是不太可能的,因為XS代碼使用Sv*V*宏從SV中取出底層值。導致NULL sv
被傳遞給sv_2*v*函數的一種可能情況是,如果XS代碼定義了自己的getter類型Sv*V*宏,這些宏在解引用和通過公共API Sv*OK*宏或直接使用私有API SvFLAGS
檢查SV的標記之前檢查NULL 之後,如果sv
為NULL,則使用NULL字面值調用sv_2*v*函數或傳遞包含NULL值的sv
。
newATTRSUB現在是一個宏
公共API newATTRSUB以前是私有函數Perl_newATTRSUB的一個宏。函數Perl_newATTRSUB已被移除。newATTRSUB現在是指向不同內部函數的宏。
utf8n_to_uvchr()
引發的警告變更
這個底層函數將 UTF-8 字串的第一個字元解碼為一個碼點。它可以被 XS 級別的程式碼訪問,但直接使用是不建議的。有更高級的函數調用這個函數,應該使用那些函數,比如perlapi 中的 "utf8_to_uvchr_buf"。為了完整性,這裡記錄了一些對它的更改。現在,在對其他潛在問題進行任何測試之前,對格式錯誤進行了測試。其中一個問題涉及到碼點非常大,以至於它們從未出現在任何官方標準中(當前的標準已經將最高可接受的碼點從早期版本中縮減)。可以(雖然 CPAN 中沒有這樣做)警告和/或禁止這些碼點,同時接受仍然超過合法 Unicode 最大值的較小的碼點。對於這個問題的警告消息現在包括了如果在機器上可以表示的碼點。以前它總是顯示原始字節,對於不可表示的碼點仍然是這樣。
影響可插拔正則表達式引擎接口的正則表達式引擎變更
許多以前通過 regexp.h 暴露並用於填充 regexp 結構的 extflags 成員的標誌已經被移除。這些字段從技術上來說是 Perl 自己的正則表達式引擎的私有字段,不應該在那裡公開。
受影響的標誌是
RXf_NOSCAN
RXf_CANY_SEEN
RXf_GPOS_SEEN
RXf_GPOS_FLOAT
RXf_ANCH_BOL
RXf_ANCH_MBOL
RXf_ANCH_SBOL
RXf_ANCH_GPOS
以及後面的標誌遮罩
RXf_ANCH_SINGLE
RXf_ANCH
全部已經被重新命名為 PREGf_ 等效項並移動到 regcomp.h。
以前通過設置一個或多個 RXf_ANCH_ 標誌(通過 RXf_ANCH 遮罩)實現的行為現在已經被一個 *單一* 標誌位在 extflags 中替換了
RXf_IS_ANCHORED
以前使用這些標誌的可插拔正則表達式引擎現在應該僅設置這個標誌。
Perl 核心現在一致使用 av_tindex()
("數組的頂部索引")作為對 av_len()
更清晰命名的同義詞。
預計在 5.21.x 開發系列的早期移除這個晦澀的解釋器變量 PL_timesbuf
,因此 Perl 5.22.0 不會提供它給 XS 作者。雖然這個變量在 5.20.0 中仍然存在,但我們希望這個對於棄用的提前警告將幫助任何使用該變量的人。
修復了一些正則表達式構造,當要匹配的字符串在 32 位系統上的 2GB 線以上分配時,可能無法匹配或使 perl 崩潰的問題。[RT #118175]
已修復了涉及解析 (?[...])
正則表達式構造的各種內存泄漏。
(?[...])
現在允許將由包含括號的字符類的預編譯模式(例如$pat = qr/(?[ [a] ])/; /(?[ $pat ])/
)進行插值。以前,括號會混淆正則表達式解析器。
在 Perl v5.10 中,對於同時包含交替(例如 "a|b")並觸發 trie 優化的正則表達式,會出現 "Quantifier unexpected on zero-length expression" 警告消息可能會出現兩次。
Perl v5.18 不慎引入了一個錯誤,插值混合了上升和下降等級的 UTF-8 字串在正則表達式中可能會導致模式中的 UTF-8 無效:具體來說,如果範圍內的下降字符 \x80..\xff
在 UTF-8 字串之後。
utf8::upgrade( my $u = "\x{e5}");
utf8::downgrade(my $d = "\x{e5}");
/$u$d/
[RT #118297]
在包含多個代碼塊的正則表達式中,由嵌套的正則表達式調用設置的$1
、$2
等值將從一個塊洩漏到下一個塊。現在,這些變量始終指向嵌入塊開始時的外部正則表達式[perl #117917]。
/$qr/p
在 Perl 5.18.0 中已損壞;忽略了/p
標誌。這已得到修復。[perl #118213]
在 Perl 5.18.0 中,像/[#](?{})/x
這樣的結構將錯誤地將其#
解釋為註釋。代碼塊將被跳過,未解析。這已經糾正了。
從 Perl 5.001 開始,像/[#$a]/x
或/[#]$a/x
這樣的正則表達式將錯誤地將其#
解釋為註釋,因此變量將不會插值。這已得到修正。[perl #45667]
Perl 5.18.0 不慎使得解除引用的正則表達式(${ qr// }
)作為布爾值為 false。這已得到修復。
在正則表達式中使用\G
,其中它不在模式的開頭,現在略微不太問題(儘管仍然存在一些問題)。
如果正則表達式包含代碼塊/(?{...})/
,並且常量重載的使用觸發了代碼塊的重新編譯,則第二次編譯將不會看到其外部語義範圍。這是 Perl 5.18.0 中的一個退步。
由pos
設置的字符串位置可能會移動,如果字符串在內部表示上或從 utf8 切換表示。這可能發生在具有字符串重載的對象的引用中,例如。
將兩個pos
調用的返回值的引用取出相同的參數,然後將一個引用分配給另一個並將undef
分配給另一個,可能會導致斷言失敗或內存泄漏。
現在當它們參考不存在的捕獲時,@-和@+的元素會正確更新。以前,參考的元素($ref = \$-[1]
)可能會在後續匹配之後參考到錯誤的匹配。
解析正則表達式反向引用(或模糊反向引用/八進制)的程式碼,例如 \123,之前只是做了一個簡單的 atoi(),對於長數字字符串可能會產生負值並導致分段錯誤。現在已經修復了這個問題。[perl #119505]
不再將另一個 typeglob 分配給 *^R
會導致正則表達式引擎崩潰。
當不使用大括號時(用於表示 [^\n]
)的 \N
正則表達式轉義,在 /x 模式下如果後面跟著 *
並且後面是空格,將被忽略。自從 5.12.0 版本引入 \N
表示 [^\n]
以來,這種情況一直存在。
s///
、tr///
和 y///
現在在使用寬字符作為分隔符時可以正常工作。[perl #120463]
正則表達式中某些情況下的未終止 (?...) 序列(例如,/(?</
)已經修復,現在會產生正確的錯誤消息,而不是 "panic: memory wrap"。其他情況(例如,/(?(/
)仍然需要修復。
當從正則表達式 (??{...})
代碼塊返回對過載對象的引用時,如果內部引用之前已經被代碼塊返回,則可能發生不正確的隱式解引用。
從 (??{...})
返回的綁定變量在其 FETCH 方法中看到匹配變量的內部值(即,來自塊內任何匹配的 $1 等)。如果最後一個分配給綁定變量的是對過載對象的引用,則情況就不同。在 FETCH 調用期間,匹配變量將引用外部模式。
修復通過使用區域設定的正則表達式意外污染的問題。在某些條件下,使用字符類可能會在不應該的情況下導致污染。一些字符類是依賴於區域設定的,但在此修補程序之前,有時即使對於不依賴於區域設定的字符類也會發生污染。[perl #120675]
在某些情況下,如果在正則表達式的後瞻斷言中,斷言參考了一個命名的子模式,Perl 會拋出錯誤,抱怨後瞻是可變的,但實際上不是。這個問題已經修復。[perl #120600],[perl #120618]。將來可能會進一步改進目前的修復程序。
$^R
在初始化它的正則表達式之外不可用。[perl #121070]
對 re_intuit_start() 進行了大量的修復和重構,主要亮點如下
在編譯正則表達式 /\x{100}[xy]\x{100}{2}/
時修復了當機問題。
在對 UTF-8 字符串進行全局模式匹配時,修復了性能回歸。[perl #120692]
修正了另一个性能問題,當對一個長的UTF-8字符串進行正則表達式匹配,如 /ab.{1,2}x/
,會不必要地計算字節偏移量,影響了字符串的大部分。[perl #120692]
修正了在使用GCC在HP-UX 64位構建時編譯正則表達式時的對齊錯誤。
在64位平台上,pos
現在可以被設置為大於 2**31-1 的值。[perl #72766]
調試器的 man
命令已修復。它在v5.18.0版本中失效。man
命令別名為 doc
和 perldoc
- 現在全部恢復正常。
@_
現在在調試器中正確可見,修復了在v5.18.0版本調試器中引入的回歸。[RT #118169]
在寫時複製構建(從5.20.0開始的默認值)下,${'_<-e'}[0]
不再變形。這是為了調試器用於單行輸入的第一行。[perl #118627]
在非線程構建中,將 ${"_<filename"}
設置為引用或類型全局不再導致 __FILE__
和一些錯誤消息生成損壞的字符串,也不再阻止字符串eval中的 #line
指示將源行提供給調試器。線程構建不受影響。
從Perl 5.12開始,如果在 #! 行上使用了 -d 開關,行號將會錯位一個。現在已經正確。
*DB::DB = sub {} if 0
現在不再阻止Perl的調試模式找到隨後聲明的 DB::DB
子程序。
%{'_<...'}
哈希現在在對應的 @{'_<...'}
上設置斷點,而不是設置在 @DB::dbline
別名的任何數組上。[perl #119799]
設置 $DB::sub 時,調用 set-magic。[perl #121255]
調試器的 "n" 命令現在尊重lvalue子程序並且跳過它們。[perl #118839]
在內聯時,詞法常量 (my sub a() { 42 }
) 不再崩潰。
與括號組合的詞法子程序附加的參數原型現在在編譯子調用時被尊重。以前,原型僅對使用括號的調用生效。[RT #116735]
詞法子程序中的語法錯誤與對相同子程序的調用結合,不再在編譯時導致崩潰。
深度遞歸警告不再導致詞法子程序崩潰。[RT #118521]
現在,dtrace 子入口探針與語法子程序一起運作,而不是崩潰 [perl #118305]。
如果打開警告,則取消定義可內聯的語法子程序 (my sub foo() { 42 } undef &foo
) 將導致崩潰。
使用作為繼承方法的未定義語法子程序不再崩潰。
現在,名為 "CORE" 的語法子程序不再阻止 CORE:: 前綴的工作。
現在,OP 分配代碼在所有情況下都返回正確對齊的內存給 struct pmop
。以前,它只能返回僅對齊到 4 字節邊界的內存,這對於某些 32 位平台上使用 64 位 IVs 的 ithreads 構建是不正確的。特別是,這導致 sparc GNU/Linux 上的構建完全失敗。[RT #118055]
現在,在標量上下文中評估大型哈希速度更快,因為哈希中使用的鏈的數量現在為較大的哈希緩存。較小的哈希繼續不存儲它並在需要時計算它,因為這樣可以節省一個 IV。對於從哈希構建的每個對象,這將是 1 個 IV 的開銷。[RT #114576]
Perl v5.16 不慎引入了一個錯誤,即在編譯時不可見的 XSUBs 被視為 lvalues,即使子程序不是 lvalue 子程序也可以被賦值。這個問題已經修復。[RT #117947]
在 Perl v5.18.0 中,對於字符串部分為空字符串但數字部分不為零的雙值變量開始被視為真。在之前的版本中,它們被視為假,字符串表示優先。恢復了舊的行為。[RT #118159]
自 Perl v5.12 以來,覆蓋具有相同名稱的內置關鍵字的常量的內聯將撤銷 use subs
,導致後續對常量的提及使用內置關鍵字而不是常量。這個問題已經修復。
-l $handle
產生的警告現在適用於 IO refs 和 glob,而不僅僅是 glob refs。該警告現在也是 UTF8 清潔的。[RT #117595]
delete local $ENV{nonexistent_env_var}
不再洩漏內存。
現在,由 CORE::
前綴的關鍵字的 sort
和 require
將其視為關鍵字,而不是子程序或模塊名。[RT #24482]
通過某些難題,可能會導致當前套件被釋放。某些運算符 (bless
、reset
、open
、eval
) 不能應對並且會崩潰。它們已經變得更加強壯。[RT #117941]
通過 glob-to-glob 分配別名文件處理程序,如果存在與文件處理程序同名的套件,則不會正確更新內部方法緩存,導致文件處理程序方法調用轉向套件。這個問題已經修復。
./Configure -de -Dusevendorprefix
沒有預設值。 [RT#64126]
Statement unlikely to be reached
警告在 perldiag 中列為 exec
類別警告,但由 syntax
類別啟用和停用。另一方面,exec
類別控制其致命性。現在完全由 exec
類別處理。
tr///
和 y///
的 "Replacement list is longer that search list" 警告在存在 /c
標誌時不再發生。 [RT#118047]
NV 的字串化未被快取,因此詞法區域設定控制十進制點的字串化。 [perl#108378] [perl#115800]
有幾個與 Perl 處理語言環境相關的修復。perl #38193 如上述在 "Internal Changes" 中描述。同樣修復了 #118197,其中基數(十進制點)字符必須是 ASCII 字符(對於某些非西方語言不適用);和 #115808,在此中 POSIX::setlocale()
失敗時返回一個未定義的 undef
,即使啟用了這些警告也不會警告未定義。
編譯時,將第三個參數為評估為 0 的命名常量的 split
運算符不再導致常量值變化。
作為 index
的第二個參數使用的命名常量如果是參考、正則表達式、雙值變量等,不再被強制轉換為字串。
作為 index
的第二個參數使用的評估為未定義值的命名常量不再在編譯時產生 "uninitialized" 警告。在運行時仍將產生警告。
當從 @INC 中的子程序返回一個純量時,參考的純量會神奇地轉換為 IO 物件,如果該純量在其他地方繼續使用,可能會導致 "Bizarre copy" 錯誤。現在 Perl 使用純量的內部拷貝。
對某些使用 sort
運算符優化以就地修改陣列的情況,例如 @a = sort @a
。在排序期間,陣列被設置為唯讀。如果排序塊發生異常,那麼即使在 sort
之外,陣列仍然保持唯讀。這已經修復。
sort
塊內的 $a
和 $b
被別名為 sort
的實際參數,因此可以通過這兩個變數進行修改。這不總是有效,例如對於 lvalue 子程序和 $#ary
,以及可能的其他運算符。現在有效。
sort
的參數現在全部處於列表上下文。如果 sort
本身在空或純量上下文中被調用,則某些,但不是全部,參數以空或純量上下文存在。
在閉包複製過程中,具有 U+00FF 以上 Unicode 字符的子程序原型會被損壞。這將會發生在閉包中有在外部聲明的詞法變數,以及詞法子程序的情況下。
UNIVERSAL::can
現在將其第一個參數與方法呼叫一樣處理:型球和球參考,其非空 IO 槽位視為處理器,而字串則視為文件處理器,而不是包裹,如果存在具有該名稱的處理器[perl #113932]。
型球的方法呼叫(例如,*ARGV->getline
)以前會將型球字符串化,然後再次查找它。結合 Perl 5.18.0 中的變更,這允許 *foo->bar
調用“foo”包中的方法(如 foo->bar
)。在某些情況下,這可能導致將方法調用到錯誤的處理器上。現在,型球參數被視為處理器(就像 (\*foo)->bar
一樣),或者,如果其 IO 槽為空,則會引發錯誤。
將 vstring 賦值給綁定變數或對不存在的哈希或陣列元素進行別名化的子程序參數現在可以正常工作,而不會將 vstring 變成常規字符串。
pos
、tie
、tied
和 untie
在對不存在的哈希和陣列元素進行別名化的子程序參數上未正常工作 [perl #77814, #27010]。
fat arrow 運算符 =>
現在可以在下一行引用內建關鍵字,使其與其他裸字一致。
通過 \&$glob
自動創建子程序存根開始在 Perl 5.18.0 中引起崩潰,如果 $glob 僅僅是實際球的副本,即一個被賦予球的純量。這已經修復。[perl #119051]
Perl 在引用某些運算符的返回值時曾經洩漏了一個實現細節。因為 \
運算符正在複製變數,所以 for ($a+$b) { warn \$_; warn \$_ }
以前會顯示兩個不同的內存地址。在線程構建下,它也會發生在常數(for(1) { ... }
)上。這已經修復。[perl #21979, #78194, #89188, #109746, #114838, #115388]
範圍運算符 ..
每次呼叫時返回相同的可修改標量,除非它是 foreach
循環標頭中的唯一內容。這意味著對返回的列表中的值進行的更改將在下次執行運算符時可見。[perl #3105]
常量折疊和子程序內聯不再導致通常會返回新的可修改標量的操作返回只讀值。
形式為 sub () { $some_variable }
的閉包不再進行內聯,從而使得對該變數的更改被子程序的調用者忽略。[perl #79908]
某些運算符號的返回值,如 ref
,有時會在對同一子程式的遞迴呼叫之間共享,導致內部呼叫修改了外部呼叫中 ref
返回的值。這個問題已經修復。
__PACKAGE__
和返回套件名稱或哈希鍵的常數現在都是一致的唯讀。在以前的各種 Perl 發行版中,在某些情況下它們變得可變了。
啟用「使用一次」警告不再在編譯時造成 stash 循環引用時崩潰 (*Foo::Bar::Foo:: = *Foo::
)。
在哈希鍵中使用未定義常數 (use constant u => undef; $h{+u}
) 現在不再在編譯時產生「未初始化」警告。
在替換的替換目標內部修改替換目標不再導致崩潰。
在字符串評估中的第一個語句有時會在常數折疊期間使用錯誤的 pragma 設置。 eval 'uc chr 0xe0'
會隨機選擇 Unicode、位元組和區域設置。這個問題已經修復。
修復了 @INC 過濾器 (在 @INC 中返回子程式的子程式) 返回值的處理方式。之前,綁定變數處理不當,並且將 $_ 設置為引用或型環可能導致崩潰。
SvPVbyte
XS 函數已修復以處理返回非字符串的綁定標量。以前在這些情況下 SvPV
會返回 utf8。
Perl 5.18.0 不小心在解構引用正則表達式時導致 --
和 ++
崩潰,並停止 ++
平坦化 v 字串。
bless
如果其第一個參數是綁定引用,不再出現 "Can't bless non-reference value"。
帶參數的 reset
不再跳過寫時拷貝的標量、正則表達式、型環拷貝和 v 字串。此外,遇到這些或唯讀值時,它也不再跳過具有相同名稱的任何陣列或哈希。
帶參數的 reset
現在會跳過與型環別名的標量 (for $z (*foo) { reset "z" }
)。以前它會損壞內存或崩潰。
ucfirst
和 lcfirst
無法尊重 bytes pragma。這是 Perl 5.12 的退步。[perl #117355]
對 UNIVERSAL::DESTROY
的更改現在會更新所有類中的 DESTROY 緩存,而不是導致已經銷毀對象的類繼續使用舊的子程式。這是 Perl 5.18 的退步。[perl #114864]
已經刪除了 Perl 5.18.0 中添加的去警告 "Useless use of '\'; doesn't escape metacharacter '%c'" 的所有已知偽陽性出現。[perl #119101]
$^E 的值現在在 Windows 上的信號處理程序中保存。[perl #85104]
一個語法文件句柄(如 open my $fh...
)通常根據當前套件和變量名稱來命名,例如 "main::$fh"。在遞迴中,文件句柄會失去名稱中的 "$fh" 部分。這個問題已經修復。
XSUBs返回的未初始化值不再免除未初始化警告。[perl #118693]
elsif ("")
不再錯誤地產生有關空上下文的警告。[perl #118753]
將 undef
傳遞給子例程現在會導致 @_ 包含相同的只讀未定義純量,該純量由 undef
返回。此外,如果 undef
是第一個參數,exists $_[0]
現在將返回 true。[perl #7508, #109726]
將不存在的數組元素傳遞給子例程通常不會自動初始化它,除非子例程修改其參數。這在負索引和數組內不存在的元素方面工作不正確。該元素將立即被初始化。延遲初始化已擴展以解決這些問題。[perl #118691]
在釋放了 @foo 數組後,將引用或glob賦值給 $#foo 返回的純量不再在調試構建上導致斷言失敗,在常規構建上也不再導致內存泄漏。
在64位平台上,像 1..1000000000000 這樣的大範圍不再崩潰,但會消耗所有內存。[perl #119161]
__DATA__
現在會將 DATA
句柄放在正確的套件中,即使通過glob賦值重命名了當前套件。
當 die
、last
、next
、redo
、goto
和 exit
解除作用域時,可能 DESTROY
遞歸調用當前正在退出的子例程或格式。在這種情況下,有時子例程內部的詞法變量將開始具有來自外部調用的值,而不是如應該的未定義。這個問題已經修復。[perl #119311]
${^MPEN} 不再被視為 ${^MATCH} 的同義詞。
Perl 現在會更努力返回 (caller)[2]
中的正確行號。
多行引用操作符內部的行號現在報告正確。[perl #3643]
在引用操作符中嵌入的代碼內的 #line
指示現在會被尊重。
當同一行上出現兩個here-doc標記時,第二個here-doc內部的行號現在是正確的。
在Perl 5.18中的一個優化做出了不正確的假設,導致與 Devel::CallParser CPAN 模塊的不良互動。如果加載了該模塊,則在 my(...) 列表之後聲明的詞法變量可能會在作用域退出時未能清除。
&xsub
和 goto &xsub
調用現在允許被調用的子例程自動初始化 @_ 的元素。
&xsub
和 goto &xsub
在 *_ 未定義且沒有 ARRAY 條目 (即 @_ 不存在) 的情況下不再崩潰。
&xsub
和 goto &xsub
現在與 tied @_ 一起工作。
過長的識別符不再導致緩衝區溢出 (和崩潰)。它們從 Perl 5.18 開始這樣做。
警告 "Scalar value @hash{foo} better written as $hash{foo}" 現在產生的偽陽性大大減少。特別是,@hash{+function_returning_a_list}
和 @hash{ qw "foo bar baz" }
不再警告。這也適用於數組切片。[perl #28380, #114024]
$! = EINVAL; waitpid(0, WNOHANG);
不再進入內部無限循環。[perl #85228]
已修復了文件處理程序重複的可能段錯誤。
@INC 中的子例程可以返回包含文件初始內容的標量的引用。然而,如果該標量沒有在其他地方被引用,則會過早釋放該標量,導致隨機結果。
last
不再返回同一語句迄今已累積的值,修復了諸如 push @a, last
的長期存在的錯誤,該錯誤會嘗試返回 @a,從而像標量一樣進行複製,導致錯誤 "Bizarre copy of ARRAY in last." [perl #3112]
在某些情況下,關閉已被複製到標準處理程序的管道文件處理程序,會使用 perl 的內部 waitpid 包裝器調用帶有零 pid 的 waitpid。通過對 [perl #85228] 的修復,不再傳遞此零 pid 給 waitpid
,可能導致阻塞進程。不再等待進程零。[perl #119893]
select
現在不再忽略第四個 (超時) 參數上的 magic,這導致效果,例如 select
永遠阻塞而不是預期的睡眠時間。這現在已經修復。[perl #120102]
for my class $foo
中的類名現在被正確解析。在類名的第二個字符後跟一個數字 (例如 'a1b') 的情況下,以前會出現錯誤 "Missing $ on loop variable"。
Perl 5.18.0 意外禁止了 -bareword
在 use strict
和 use integer
下。這已經修復。[perl #120288]
在一行的開頭的 -a
(或任何不是文件測試運算符的單個字母的連字符) 現在不再產生錯誤的 'Use of "-a" without parentheses is ambiguous' 警告。[perl #120288]
Lvalue 上下文現在正確傳播到裸塊和 lvalue 子例程中的 if
和 else
塊。以前,當以 lvalue 列表上下文返回數組和哈希時,有時可能不正確地展開,或者可能出現 "Bizarre copy" 錯誤。[perl #119797]
現在將左值內容傳播到 ||
和 &&
(以及它們的字母等效形式,or
和 and
) 的分支中。這意味著現在允許 foreach (pos $x || pos $y) {...}
通過 $_ 進行修改。
stat
和 readline
會記住上次使用的處理程序;前者用於特殊的 _
檔案處理程序,後者用於 ${^LAST_FH}
。如果 *foo 是上次傳遞給 stat
或 readline
的處理程序,eval "*foo if 0"
可能導致該處理程序被遺忘,如果該處理程序尚未打開,則已修復此問題。
已修復了造成崩潰的各種情況,如 delete $::{a}
、delete $::{ENV}
等。[perl #54044]
在調用 require
前將 $!
設置為 EACCESS 可能會影響 require
的行為。已修復此問題。
現在,“在表達式中無法使用 \1 來表示 $1” 警告消息僅出現在替換部分的右側。以前它可能會在左側嵌入的代碼中或在任何其他類似引號的操作符中出現。
將引用福標記為參考(bless $thisref, $thatref
)已經被禁止很久了,但第二個引用像 $/
和那些被綁定的神奇標量是豁免的。它們不再豁免。[perl #119809]
在 5.18 中意外允許如果類參數是帶有過時方法緩存的福標記(即,自上次方法調用以來,其類已定義子程序)。它們再次被禁止,如 5.16 中所示。
$x->{key}
,其中 $x 被聲明為 my Class $x
,如果已聲明 Class::FIELDS 子程序存根,則不再崩潰。
@$obj{'key'}
和 ${$obj}{key}
曾經免於編譯時字段檢查("沒有這樣的類字段";參見 fields),但現在不再如此。
傳遞給綁定數組的子程序的不存在的大索引陣列元素,然後嘗試訪問該元素,不再導致崩潰。
當當前包是綁定數組類時,聲明名為 NEGATIVE_INDICES 的子程序存根不再使負數數組索引崩潰。
在 CORE::GLOBAL:: 包中聲明 require
、glob
或 do
子程序存根不再使對應函數的調用編譯崩潰。
將 CORE::GLOBAL:: 函數別名為常量在 Perl 5.10 中停止工作,但現在已經修復。
當`...`
或qx/.../
調用readpipe
覆蓋時,現在會發生雙引號插值,就像沒有覆蓋時一樣。以前,存在覆蓋會使這些類似引號的運算符的行為像q{}
,抑制插值。[perl #115330]
<<<`...`
這裡文件(使用反引號作為定界符)現在調用readpipe
覆蓋。[perl #119827]
&CORE::exit()
和&CORE::die()
現在尊重vmsish提示。
未定義觸發DESTROY方法的全局變量,該方法未定義相同的全局變量,現在是安全的。它以前會產生“嘗試釋放未引用的全局指針”警告並洩漏內存。
如果對子程序重新定義(eval 'sub foo{}'
或newXS
用於XS代碼)觸發正在重新定義的子程序的DESTROY方法,並且該方法將一個子程序分配給相同的槽(*foo = sub {}
),$_[0]
現在不再指向一個已釋放的標量。現在,直到新的子程序被安裝之前,DESTROY被延遲。
在Windows上,perl不再對套接字句柄調用CloseHandle()。這使得在Windows上進行調試更加容易,因為它刪除了某些不相關的壞句柄異常。它還修復了在具有多個操作系統線程的Perl進程中,套接字函數隨機失敗的競爭條件,以及在dist/IO/t/cachepropagate-tcp.t中可能的測試失敗。[perl #120091/118059]
涉及UTF-8編碼字符串或奇怪的變量,如ties,overloads或字符串化的引用(並且在最近的perls中,純NOK變量)的格式,當該變量被視為字符串並重複剪切時,通常會產生錯誤的結果,如^<<<~~
和類似的。這個問題現在已經解決。[perl #33832/45325/113868/119847/119849/119851]
semctl(..., SETVAL, ...)
將在64位大端系統上將信號量設置為提供的整數的頂部32位,而不是底部32位。[perl #120635]
readdir()
現在只在出錯時設置$!
。當從目錄中讀取終止的undef
時,不再將$!
設置為EBADF
,除非系統調用設置$!
。[perl #118651]
&CORE::glob
不再由於perl的堆棧被破壞而導致間歇性崩潰。[perl #119993]
具有加載模塊的層(例如,“<:encoding(utf8)”)的open
現在不再因堆棧損壞而遇到崩潰的風險。
Perl 5.18通過從當前包查找AUTOLOAD而不是當前包的超級類來破壞了通過->SUPER::foo
方法調用的自動加載。這已經修復。[perl #120694]
一個長期存在的錯誤,導致do {} until CONSTANT
,其中常量保持為真值,讀取未分配的內存已經解決。這通常會在語法錯誤後發生。在Perl的過去版本中,它會偶爾崩潰。[perl #72406]
修正 HP-UX $!
失敗。HP-UX 的 strerror() 對於未知的錯誤碼會返回空字符串。這導致在 DEBUGGING 版本中斷言失敗。現在,"$!"
返回的字符串包含指示該代碼是未知錯誤的文字。
現在正確處理個別綁定到 @INC 的元素(如 tie $INC[0]...
)。以前,對於由這樣一個綁定元素返回的子程序是否會被視為子程序,取決於之前是否發生了 FETCH。
在相同的 utf8 處理過的 utf8 句柄上使用 getc
運算符後,在字節大小處理句柄上使用 getc
運算符會將字節視為 utf8,導致行為不正常(例如,出現損壞的 UTF-8 警告)。
在格式參數行的開頭出現的初始 {
在 v5.18 之前始終被解釋為區塊的開始。在 Perl v5.18 中,開始根據內容猜測它是匿名哈希構造還是區塊的模糊標記。現在恢復了以前的行為。[perl #119973]
在 Perl v5.18 中,undef *_; goto &sub
和 local *_; goto &sub
開始崩潰。這已經修復。[perl #119949]
在 Win32 上結合多個線程的反引號( ``
或 qx//
)可能會導致在一個線程上發送到 stdout 的輸出被另一個線程中的外部命令的反引號捕獲。
這也可能發生在偽分叉的進程上,因為 Win32 的偽分叉是以線程為基礎實現的。[perl #77672]
當 TMPDIR 被設置但指向無法創建臨時文件的目錄時,open $fh, ">+", undef
不再洩漏內存。[perl #120951]
for ( $h{k} || '' )
不再自動創建 $h{k}
。[perl #120374]
在 Windows 機器上,Perl 現在模擬 POSIX 使用環境進行區域初始化。以前會忽略環境。請參見 perllocale 中的 "ENVIRONMENT"。
當銷毀自引用 GLOB 時修復了崩潰。[perl #121242]
IO::Socket 已知在 AIX 5.3 上測試失敗。在請求跟踪器 #120835 中有一個補丁,可能應用於未來的版本。
以下模塊已知在此版本的 Perl 上測試失敗。已提交補丁,因此希望很快會有新版本。
Data::Structure::Util 版本 0.15
HTML::StripScripts 版本 1.05
List::Gather 版本 0.08。
2014年5月10日,里約熱內盧的Diana Rosa,27歲,與她總是掛在電腦螢幕上的毛絨駱駝一起長眠。她是一位熱情的Perl駭客,熱愛這門語言及其社區,從不錯過里約Perl開發者聚會。她是一位真正的藝術家,對編寫代碼、演唱詠嘆調和在牆上塗鴉充滿熱情。我們永遠不會忘記你。
Greg McCarroll於2013年8月28日離世。
Greg以許多良好的理由而聞名。他是第一屆YAPC::歐洲的組織者之一,該會議以一場不計劃的拍賣會結束,他在那裡拼命試圖籌集額外的資金,以避免會議損失。Greg誤會了一個倫敦Perl開發者聚會,誤到了一個星期晚; 幾年後,他是在YAPC::歐洲拍賣會上出售正式會議日期選擇的人,最終作為倫敦Perl開發者聚會的光榮領袖,他繼承了他所創造的那種不敬的混亂。
他總是樂於助人,友好和樂觀,你會被想念的,但永遠不會被遺忘。
Perl 5.20.0 自Perl 5.18.0以來經過約12個月的開發,跨越了124位作者的約2,900個文件,包含約470,000行的變更。
除自動生成的文件、文檔和發行工具外,約有280,000行的變更作用於1,800個.pm、.t、.c和.h文件。
Perl由一個充滿活力的用戶和開發者社區,在第三個十年中不斷茁壯。以下人士已知為Perl 5.20.0的改進作出了貢獻。
Aaron Crane、Abhijit Menon-Sen、Abigail、Abir Viqar、Alan Haggai Alavi、Alan Hourihane、Alexander Voronov、Alexandr Ciornii、Andy Dougherty、Anno Siegel、Aristotle Pagaltzis、Arthur Axel 'fREW' Schmidt、Brad Gilbert、Brendan Byrd、Brian Childs、Brian Fraser、Brian Gottreu、Chris 'BinGOs' Williams、Christian Millour、Colin Kuskie、Craig A. Berry、Dabrien 'Dabe' Murphy、Dagfinn Ilmari Mannsåker、Daniel Dragan、Darin McBride、David Golden、David Leadbeater、David Mitchell、David Nicol、David Steinbrunner、Dennis Kaarsemaker、Dominic Hargreaves、Ed Avis、Eric Brine、Evan Zacks、Father Chrysostomos、Florian Ragwitz、François Perrad、Gavin Shelley、Gideon Israel Dsouza、Gisle Aas、Graham Knop、H.Merijn Brand、Hauke D、Heiko Eissfeldt、Hiroo Hayashi、Hojung Youn、James E Keenan、Jarkko Hietaniemi、Jerry D. Hedden、Jess Robinson、Jesse Luehrs、Johan Vromans、John Gardiner Myers、John Goodyear、John P. Linderman、John Peacock、kafka、Kang-min Liu、Karen Etheridge、Karl Williamson、Keedi Kim、Kent Fredric、kevin dawson、Kevin Falcone、Kevin Ryde、Leon Timmermans、Lukas Mai、Marc Simpson、Marcel Grünauer、Marco Peereboom、Marcus Holland-Moritz、Mark Jason Dominus、Martin McGrath、Matthew Horsfall、Max Maischein、Mike Doherty、Moritz Lenz、Nathan Glenn、Nathan Trapuzzano、Neil Bowers、Neil Williams、Nicholas Clark、Niels Thykier、Niko Tyni、Olivier Mengué、Owain G. Ainsworth、Paul Green、Paul Johnson、Peter John Acklam、Peter Martini、Peter Rabbitson、Petr Písař、Philip Boulain、Philip Guenther、Piotr Roszatycki、Rafael Garcia-Suarez、Reini Urban、Reuben Thomas、Ricardo Signes、Ruslan Zakirov、Sergey Alekseev、Shirakata Kentaro、Shlomi Fish、Slaven Rezic、Smylers、Steffen Müller、Steve Hay、Sullivan Beck、Thomas Sibley、Tobias Leich、Toby Inkster、Tokuhiro Matsuno、Tom Christiansen、Tom Hukins、Tony Cook、Victor Efimov、Viktor Turskyi、Vladimir Timofeev、YAMASHINA Hio、Yves Orton、Zefram、Zsbán Ambrus、Ævar Arnfjörð Bjarmason。
上述名單幾乎肯定是不完整的,因為它是從版本控制歷史自動生成的。特別是,它不包括向 Perl Bug 追踪器報告問題的(非常感謝)貢獻者的名字。
這個版本中包含的許多更改來自於 Perl 核心中包含的 CPAN 模塊。我們感謝整個 CPAN 社區幫助 Perl 蓬勃發展。
有關 Perl 所有歷史貢獻者的更完整列表,請參見 Perl 源代碼發行版中的 AUTHORS 文件。
如果您發現您認為是 bug,您可以查看最近發布在 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 文件。
版權信息,請參閱 Artistic 和 Copying 文件。