目錄

名稱

perl5320delta - Perl v5.32.0 的新功能

描述

本文檔描述了 5.30.0 版本和 5.32.0 版本之間的差異。

如果您正在從 5.28.0 等較早版本升級,請先閱讀 perl5300delta,其中描述了 5.28.0 和 5.30.0 之間的差異。

核心增強

isa 運算子

一個名為 isa 的新實驗性中綴運算子,用於測試給定對象是否是給定類或從其衍生的類的實例

if( $obj isa Package::Name ) { ... }

詳細資訊請參閱 perlop 中的「Class Instance Operator」。

支援 Unicode 13.0

詳細資訊請參閱 https://www.unicode.org/versions/Unicode13.0.0/

鏈式比較功能

某些比較運算符,根據其結合性,與同一優先級的某些運算符進行鏈接(但絕不與不同優先級的運算符鏈接)。

if ( $x < $y <= $z ) {...}

行為與

if ( $x < $y && $y <= $z ) {...}

(假設 "$y" 與其外觀一樣簡單的純量一樣。)

您可以在 perlop 中的 「Operator Precedence and Associativity」 中瞭解更多資訊。

新的Unicode屬性Identifier_StatusIdentifier_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()mbtowcwctomb

POSIX::mblen()mbtowcwctomb函數現在可在位移狀態區域(shift state locales)上運行,在C99及以上編譯器上線程安全(thread-safe),當在具有區域線程安全性的平台上執行時,長度參數現在是可選的。

這些函數始終在當前的C語言區域(locale)下執行。 (參見:perllocale。)大多數區域是無狀態的,但有幾個,特別是幾乎不會遇到的ISO 2022,會在調用這些函數時保持狀態。以前在每次調用時清除狀態,但現在除非適當的參數是undef,否則不會重置狀態。

在線程化的Perl中,當可用時,將C99函數mbrlen(3)mbrtowc(3)wcrtomb(3)替換為普通函數。這使得這些函數在執行時在區域線程安全的平台上是線程安全的。

mblenmbtowc中的字符串長度參數現在是可選的;僅在您希望將源字符串中解析的長度限制為實際長度以下時才有用。

Alpha斷言不再是實驗性的

請參見:"(*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 上開發

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 上會發生此傾印。 (除了第二種情況,其他情況也會顯示其他信息。)

安全性

[CVE-2020-10543] 由精心製作的正則表達式引起的緩衝區溢出

嵌套正則表達式定量器的存儲空間計算中的有符號 size_t 整數溢出可能會導致 Perl 的正則表達式編譯器中的堆緩衝區溢出,從而用攻擊者提供的數據覆蓋在正則表達式存儲空間之後分配的內存。

目標系統需要足夠的內存來分配嵌套定量器的部分擴展,以防止發生溢出。 在 64 位系統上不太可能滿足此要求。

發現者:The Tarantula Team 的 ManhND、Vingroup 的 VinCSS 成員。

[CVE-2020-10878] 通過由精心製作的正則表達式產生的畸形字節碼引起的整數溢出

計算正則表達式引擎指令間偏移量時的整數溢位可能導致已編譯的正則表達式的中介語言狀態損壞。攻擊者可以利用此行為將指令插入 Perl 正則表達式的編譯形式中。

發現者:Hugo van der Sanden 和 Slaven Rezic。

[CVE-2020-12723] 由製作精心設計的正則表達式引起的緩衝區溢位

Perl 正則表達式編譯器通過遞歸調用 S_study_chunk() 優化正則表達式的中介語言表示,可能導致已編譯的正則表達式的中介語言狀態損壞。

發現者:Sergey Aleynikov。

附加說明

使用 Perl 編寫的應用程序只有在評估攻擊者提供的正則表達式時才會對上述任何缺陷產生漏洞。以這種方式評估正則表達式已知是危險的,因為正則表達式引擎在這種使用情況下不會防止拒絕服務攻擊。

不兼容的更改

某些模式匹配功能現在被禁止在編譯 Unicode 屬性值萬用字串子模式時使用

這些功能有些不適當,或者干擾執行此任務所使用的算法。完整列表見 "屬性值中的萬用字串" 在 perlunicode

未使用的函數 POSIX::mbstowcsPOSIX::wcstombs 已移除

這些函數因為缺陷的介面規範而永遠無法正常工作。顯然沒有人對它們有所需求,因為在這些函數聲稱可用的許多年裡,從未有人抱怨過,因此對它們的所謂 "支持" 現在已經被刪除。

(?[...]) 的一個錯誤修復可能導致某些模式不再編譯

"選定的錯誤修復"。先前使用的啟發式方法可能允許一些構造編譯(也許不是以程序員意圖的效果)的模式,而應該是錯誤的構造。雖然目前尚不清楚,但可能有一些錯誤的構造不再編譯。

\p{user-defined} 屬性現在始終優先於官方 Unicode 屬性

以前,只有在正則表達式模式的編譯之前聲明了用戶定義屬性時,才會使用其定義而不是任何具有相同名稱的官方 Unicode 屬性。現在,它總是優先於官方屬性。這一更改可能會破壞依賴(可能不知情地)先前行為的現有代碼。如果沒有這個修復,如果 Unicode 發布了一個新版本,其中包含與您長期使用的某個屬性相同名稱的新屬性,當您升級到使用該新 Unicode 版本的 perl 時,您的程序將會中斷。見

常數中不再允許修改變數

像這樣的程式碼

my $var;
$sub = sub () { $var };

在某些可修改的上下文中引用$var,現在在定義子程序時會產生例外情況。

可以通過在子程序定義中添加一個返回來避免此錯誤

$sub = sub () { return $var };

自 Perl 5.22 以來已經被棄用。 [GH #17020]

禁止在代碼點超過0xFF的字符串上使用vec

這些字符串在內部以 UTF-8 表示,而vec是一種位操作,對於這些字符串可能會產生意外的結果。這在 Perl 5.28.0 中已被棄用。

在字符串按位操作中使用代碼點超過0xFF

在先前的棄用週期之後,一些用法已經是非法的。剩餘的用法現在已被禁止,在 Perl 5.28.0 中已被棄用。參見perldeprecation

Sys::Hostname::hostname()不接受參數

這個用法在 Perl 5.28.0 中已被棄用,現在是致命的。

普通的 "0" 字符串現在被視為範圍運算符的數字

以前,範圍"0" .. "-1"會產生從"0"到"99"的數字字符串範圍;現在這將產生一個空列表,就像0 .. -1一樣。這也意味著"0" .. "9"現在會產生一個整數列表,以前會產生一個字符串列表。

這是由於一個特例,該特例將以"0"開頭的字符串視為字符串,因此像"00" .. "03"這樣的範圍會產生"00"、"01"、"02"、"03",但沒有特別處理字符串"0"[GH #16770]

\K 現在在向前和向後查詢斷言中已禁止使用

這是因為它導致意外行為,並且沒有人能夠定義所需的行為應該是什麼。[GH #14638]

性能增強

模組和 Pragmata

已更新的模組和 Pragmata

已移除模組和Pragmata

文件

現有文件的更改

我們已嘗試更新文件以反映本文列出的更改。如果您發現我們遺漏了任何內容,請在https://github.com/Perl/perl5/issues上開啟一個問題。

此外,已進行以下選定更改

perldebguts

perlapi

perldiag

perlfunc

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()部分已經顯著更新。

perlguts

perlhacktips

perlintro

perlipc

perlop

perlpod

perlport

perlreref

perlvar

perlapi, perlintern

perlxs

POSIX

此外,已進行以下選定更改

診斷

已對診斷輸出進行了以下新增或更改,包括警告和致命錯誤訊息。有關完整的診斷訊息列表,請參見 perldiag

新診斷

新錯誤

新警告

對現有診斷的更改

實用程式變更

perlbug

streamzip

配置和編譯

Configure

測試

添加了測試並對此版本中的其他添加和更改進行了修改。此外,進行了以下重大更改

平台支持

停用的平台

Windows CE

現在已移除在Windows CE上構建perl的支持。

特定平台的注意事項

Linux

如果ccclang,將使用cc填充plibpth。[GH #17043]

NetBSD 8.0

修正了在NetBSD 8.0上使用g++編譯Perl的問題。[GH #17381]

Windows
  • 現在ccflagsoptimize的配置是分開的,與POSIX平台相同。[GH #17156]

  • 已移除使用Visual C++ 6.0構建perl的支持。

  • 由於Windows的一個錯誤,區域測試可能會在Win32上崩潰,另外由於CRT如果區域名稱在當前代碼頁中無效編碼則會拋出異常。

    對於第二個問題,現在我們自己解碼區域名稱,並始終解碼為UTF-8。[GH #16922]

  • t/op/magic.t如果已經存在以FOO開頭的環境變量可能會失敗。

  • 修復了MYMALLOC(PERL_MALLOC)構建問題。

Solaris
  • 現在Configure將找到最新版本的Oracle Developer Studio編譯器,它們位於/opt/developerstudio*下。

  • Configure現在使用gethostby*函數的檢測類型,使Perl再次能夠在某些Solaris配置上編譯。

VMS
  • 隨著補丁包C99 V2.0的發布,VSI為許多先前缺失的C99功能提供了支持。在安裝了該補丁包的系統上,Perl的配置過程現在將檢測到stdint.h標頭以及以下函數的存在:fpclassifyisblankislessllrintllrintlllroundllroundlnearbyintroundscalbnscalbnl

  • 現在在VMS上,-Duse64bitint是默認的。

z/OS

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 平台上根本無法運行。

內部更改

選定的錯誤修復

訃告

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 文件以獲取版權資訊。