perl5320delta - Perl v5.32.0 的新功能
本文檔描述了 5.30.0 版本和 5.32.0 版本之間的差異。
如果您正在從 5.28.0 等較早版本升級,請先閱讀 perl5300delta,其中描述了 5.28.0 和 5.30.0 之間的差異。
一個名為 isa
的新實驗性中綴運算子,用於測試給定對象是否是給定類或從其衍生的類的實例
if( $obj isa Package::Name ) { ... }
詳細資訊請參閱 perlop 中的「Class Instance Operator」。
詳細資訊請參閱 https://www.unicode.org/versions/Unicode13.0.0/。
某些比較運算符,根據其結合性,與同一優先級的某些運算符進行鏈接(但絕不與不同優先級的運算符鏈接)。
if ( $x < $y <= $z ) {...}
行為與
if ( $x < $y && $y <= $z ) {...}
(假設 "$y"
與其外觀一樣簡單的純量一樣。)
您可以在 perlop 中的 「Operator Precedence and Associativity」 中瞭解更多資訊。
Identifier_Status
和Identifier_Type
已被支援Unicode已修訂其正規表示式需求:https://www.unicode.org/reports/tr18/tr18-21.html。作為其中的一部分,他們希望公開更多屬性,這些屬性不是嚴格的UCD(Unicode字符資料庫)的一部分。這兩個屬性用於檢查輸入以進行安全性目的。有關其使用詳情請參見:https://www.unicode.org/reports/tr39/。
qr/\p{Name=...}/
或qr!\p{na=/(SMILING|GRINNING) FACE/}!
Unicode名稱屬性現在可以在正規表示式模式中訪問,作為\N{...}
的替代方法。兩種方法的比較請參見:"Comparison of \N{...} and \p{name=...}" in perlunicode。
上面的第二個例子顯示了通配符子模式在此屬性中也是可用的。參見:"Wildcards in Property Values" in perlunicode。
POSIX::mblen()
、mbtowc
和wctomb
POSIX::mblen()
、mbtowc
和wctomb
函數現在可在位移狀態區域(shift state locales)上運行,在C99及以上編譯器上線程安全(thread-safe),當在具有區域線程安全性的平台上執行時,長度參數現在是可選的。
這些函數始終在當前的C語言區域(locale)下執行。 (參見:perllocale。)大多數區域是無狀態的,但有幾個,特別是幾乎不會遇到的ISO 2022,會在調用這些函數時保持狀態。以前在每次調用時清除狀態,但現在除非適當的參數是undef
,否則不會重置狀態。
在線程化的Perl中,當可用時,將C99函數mbrlen(3)、mbrtowc(3)和wcrtomb(3)替換為普通函數。這使得這些函數在執行時在區域線程安全的平台上是線程安全的。
mblen
和mbtowc
中的字符串長度參數現在是可選的;僅在您希望將源字符串中解析的長度限制為實際長度以下時才有用。
請參見:"(*pla:pattern)" in perlre、"(*plb:pattern)" in perlre、"(*nla:pattern)" in perlre以及"(*nlb:pattern)" in perlre。使用這些不再生成警告;禁用警告類別experimental::alpha_assertions
的現有代碼將繼續工作,無需進行任何更改。啟用該類別不起作用。
請參閱 "perlre" 中的 "腳本執行" 。 現在使用這些功能不再生成警告;已經禁用警告類別 experimental::script_run
的現有程式碼將繼續無需任何更改即可運作。 啟用此類別不會產生任何效果。
以前,在解析器中進行功能檢查時,如果功能設置在功能捆綁之外,則需要進行哈希查找,現已優化為位元遮罩檢查。 [GH #17229]
Perl 現在在 GitHub 上開發。 您可以在 https://github.com/Perl/perl5 找到我們。
非安全性錯誤現在應通過 GitHub 報告。 安全問題應繼續按照 perlsec 中記錄的方式報告。
這對於追蹤正則表達式編譯器中的錯誤非常有用。 如果您在命令行上指定了 -Drv
; 或者在任何 perl 中,如果模式是在 use re qw(Debug DUMP_PRE_OPTIMIZE)
或 use re qw(Debug COMPILE EXTRA)
的範圍內編譯的,則在 -DDEBUGGING
的 Perl 上會發生此傾印。 (除了第二種情況,其他情況也會顯示其他信息。)
嵌套正則表達式定量器的存儲空間計算中的有符號 size_t
整數溢出可能會導致 Perl 的正則表達式編譯器中的堆緩衝區溢出,從而用攻擊者提供的數據覆蓋在正則表達式存儲空間之後分配的內存。
目標系統需要足夠的內存來分配嵌套定量器的部分擴展,以防止發生溢出。 在 64 位系統上不太可能滿足此要求。
發現者:The Tarantula Team 的 ManhND、Vingroup 的 VinCSS 成員。
計算正則表達式引擎指令間偏移量時的整數溢位可能導致已編譯的正則表達式的中介語言狀態損壞。攻擊者可以利用此行為將指令插入 Perl 正則表達式的編譯形式中。
發現者:Hugo van der Sanden 和 Slaven Rezic。
Perl 正則表達式編譯器通過遞歸調用 S_study_chunk()
優化正則表達式的中介語言表示,可能導致已編譯的正則表達式的中介語言狀態損壞。
發現者:Sergey Aleynikov。
使用 Perl 編寫的應用程序只有在評估攻擊者提供的正則表達式時才會對上述任何缺陷產生漏洞。以這種方式評估正則表達式已知是危險的,因為正則表達式引擎在這種使用情況下不會防止拒絕服務攻擊。
這些功能有些不適當,或者干擾執行此任務所使用的算法。完整列表見 "屬性值中的萬用字串" 在 perlunicode。
POSIX::mbstowcs
和 POSIX::wcstombs
已移除這些函數因為缺陷的介面規範而永遠無法正常工作。顯然沒有人對它們有所需求,因為在這些函數聲稱可用的許多年裡,從未有人抱怨過,因此對它們的所謂 "支持" 現在已經被刪除。
(?[...])
的一個錯誤修復可能導致某些模式不再編譯見 "選定的錯誤修復"。先前使用的啟發式方法可能允許一些構造編譯(也許不是以程序員意圖的效果)的模式,而應該是錯誤的構造。雖然目前尚不清楚,但可能有一些錯誤的構造不再編譯。
\p{user-defined}
屬性現在始終優先於官方 Unicode 屬性以前,只有在正則表達式模式的編譯之前聲明了用戶定義屬性時,才會使用其定義而不是任何具有相同名稱的官方 Unicode 屬性。現在,它總是優先於官方屬性。這一更改可能會破壞依賴(可能不知情地)先前行為的現有代碼。如果沒有這個修復,如果 Unicode 發布了一個新版本,其中包含與您長期使用的某個屬性相同名稱的新屬性,當您升級到使用該新 Unicode 版本的 perl 時,您的程序將會中斷。見
像這樣的程式碼
my $var;
$sub = sub () { $var };
在某些可修改的上下文中引用$var
,現在在定義子程序時會產生例外情況。
可以通過在子程序定義中添加一個返回來避免此錯誤
$sub = sub () { return $var };
自 Perl 5.22 以來已經被棄用。 [GH #17020]
vec
這些字符串在內部以 UTF-8 表示,而vec
是一種位操作,對於這些字符串可能會產生意外的結果。這在 Perl 5.28.0 中已被棄用。
在先前的棄用週期之後,一些用法已經是非法的。剩餘的用法現在已被禁止,在 Perl 5.28.0 中已被棄用。參見perldeprecation。
Sys::Hostname::hostname()
不接受參數這個用法在 Perl 5.28.0 中已被棄用,現在是致命的。
以前,範圍"0" .. "-1"
會產生從"0"到"99"的數字字符串範圍;現在這將產生一個空列表,就像0 .. -1
一樣。這也意味著"0" .. "9"
現在會產生一個整數列表,以前會產生一個字符串列表。
這是由於一個特例,該特例將以"0"開頭的字符串視為字符串,因此像"00" .. "03"
這樣的範圍會產生"00"、"01"、"02"、"03"
,但沒有特別處理字符串"0"
。[GH #16770]
\K
現在在向前和向後查詢斷言中已禁止使用這是因為它導致意外行為,並且沒有人能夠定義所需的行為應該是什麼。[GH #14638]
my_strnlen
已經為沒有自己的 strnlen
實現的系統加快了速度。
grok_bin_oct_hex
(以及 grok_bin
、grok_oct
和 grok_hex
)已經加快了速度。
grok_number_flags
已經加快了速度。
sort
現在在像 sort {$a <=> $b}
或 sort {$b <=> $a}
這樣的情況下明顯更快。[GH #17608]
Archive::Tar 已從版本 2.32 升級到 2.36。
autodie 已從版本 2.29 升級到 2.32。
B 已從版本 1.76 升級到 1.80。
B::Deparse 已從版本 1.49 升級到 1.54。
Benchmark 已從版本 1.22 升級到 1.23。
charnames 已從版本 1.45 升級到 1.48。
Class::Struct 已從版本 0.65 升級到 0.66。
Compress::Raw::Bzip2 已從版本 2.084 升級到 2.093。
Compress::Raw::Zlib 已從版本 2.084 升級到 2.093。
CPAN 已從版本 2.22 升級到 2.27。
DB_File 已從版本 1.843 升級到 1.853。
Devel::PPPort 已從版本 3.52 升級到 3.57。
在 Win32 上生成的測試文件現在與在類 POSIX 系統上生成時相同。
diagnostics 已從版本 1.36 升級到 1.37。
Digest::MD5 已從版本 2.55 升級至 2.55_01。
Dumpvalue 已從版本 1.18 升級至 1.21。
先前,在將陣列元素傾印時遇到未定義值時,所印出的字串將為空陣列
。這已更改為最初預期的空槽位
。
DynaLoader 已從版本 1.45 升級至 1.47。
Encode 已從版本 3.01 升級至 3.06。
encoding 已從版本 2.22 升級至 3.00。
English 已從版本 1.10 升級至 1.11。
Exporter 已從版本 5.73 升級至 5.74。
ExtUtils::CBuilder 已從版本 0.280231 升級至 0.280234。
ExtUtils::MakeMaker 已從版本 7.34 升級至 7.44。
feature 已從版本 1.54 升級至 1.58。
新增了indirect
功能,預設啟用,但可用於關閉間接物件語法。
File::Find 已從版本 1.36 升級至 1.37。
在 Win32 平台上,測試不再需要檔案位於磁碟根目錄或可寫的根目錄。
File::Glob 已從版本 1.32 升級至 1.33。
File::stat 已從版本 1.08 升級至 1.09。
Filter::Simple 已從版本 0.95 升級至 0.96。
Getopt::Long 已從版本 2.5 升級至 2.51。
Hash::Util 已從版本 0.22 升級至 0.23。
由於範例程式碼無法與更新的 Perl 版本一起運作,因此已更新了摘要。[GH #17399]
I18N::Langinfo 已從版本 0.18 升級至 0.19。
I18N::LangTags 已從版本 0.43 升級至 0.44。
文件記錄了IGNORE_WIN32_LOCALE
環境變數。
IO 已從版本 1.40 升級至 1.43。
IO::Socket 不再對零協議值進行緩存,因為這表示實作將選擇一個協議。這意味著在不支援SO_PROTOCOL
的平台上,對於特定的套接字類型,協議方法可能會返回undef
。
現在在對 send()
方法的調用中始終尊重提供的 TO。 [GH#16891]
IO-Compress 已從版本 2.084 升級到 2.093。
IPC::Cmd 已從版本 1.02 升級到 1.04。
IPC::Open3 已從版本 1.20 升級到 1.21。
JSON::PP 已從版本 4.02 升級到 4.04。
Math::BigInt 已從版本 1.999816 升級到 1.999818。
Math::BigInt::FastCalc 已從版本 0.5008 升級到 0.5009。
Module::CoreList 已從版本 5.20190522 升級到 5.20200620。
Module::Load::Conditional 已從版本 0.68 升級到 0.70。
Module::Metadata 已從版本 1.000036 升級到 1.000037。
mro 已從版本 1.22 升級到 1.23。
Net::Ping 已從版本 2.71 升級到 2.72。
Opcode 已從版本 1.43 升級到 1.47。
open 已從版本 1.11 升級到 1.12。
overload 已從版本 1.30 升級到 1.31。
parent 已從版本 0.237 升級到 0.238。
perlfaq 已從版本 5.20190126 升級到 5.20200523。
PerlIO 已從版本 1.10 升級到 1.11。
PerlIO::encoding 已從版本 0.27 升級到 0.28。
PerlIO::via 已從版本 0.17 升級到 0.18。
Pod::Html 已從版本 1.24 升級到 1.25。
Pod::Simple 已從版本 3.35 升級到 3.40。
podlators 已從版本 4.11 升級到 4.14。
POSIX 已從版本 1.88 升級到 1.94。
re 已從版本 0.37 升級到 0.40。
Safe 已從版本 2.40 升級到 2.41。
Scalar::Util 已從版本 1.50 升級到 1.55。
SelfLoader 已從版本 1.25 升級到 1.26。
Socket 已從版本 2.027 升級到 2.029。
Storable 已從版本 3.15 升級到 3.21。
現在在測試中,從 Test::More 使用 note()
是可選的。這解決了在從 CPAN 安裝到非常舊的 Perl 上時與 Test::More 的循環依賴。
超過 2GB 的 Vstring 魔術字符串現在被禁止。
對於檢索目的,正則表達式對象未正確計算對象 ID。這將使結構損壞,或在某些情況下導致運行時錯誤。 [GH#17037]
已將Sys::Hostname升級至版本1.23。
已將Sys::Syslog升級至版本0.36。
已將Term::ANSIColor升級至版本5.01。
已將Test::Simple升級至版本1.302175。
已將Thread升級至版本3.05。
已將Thread::Queue升級至版本3.14。
已將threads升級至版本2.25。
已將threads::shared升級至版本1.61。
已將Tie::File升級至版本1.06。
已將Tie::Hash::NamedCapture升級至版本0.13。
已將Tie::Scalar升級至版本1.05。
已將Tie::StdHandle升級至版本4.6。
已將Time::HiRes升級至版本1.9764。
已移除舊代碼,如對於5.6以前的Perl和經典的MacOS的支援。[GH #17096]
已將Time::Piece升級至版本1.3401。
已將Unicode::Normalize升級至版本1.27。
已將Unicode::UCD升級至版本0.75。
已將VMS::Stdio升級至版本2.45。
已將warnings升級至版本1.47。
已將Win32升級至版本0.53。
已將Win32API::File升級至版本0.1203_01。
已將XS::APItest升級至版本1.09。
Pod::Parser已從核心發行版中移除。它仍然可以從CPAN上下載。這解決了[#13194]。
我們已嘗試更新文件以反映本文列出的更改。如果您發現我們遺漏了任何內容,請在https://github.com/Perl/perl5/issues上開啟一個問題。
此外,已進行以下選定更改
簡化一些regnode定義
更新BOUND
和NBOUND
的定義。
新增ANYOFHs regnode
這個節點類似於ANYOFHb
,但當所有匹配的碼點中的多個前導字節相同時使用。
ANYOFHb
用於避免將UTF-8轉換為碼點以進行匹配。它檢查UTF-8編碼的目標中的第一個字節是否是所需的字節,從而排除了大部分可能的碼點。
更新sv_2pvbyte
以提到如果SV不能降級將會croak。
更新sv_setpvn
以提到此函數不會更改UTF-8標誌,並且保證有終止的NUL字節。
已添加PL_phase
的文檔。
已更新並澄清了grok_bin
、grok_oct
和grok_hex
的文檔。
為實驗性的'isa'操作符添加文檔
(S experimental::isa) 如果使用了(isa
)操作符,則會發出此警告。該操作符目前處於實驗階段,其行為可能會在Perl的未來版本中更改。
caller
與__FILE__
和__LINE__
類似,這裡返回的文件名和行號可能會被perlsyn中的"Plain Old Comments (Not!)"描述的機制所更改。
__FILE__
它可以被perlsyn中的"Plain Old Comments (Not!)"描述的機制所更改。
__LINE__
它可以被perlsyn中的"Plain Old Comments (Not!)"描述的機制所更改。
return
現在提到不能從do BLOCK
返回。
open
open()
部分已經顯著更新。
不再建議使用perl的malloc
。現代系統的malloc
被假定比perl的實現好得多。
已刪除關於embed.fnc標誌的文檔。現在embed.fnc內有足夠的註釋。任何更改該文件的人都會首先看到這些註釋,因此此處的條目現在已經多餘。
更新了 UTF8f
的文件
添加了缺失的 =for apidoc
行
现在详细介绍了 Perl 字符串与 C 字符串之间的区别。
已澄清重复运算符 x
的文档。[GH #17335]
现代化了关于 open
和句柄使用的文档,推荐使用 3-arg open 和词法变量,而不是裸字。
各种更新和修复,包括使所有示例都符合 strict 安全性,并用 use warnings
替换了 -w
。
'isa' 运算符是实验性的
这是一个实验性功能,在通过 use feature 'isa'
启用时可用。它会在 experimental::isa
类别中发出警告。
现在在此处解释了 perl 解释器中的各种堆栈的详细信息。
添加了关于使用 Z<>
的建议。
更新了 timegm
示例,使用正确的年份格式 1970 而不是 70。[GH #16431]
修复了一些拼写错误。
现在建议将 $]
转换为字符串并进行数值比较。
添加了几个之前缺少文档的函数的文档。
建议使用 libffi
通过 CPAN 模块如 FFI::Platypus 或 FFI::Raw 进行简单库绑定。
setlocale
关于线程化构建的警告已更新,指出它不适用于 Perl 5.28.X 及更高版本。
Posix::SigSet->new(...)
更新为如果任何提供的信号无法添加到集合中,则会抛出错误。
此外,已進行以下選定更改
现在指向已停用的 https://search.cpan.org 网站的链接现在指向相应的 https://metacpan.org URL。[GH #17393]
ExtUtils::XSSymSet 的 man 页面现在仅在 VMS 上安装,这是该模块安装的唯一平台。[GH #17424]
網址已更改為 https://
,並更新了失效的連結。
如適用,文件中的網址已從使用 http://
協議更改為 https://
。這也影響了位於 https://rt.perl.org 的錯誤跟踪器的位置。
一些指向 OS/2 函式庫、地址無害化檢查器和其他系統工具的連結已經失效。這些連結已被更新為可用的連結。
一些指向 perl5-porters 上舊電子郵件地址的連結已經失效。這些連結已被更新為可用的連結。
已對診斷輸出進行了以下新增或更改,包括警告和致命錯誤訊息。有關完整的診斷訊息列表,請參見 perldiag。
在正則表達式中期望插入擴展的字符類別;在 m/%s/ 中標記為 <-- HERE。
這是對“對現有診斷的更改”中列出的多個錯誤訊息的替換。
(F) 在 0x
之後未找到十六進位數位,或者在 0b
之後未找到二進位數位。
這實際上不是新訊息,但當警告類別 portable
啟用時,現在會輸出。
在正則表達式模式編譯期間引發時,該警告會在模式中精確標記發生位置的結尾添加額外文字。
這取代了一個較不具體的警告,並提供了虛假資訊的警告。這個新警告與已存在的類似警告 \o{}
相對應。
...在正則表達式模式編譯期間引發時,現在會在結尾添加額外文字,精確標記發生位置的位置。
...在正則表達式模式編譯期間引發時,現在會在結尾添加額外文字,精確標記發生位置的位置。
...在正則表達式模式編譯期間引發時,現在會在結尾添加額外文字,精確標記發生位置的位置。
...在正則表達式模式編譯期間引發時,現在會在結尾添加額外文字,精確標記發生位置的位置。
...現在包含詞組 "提早結束 \o",並在正規表達式模式編譯期間,當發生時在模式中的確切位置添加了額外的文本。在某些情況下,解析的文本已經被澄清。
從 Perl 5.32 開始,此訊息不再產生。取而代之的是,在 perldiag 中使用 "非八進位字元 '%c' 提早結束。解析為 "%s""。
此訊息的一些實例以前輸出十六進位數字 A
、B
、C
、D
、E
和 F
的小寫。現在它們全部一致地使用大寫。
以下三個診斷已被刪除,並由 Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/
取代:在正規表達式中期望插值的擴展字符類;在 m/%s/ 中標記為 <-- HERE
,在正規表達式中期望封閉的嵌套擴展字符類;在 m/%s/ 中標記為 <-- HERE
,以及 在正規表達式中期望 '(?flags:(?[...';在 m/%s/ 中標記為 <-- HERE
。
代碼點 0x%X 不是 Unicode,也不是可移植的
警告刪除了行 代碼點大於 0xFFFF_FFFF 需要大於 32 位元字的行。
因為在 32 位元平台上,不再允許那麼大的代碼點。
此錯誤訊息已從原始的 無法在 "%s" 中使用全域 %s
稍微重新格式化,特別是具有誤導性的錯誤訊息,如 無法在 "my" 中使用全域 $_
現在呈現為 無法在子例程簽名中使用全域 $_
。
此錯誤訊息取代了以前的 不再允許從其他地方可能修改的語彙變數中使用的常數。在 Perl 5.32 中將不再允許此用法
,以反映此前已被棄用的用法現在已轉化為異常的事實。此訊息的分類也已從 D(棄用)更新為 F(致命)。
另請參閱"不相容的變更"。
現在在與以前的 在反轉字符類中或作為範圍終點的 \N{} 受限於一個字符
的相同情況下發出 \N{} 限制為一個字符
。
這是由於 Perl 5.30 中添加了新情況,這些情況之前的措辭未涵蓋。
錯誤跟蹤器首頁的 URL 現在指向 GitHub。
這是一個新的工具,作為 IO::Compress::Base 升級的一部分包含在內。
streamzip 從 stdin 創建一個 zip 檔案。該程序將從 stdin 讀取數據,將其壓縮成一個 zip 容器,默認情況下,將一個流式 zip 文件寫入到 stdout。
對於 clang++,在 Configure 的探測中添加 #include <stdlib.h>
到 futimes
、strtoll
、strtoul
、strtoull
、strtouq
的探測中,否則這些探測將無法編譯。
使用編譯和運行測試來滿足 clang++ 對 lchown
的需求,這樣可以更可靠地檢測到它。
對於 C++ 編譯器,將 #include <stdio.h>
添加到 Configure 的探測中,以供 getpgrp
和 setpgrp
使用,因為它們使用 printf,而 C++ 編譯器可能會在編譯時失敗而不僅僅是警告。
檢查編譯器是否能處理內聯屬性。
檢查字符數據對齊。
Configure 現在正確處理 gcc-10。以前它將其解釋為 gcc-1,並打開了 -fpcc-struct-return
。
Perl 現在不再探測 d_u32align
,在所有平台上默認為 define
。在以前的探測中(僅限於 32 位平台上)進行此檢查時,這是容易出錯的。[GH #16680]
更新了在 Z/OS(本地 EBCDIC)上構建 perl 的文檔和提示。這仍然是一項正在進行中的工作。
添加了一個新的對 malloc_usable_size
的探測。
在 C++ 和 clang++ 的檢測中對 Configure 進行了改進。由 Andy Dougherty 進行中的工作。 [GH #17033]
autodoc.pl
這個工具重大改版,重寫了 perlintern 和 perlapi,恢復了在 embed.fnc 和 Devel::PPPort 中使用的標誌的一致性,並允許刪除代碼中許多多餘的 =for apidoc
条目。
現在定義了 ECHO
宏。這是在 FreeBSD 上更改的一個 dtrace
規則中使用的,並且 FreeBSD 的 make 顯然預定義了它。Solaris make 不會預定義 ECHO
,這導致該規則在 Solaris 上出錯。 [GH #17057]
現在支持 Bison 版本 3.1 到 3.4。
添加了測試並對此版本中的其他添加和更改進行了修改。此外,進行了以下重大更改
t/run/switches.t 不再使用(和重用)t/ 下的 tmpinplace/ 目錄。這可能會防止出現偽隨機失敗。[GH #17424]
修復了 POSIX::mbtowc
中的各種錯誤。現在避免了與其他線程的潛在競爭,以前返回的寬字符可能是垃圾。
修正了POSIX::wctomb
中的各種錯誤。現在已避免了與其他執行緒的潛在競爭,並且如果字符串參數是共享的或者未預先分配足夠長度的字符串來容納結果,以前會導致段錯誤。
已修正了包含控制字符和Unicode的純量的某些測試輸出在EBCDIC上的問題。
t/charset_tools.pl:在ASCII平台上避免一些工作。
t/re/regexp.t:加速ASCII平台上的許多正則表達式測試。
t/re/pat.t:跳過在EBCDIC上無法工作的測試。
現在已移除在Windows CE上構建perl的支持。
如果cc
是clang
,將使用cc
填充plibpth
。[GH #17043]
修正了在NetBSD 8.0上使用g++編譯Perl的問題。[GH #17381]
現在Configure
將找到最新版本的Oracle Developer Studio編譯器,它們位於/opt/developerstudio*
下。
Configure
現在使用gethostby*
函數的檢測類型,使Perl再次能夠在某些Solaris配置上編譯。
隨著補丁包C99 V2.0的發布,VSI為許多先前缺失的C99功能提供了支持。在安裝了該補丁包的系統上,Perl的配置過程現在將檢測到stdint.h
標頭以及以下函數的存在:fpclassify
、isblank
、isless
、llrint
、llrintl
、llround
、llroundl
、nearbyint
、round
、scalbn
和scalbnl
。
現在在VMS上,-Duse64bitint
是默認的。
Perl 5.32 已在 z/OS 2.4 上進行測試,以下是一些注意事項:
只有靜態構建(默認)才能可靠地構建
在使用語言環境時,z/OS 未正確處理 LC_MESSAGES
類別,因此在編譯 perl 時,您應將以下內容添加到您的 Configure 選項中
./Configure <other options> -Accflags=-DNO_LOCALE_MESSAGES
z/OS 不支援帶有線程的語言環境,因此在編譯線程 perl 時,您應將以下內容添加到您的 Configure 選項中
./Configure <other Configure options> -Accflags=-DNO_LOCALE
一些與 perl 一起提供的 CPAN 模塊無法通過其自測中的至少一個。這些模塊包括:Archive::Tar、Config::Perl::V、CPAN::Meta、CPAN::Meta::YAML、Digest::MD5、Digest::SHA、Encode、ExtUtils::MakeMaker、ExtUtils::Manifest、HTTP::Tiny、IO::Compress、IPC::Cmd、JSON::PP、libnet、MIME::Base64、Module::Metadata、PerlIO::via-QuotedPrint、Pod::Checker、podlators、Pod::Simple、Socket 和 Test::Harness。
失敗的原因從自測本身存在缺陷,模塊實際上運行良好,到模塊在 EBCDIC 平台上根本無法運行。
savepvn
的 len 參數現在是 Size_t
而不是 I32
,因為我們可以處理長度超過 31 位元的字串。
語法分析器(Perl_yylex()
在 toke.c 中)以前是一個長達 4100 行的單一函數,大量使用 goto
和許多廣泛範圍的本地變量來完成其工作。它現在已被分解為幾十個更小的靜態函數;最大的剩餘塊(yyl_word_or_keyword()
)大約有 900 多行,由一個 switch
語句組成,其所有的 case
組都是獨立的。這應該更容易理解和維護。
perl 核心使用的操作系統級別的信號處理程序和類型(Sighandler_t)被聲明為具有三個參數,但始終告訴操作系統使用一個參數來調用它們。這已經通過聲明它們具有一個參數來修復。有關詳細信息,請參見合併提交 v5.31.5-346-g116e19abbf
。
處理 tr///
的代碼已進行了廣泛修訂,修復了各種錯誤,特別是當源和/或替換字串包含代碼點在 255 以上的字符時。一些錯誤是未記錄的,其中一個是在某些情況下(但不是所有情況),帶有 /s
時,擠壓是基於源而不是替換進行的。一個已記錄的錯誤得到了修復:[GH #14777]。
已經建立了一個新的用於處理UTF-8編碼Unicode字符串的XS編寫器的新宏,比perlapi中的"UTF8_SKIP
"更安全,但不及perlapi中的"UTF8_SAFE_SKIP
"安全。它不會讀取超過空字符。它已經在Devel::PPPort 3.55及更高版本中進行了後移。
添加了PL_curstackinfo->si_cxsubix
字段。這記錄了最近推送的子/格式/評估上下文的堆棧索引。它由cx_pushsub()
,cx_popsub()
等自動設置和還原,但如果您對上下文堆棧進行了任何不尋常的操作,則需要手動管理。
現在,當輸入以UTF-8編碼時,處理字符類型分類和更改大小寫的各種宏現在需要一個額外的參數,以防止潛在的讀取超出緩衝區的末尾。自Perl 5.26以來,使用這些已生成過時警告。詳細信息請參見perldeprecation中的"In XS code, use of various macros dealing with UTF-8."。
新的解析器函數parse_subsignature()允許關鍵字插件在生效use feature 'signatures'
時解析子程序簽名。這允許自定義關鍵字實現與常規sub
聲明相似的語義,其中包括簽名。[GH #16261]
由於在某些平台上,當暫時切換地區設置時,我們需要持有互斥鎖,因此新增了一些宏(STORE_LC_NUMERIC_SET_TO_NEEDED_IN
,WITH_LC_NUMERIC_SET_TO_NEEDED
和WITH_LC_NUMERIC_SET_TO_NEEDED_IN
),以使其更容易安全且有效地執行此操作作為一部分。[GH #17034]
在64位系統上,為分配每個OP結構的記憶體開銷已經減少了8個字節。
當[GH #17035]|https://github.com/Perl/perl5/issues/17035發生時,eval_pv()不再對異常進行字符串化處理。
PERL_DESTRUCT_LEVEL環境變量以前僅在使用DEBUGGING支持構建的perl二進制文件上受到尊重。現在在所有perl構建上都進行檢查。其正常用法是在退出之前強制perl釋放其分配的每個內存塊,這在使用自動洩漏檢測工具(如valgrind)時非常有用。
API eval_sv() 現在接受 G_RETHROW
旗標。如果設置了此旗標並且在編譯或執行提供的程式碼時拋出異常,將重新拋出該異常,並且 eval_sv() 不會返回。[GH #17036]
作為修復 [GH #1537] 的一部分,perl_parse() 現在如果在 BEGIN
、UNITCHECK
或 CHECK
區塊中調用 exit(0),則返回非零值。
大多數在編譯期間遞歸遍歷 op 樹的函數都已經改為非遞歸。這樣可以避免當 op 樹嵌套深度很深時(例如 $n == 1 ? "one" : $n == 2 ? "two" : ....
,尤其是在自動生成的代碼中)從堆棧溢出引起的 SEGV 問題。
當代碼在單獨的線程中編譯時,尤其容易注意到這一點,因為線程通常具有默認的小堆棧。
之前在 perlfunc 中 "require" 只會將特殊的內建 SV &PL_sv_undef
視為 %INC
中的值,就像之前的 require
失敗一樣,將其他未定義的 SV 視為之前的 require
成功。這可能會導致 require
意外成功,例如在 local %INC = %INC;
中。這已經修復。[GH #17428]
正則表達式中的 (?{...})
eval 組不再意外觸發 "EVAL without pos change exceeded limit in regex" [GH #17490]。
擴展的括號字符類 (?[...])
不會在將先前編譯的此類別插入另一個中時錯誤地引發錯誤。先前使用的啟發式方法已被可靠的方法替換,因此生成的診斷信息已更改。參見 "診斷"。
編譯的 Unicode 屬性萬用字元子模式的調試顯示(例如通過指定 -Dr
或 use re
(帶有適當的選項))不再具有多餘的輸出。
修復正則表達式引擎中的斷言失敗。[GH #17372]
在 B::UNOP_AUX::aux_list()
之後修復了 pp_hot.c 中的核心轉儲。[GH #17301]
載入 I/O 現在是線程安全的。[GH #14816]
\p{user-defined}
覆蓋了官方 Unicode。[GH #17025]
在此修補程式之前,覆蓋有時候會生效。
正確處理填充的 /il
regnodes 和多字符折疊。
在進行 minitest 時發生編譯錯誤。[GH #17293]
將 %-
、%+
的實現移入核心。
在 grok_inf_nan
中讀取超出緩衝區的內容。[GH #17370]
使用 LC_MESSAGES
解決 glibc 的問題。[GH #17081]
使用 %n
格式的 printf()
或 sprintf()
可能在除錯構建中引發 panic,或在生成帶有 SVfUTF8
標誌字符串時報告錯誤的緩存長度值。[GH #17221]
use strict "subs"
現在強制使用在優化為 multiconcat
運算子的裸字常數中。[GH #17254]
修復了正則表達式模式中的內存泄漏。[GH #17218]
當將字符串轉換為數字時,Perl 不再將以 "0x" 或 "0b" 開頭的字符串視為十六進制或二進制數字,而是恢復了 perl 5.30.0 中意外引入的行為更改,該更改旨在提高將字符串轉換為浮點數時的精度。[GH #17062]
對於包含 Unicode 文字的正則表達式,對非 SVf_UTF8
字符串進行匹配可能會在每次匹配嘗試時泄漏一個 SV。[GH #17140]
對於八進制和二進制浮點數文字的重載,始終傳遞帶有 0x
前綴的字符串,而不是適當的 0
。[GH #14791]
$@ = 100; die;
現在正確將 100 作為異常傳遞,而不是忽略它。[GH #17098]
在讀取唯讀的 $@
時拋出異常可能會導致無限遞歸,因為 Perl 試圖更新 $@
,這將引發另一個異常,從而導致堆棧溢出。如果 $@
不是簡單可寫的 SV,Perl 現在將其替換為副本。[GH #17083]
如果您具有必要的權限,現在設置 $)
將正確設置補充組 ID。[GH #17031]
在管道上執行close()現在會預先清除來自IO SV的PerlIO物件。這可以防止在close()等待子程序完成時,如果信號處理程序調用die()或exit(),則再次嘗試關閉已經關閉的PerlIO物件。 [GH#13929]
sprintf("%.*a", -10000, $x)
由於對負精度值的處理不當,會導致緩衝區溢出。 [GH#16942]
對參考執行scalar()可能會在編譯期間導致錯誤的斷言失敗。 [GH#16969]
%{^CAPTURE_ALL}
現在是文檔中記錄的%-
的別名,而不是錯誤地作為[GH#16105]|https://github.com/Perl/perl5/issues/16105
的別名。
%{^CAPTURE}
如果先提到@{^CAPTURE}
,則無法工作。對於%{^CAPTURE_ALL}
和@{^CAPTURE_ALL}
也是如此,儘管[GH#17045]|https://github.com/Perl/perl5/issues/17045
]
異常大(超過2GB)的浮點格式寬度可能會導致底層snprintf()調用中的整數溢出,從而導致斷言。現在,格式化的浮點寬度限制為int的範圍,即snprintf()的返回值。 [#16881]
在子解析(例如使用"${這裡是代碼}"
或s/.../這裡是代碼/e
)中解析以下構造的方式已更改以匹配它們正常解析的方式
print $fh ...
不再產生語法錯誤。
像s/.../ ${time} /e
這樣的代碼現在在啟用警告時可以正確生成“模糊使用${time}解析為$time在...”警告。
在子解析中,@x {"a"}
(有空格)現在在啟用警告時可以正確生成“寫得更好”警告。
屬性現在可以在子解析中使用。 [GH#16847]
不完整的十六進制和二進制字面量,如0x
和0b
,現在被視為下一個標記的一部分。 [#17010]
在子解析中出現的多餘的)
,例如在s/.../這裡是代碼/e
或"...${這裡是代碼}"
中,不再混淆解析器。
以前,子解析由生成的(
和)
標記括起來,因此多餘的)
會在不執行正常子解析清理的情況下關閉構造,從而混淆解析器並可能導致斷言失敗。
此類結構現在被人工標記包圍,這些標記不能包含在源代碼中。 [GH #15814]
對子例程的引用賦值,例如 \&foo = \&bar;
,在 [GH #16987]|https://github.com/Perl/perl5/issues/16987
中靜默地不執行任何操作。
如果目標 SV 被信號處理程序修改,sv_gets() 現在會更好地恢復。 [GH #16960]
readline @foo
現在在標量上下文中評估 @foo
。之前它會在列表上下文中評估,在這種情況下,由於 readline() 只從堆疊中彈出一個參數,堆疊可能會下溢,或者在堆疊上留下意外的值。 [GH #16929]
在 5.31.1 中,解析不完整的十六進制或二進制文字的行為已更改為將此類文字僅視為 0,將隨後的 x
或 b
解析為下一個標記的一部分。這可能會導致一些靜默的行為更改,因此現在不完整的十六進制或二進制文字將產生致命錯誤。 [GH #17010]
即使例外是一個虛假的重載值,eval_pv() 的 croak_on_error 標誌現在也會引發異常。 [GH #17036]
如果在 BEGIN
、UNITCHECK
或 CHECK
塊中調用 exit(0),則不再運行 INIT
塊和程序本身。 [GH #1537]
open my $fh, ">>+", undef
現在以附加模式打開臨時文件:寫入將在寫入之前尋找到文件的末尾。 [GH #17058]
修復了在搜索未初始化值警告的源頭時,在子樹包含 OP_MULTIDEREF 的操作時發生的 SEGV。 [GH #17088]
Jeff Goff(JGOFF 或 DrForr),Perl 和 Raku 社區的重要成員,也是我們所有人的摯友,在2020年3月13日去世。 DrForr 是社區的著名成員,參加並在無數活動中發言,為眾多項目做出貢獻,並以任何方式提供幫助。
他的離世在我們的心中和社區中留下了一個空白,我們將非常想念他。
Perl 5.32.0 自 Perl 5.30.0 以來大約經過了 13 個月的開發,包含了來自 89 位作者的大約 220,000 行的變更,涵蓋了約 1,800 個文件。
在排除自動生成的文件、文檔和發布工具後,大約有 880 個 .pm、.t、.c 和 .h 文件的 140,000 行變更。
由於一個充滿活力的用戶和開發人員社區的努力,Perl 在進入其第四個十年時仍然蓬勃發展。以下人員被知道貢獻了成為 Perl 5.32.0 的改進。
Aaron Crane、Alberto Simões、Alexandr Savca、Andreas König、Andrew Fresh、Andy Dougherty、Ask Bjørn Hansen、Atsushi Sugawara、Bernhard M. Wiedemann、brian d foy、Bryan Stenson、Chad Granum、Chase Whitener、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Book、Daniel Dragan、Dan Kogai、Dave Cross、Dave Rolsky、David Cantrell、David Mitchell、Dominic Hargreaves、E. Choroba、Felipe Gasper、Florian Weimer、Graham Knop、Håkon Hægland、Hauke D、H.Merijn Brand、Hugo van der Sanden、Ichinose Shogo、James E Keenan、Jason McIntosh、Jerome Duval、Johan Vromans、John Lightsey、John Paul Adrian Glaubitz、Kang-min Liu、Karen Etheridge、Karl Williamson、Leon Timmermans、Manuel Mausz、Marc Green、Matthew Horsfall、Matt Turner、Max Maischein、Michael Haardt、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Paul Evans、Paul Johnson、Paul Marquess、Peter Eisentraut、Peter John Acklam、Peter Oliver、Petr Písař、Renee Baecker、Ricardo Signes、Richard Leach、Russ Allbery、Samuel Smith、Santtu Ojanperä、Sawyer X、Sergey Aleynikov、Sergiy Borodych、Shirakata Kentaro、Shlomi Fish、Sisyphus、Slaven Rezic、Smylers、Stefan Seifert、Steve Hay、Steve Peters、Svyatoslav、Thibault Duponchelle、Todd Rinaldo、Tomasz Konojacki、Tom Hukins、Tony Cook、Unicode Consortium、VanL、Vickenty Fesunov、Vitali Peil、Yves Orton、Zefram。
上述名單幾乎肯定不完整,因為它是根據版本控制歷史自動生成的。特別是,它不包括向Perl錯誤跟踪器報告問題的(非常感謝)貢獻者的名字。
此版本中包含的許多更改來自於Perl核心中包含的CPAN模塊。我們感謝整個CPAN社區幫助Perl蓬勃發展。
有關所有Perl歷史貢獻者的更完整列表,請參閱Perl源代碼分發中的AUTHORS文件。
如果您發現您認為是一個錯誤,您可以檢查Perl錯誤數據庫,網址為https://github.com/Perl/perl5/issues。您也可能在Perl首頁 http://www.perl.org/ 找到相關資訊。
如果您認為您有一個未報告的錯誤,請在https://github.com/Perl/perl5/issues上開啟一個問題。請確保將您的錯誤削減到一個微小但足夠的測試案例。
如果您要報告的錯誤具有安全性影響,使其不適合發送到公共問題跟蹤器,請參閱 perlsec 中的"安全漏洞聯絡資訊" 以獲取報告問題的詳細資訊。
如果您希望感謝 Perl 5 Porters 在 Perl 5 中所做的工作,您可以執行 perlthanks
程式來這麼做。
perlthanks
這將向 Perl 5 Porters 清單發送一封包含您的感謝之意的電子郵件。
變更文件以了解如何查看詳細的變更內容說明。
INSTALL 文件以了解如何建置 Perl。
README 文件以了解一般資訊。
Artistic 和 Copying 文件以獲取版權資訊。