內容

名稱

perl5360delta - perl v5.36.0 的新功能

說明

此文件說明 5.34.0 版本和 5.36.0 版本之間的差異。

核心增強功能

use v5.36

和以往一樣,use v5.36 會啟用該 Perl 版本的功能套件。

5.36 套件會啟用 signatures 功能。子常式簽章功能在 Perl 5.20.0 版本中推出,並在之後經過多次修改,現在不再被視為實驗性質。它現在被視為穩定的語言功能,不再印出警告。

use v5.36;

sub add ($x, $y) {
  return $x + $y;
}

儘管如此,簽章子常式的某些元素仍為實驗性質;請參閱下方。

5.36 套件會啟用 isa 功能。此運算子在 Perl 5.32.0 版本中推出,自此之後未再變更。此運算子現在被視為穩定的語言功能。如需更多詳細資訊,請參閱 perlop 中的「類別實例運算子」

5.36 套件也會停用 indirectmultidimensional 功能。這些功能分別禁止使用「間接」方法呼叫(例如 $x = new Class;)和使用清單表示式作為雜湊鍵來模擬稀疏多維陣列。這些變更的詳細資訊可以在 feature 中找到,但簡短的版本是:這有點像是啟用更多 use strict,停用比其好處還多的功能。

此外,use v5.36 也會啟用警告,就像您寫了 use warnings 一樣。

最後,隨著此版本的推出,自 v5.10 中推出功能套件以來存在於每個功能套件中的實驗性質 switch 功能已從 v5.36 套件中移除。如果您想要使用它(儘管我們不建議這麼做),您必須明確啟用它。

-g 命令列旗標

新的命令列旗標 -g 已推出。它是 -0777 的簡化別名。

如需更多資訊,請參閱 perlrun 中的「-g」

支援 Unicode 14.0

請參閱 https://www.unicode.org/versions/Unicode14.0.0/ 以取得詳細資訊。

regex 集合不再被視為實驗性質

在此版本之前,regex 集合功能(正式名稱為「延伸方括號字元類別」)被視為實驗性質。自 Perl 版本 5.18.0 推出並經過多次修改後,這項功能現被視為穩定的語言功能,使用時不再會顯示警告。請參閱 perlrecharclass 中的「延伸方括號字元類別」

變動長度後向參照大多不再被視為實驗性質

在此版本之前,任何形式的變動長度後向參照都被視為實驗性質。在此版本中,實驗性質已縮小為僅涵蓋包含擷取括號的後向參照。這是因為不清楚

"aaz"=~/(?=z)(?<=(a|aa))/

是否應配對並讓 $1 等於「a」或「aa」。目前它將配對最長的可能選項「aa」。雖然我們確信整體結構現在只會在應配對時配對,但我們不確定是否會保留目前的「最長配對」行為。

SIGFPE 不再遞延

浮點例外狀況現在會立即傳遞,方式與其他類似「錯誤」的訊號(例如 SIGSEGV)相同。這表示至少有機會使用 $SIG{FPE} 處理常式來擷取此類訊號,例如讓 die 可以回報觸發訊號的 perl 行數。

穩定的布林追蹤

「true」和「false」布林值(通常透過 !!0!!1 等結構存取,以及從許多核心函式和運算子傳回)現在會記住它們的布林性質,即使已指派給變數。builtin 中的新函式 is_bool() 可以檢查值是否有布林性質。

這在與其他語言或資料類型序列化互操作時很有用,以及其他地方。

一次迭代多個值(實驗性質)」

現在您可以透過在括號中指定詞彙清單,一次迭代多個值。例如,

for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

在 perl v5.36 之前,嘗試在 for my 後指定清單會產生語法錯誤。

此功能目前為實驗性質,會導致類別為 experimental::for_list 的警告。如需更多詳細資訊,請參閱 perlsyn 中的「複合陳述式」。另請參閱本文中的 "builtin::indexed",它是 n-at-a-time foreach 的實用搭配。

內建函數 (實驗性)

新增核心模組 builtin,提供內建於直譯器的常駐函數文件。

say "Reference type of arrays is ", builtin::reftype([]);

它也提供詞彙匯入機制,提供這些函數的簡短名稱版本。

use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);

此內建函數機制及其提供的函數目前皆為實驗性。我們預期 builtin 本身將在不久的將來不再是實驗性,但其中的個別函數可能會持續穩定。其他函數將會隨著時間新增至 builtin

詳情請參閱 builtin,但以下為 v5.36 中內建函數的摘要

builtin::trim

此函數將其引數視為字串,傳回移除其開頭和結尾所有空白的結果。

builtin::indexed

此函數傳回一個比其引數清單大兩倍的清單,其中每個項目都加上其在該清單中的索引。這主要用於將新的 foreach 語法與多個反覆變數搭配使用,以反覆陣列或清單,同時追蹤每個項目的索引

use builtin 'indexed';

foreach my ($index, $val) (indexed @array) {
    ...
}
builtin::true, builtin::false, builtin::is_bool

truefalse 傳回布林值 true 和 false。Perl 仍然是 perl,且布林值沒有嚴格的類型,但這些值會被識別為布林值。is_bool 會告訴你某個值是否被識別為布林值。

builtin::weaken, builtin::unweaken, builtin::is_weak

這些函數分別會:弱化參考;強化參考;傳回參考是否弱化。(弱化參考不會計入垃圾回收。請參閱 perlref。)這些函數可以取代 Scalar::Util 中的一些類似常式。

builtin::blessed, builtin::refaddr, builtin::reftype

這些函數提供更多關於參考(或實際上是非參考!)的資料,可以取代 Scalar::Util 中的類似常式。

builtin::ceil, builtin::floor

ceil 傳回大於或等於其引數的最小整數。floor 傳回小於或等於其引數的最大整數。這些函數可以取代 POSIX 中的類似常式。

defer 區塊 (實驗性)

此版本新增對 defer 區塊的支援,這些區塊是使用 defer 修飾詞為字首的程式碼區塊。它們提供一個在範圍結束時執行的程式碼區段。

簡而言之,當在執行階段到達 defer 區塊時,其主體會被設定為在結束封閉範圍時執行。它與 UNITCHECK 不同(原因之一是),如果包含 defer 區塊的區塊在到達區塊之前就結束,則不會執行該區塊。

defer 區塊可用於取代「範圍防護」物件,其中會將一個程式碼區塊傳遞給物件,讓其由解構函式執行。

如需更多資訊,請參閱 perlsyn 中的「defer 區塊」

try/catch 現在可以有 finally 區塊 (實驗性)

實驗性的 try/catch 語法已擴充,以支援由 finally 關鍵字引用的第三個選用區塊。

try {
    attempt();
    print "Success\n";
}
catch ($e) {
    print "Failure\n";
}
finally {
    print "This happens regardless\n";
}

這會提供在 try/catch 建構結束時執行的程式碼,即使被例外或控制流程關鍵字中斷也是如此。它們類似於 defer 區塊。

如需更多資訊,請參閱 perlsyn 中的「嘗試捕捉例外處理」

類引號運算子的非 ASCII 分隔符 (實驗性)

Perl 傳統上只允許四對字串/樣式分隔符號:( ) { } [ ]< >,全部在 ASCII 範圍內。Unicode 有數百種可能性,使用此功能可啟用許多可能性。啟用後,您可以說 qr« »,例如,或 use utf8; q𝄃string𝄂。請參閱 "功能中的「extra_paired_delimiters」功能" 以取得詳細資訊。

@_ 現在在有簽名的子程式中是實驗性的

即使子程式簽名現在穩定,使用具有簽名的子程式的舊式引數陣列 (@_) 仍然 是實驗性的,有其自己的警告類別。將 experimental::signatures 警告類別設為靜音不足以消除此警告。新的警告會以類別名稱 experimental::args_array_with_signatures 發出。

任何具有簽名且嘗試使用預設引數陣列或其元素 (@_$_[INDEX]) 的子程式,無論是明確或隱含 (例如沒有引數的 shiftpop) 都會在編譯時引發警告

use v5.36;

sub f ($x, $y = 123) {
  say "The first argument is $_[0]";
}

Use of @_ in array element with signatured subroutine is experimental
at file.pl line 4.

嘗試這樣做的程式碼行為不再指定,並且可能會在未來版本中變更。

不相容變更

實體上空的排序現在是編譯時錯誤

@a = sort @empty; # unaffected
@a = sort;        # now a compile-time error
@a = sort ();     # also a compile-time error

一個空的排序過去是建立一個空清單的奇怪方式;現在它會在編譯時出錯。此變更旨在為 sort 可能的未來增強功能釋放一些語法空間。

不建議使用

use v5.11 之後使用 use VERSION (其中 VERSION 低於 v5.11) 已不建議使用

use v5.11 或更高版本的範圍內,其中 X 低於 v5.11 的 use vX 列現在會發出警告

Downgrading a use VERSION declaration to below v5.11 is deprecated

例如

use v5.14;
say "The say statement is permitted";
use v5.8;                               # This will print a warning
print "We must use print\n";

這是因為 Perl 團隊計畫在這種情況下變更行為。自 Perl v5.12 (和 v5.11 的部分) 以來,除非之前已停用,否則 strict 已啟用。換句話說

no strict;
use v5.12;  # will not enable strict, because "no strict" preceded it
$x = 1;     # permitted, despite no "my" declaration

未來,此行為將會被移除,而 use VERSION 將會永遠在 v5.12 及後續版本中啟用嚴格模式。

希望以這種方式混合版本的程式碼應該使用區塊語法的詞彙範圍來確保不同版本的區塊在詞彙上保持孤立。

{
    use v5.14;
    say "The say statement is permitted";
}

{
    use v5.8;                           # No warning is emitted
    print "We must use print\n";
}

當然,這可能是你永遠不需要做的事情!如果第一個區塊編譯成功,表示你正在使用 perl v5.14.0 或後續版本。

效能提升

模組與實用程式

已更新的模組與實用程式

文件

新文件

Porting/vote_admin_guide.pod

此文件提供在 Perl 核心團隊內管理選舉或投票的流程。

現有文件的變更

我們已嘗試更新文件以反映此文件所列的變更。如果您發現我們遺漏的任何變更,請在 https://github.com/Perl/perl5/issues 開啟問題。

此外,已進行以下選定的變更

perlapi

perldeprecation

perlexperiment

perlgov

perlop

perlre

perlrun

診斷

已對診斷輸出(包括警告和致命錯誤訊息)進行以下新增或變更。如需完整診斷訊息清單,請參閱 perldiag

新診斷

新錯誤

新警告

變更現有診斷

組態和編譯

測試

已新增和變更測試,以反映此版本的其他新增和變更。

平台支援

Windows

VMS

VMS 上的 keys %ENV 傳回一致的結果

在 VMS 上,%ENV hash 中的項目會在第一次存取時從作業系統環境載入,因此 %ENV 的第一次反覆運算需要掃描整個環境,以找出所有可能的鍵。此初始化始終正確地執行完整反覆運算,但之前並未發生在標量內容中的 %ENV,這表示如果在任何其他 %ENV 存取之前呼叫 scalar %ENV,它會傳回 0,或者如果沒有反覆運算,只會傳回已存取的鍵數。

這些錯誤現在已修正 - 標量內容中的 %ENVkeys %ENV 現在傳回正確的結果 - 環境中所有鍵的數量。

已停用平台

AT&T UWIN

UWIN 是 Windows 的 UNIX 相容性層。它最後一次發布於 2012 年,現已由 Cygwin 取代。

DOS/DJGPP

DJGPP 是 GNU 工具鏈移植到執行 DOS 的 32 位元 x86 系統。最後已知的在上面建置 Perl 的嘗試是在 5.20,只建置到 miniperl。

NetWare

已移除 Novell NetWare 的支援程式碼。NetWare 是 Novell 的伺服器作業系統。此移植最後更新於 2002 年 7 月,而平台本身最後更新於 2009 年 5 月。

不相關的變更意外中斷了 2009 年 9 月 NetWare 移植的建置,而 12 年來沒有人回報此問題。

特定平台注意事項

z/OS

此更新使我們能夠建置 EBCDIC 靜態/動態和 31 位元/64 位元位址模式 Perl。通過的測試數量與這些更新之前的基準一致。

這些變更還提供了基本支援,能夠提供 ASCII 靜態/動態和 31 位元/64 位元位址模式 Perl。

已更新 z/OS(以前稱為 OS/390)README,以描述 ASCII 和 EBCDIC 建置。

內部變更

已選取的錯誤修正

先前版本的勘誤表

訃聞

Raun "Spider" Boardman(CPAN 上的 SPIDB),在 1996 年至 2002 年間提交了至少 66 個 Perl 5 核心發行版,於 2021 年 5 月 24 日因 COVID 併發症去世。我們將懷念他。

David H. Adler(DHA)於 2021 年 11 月 16 日去世。1997 年,David 共同創立了第一個 Perl 使用者群組 NY.pm,並於 1998 年共同創立了 Perl Mongers,以協助在全球建立其他使用者群組。他經常參加北美和歐洲的 Perl 會議,並以在這些會議上組織「爛片之夜」慶祝活動而聞名。他也為 Perl 基金會的工作做出貢獻,包括管理白駱駝社區服務獎。我們將懷念他。

致謝

Perl 5.36.0 代表自 Perl 5.34.0 以來大約一年的開發時間,並包含來自 82 位作者的 2,000 個檔案中約 250,000 行的變更。

排除自動產生的檔案、文件和發行工具,大約有 190,000 行變更到 1,300 個 .pm、.t、.c 和 .h 檔案。

Perl 在第四個十年中持續蓬勃發展,這要歸功於一個充滿活力的使用者和開發人員社群。已知以下人員貢獻了成為 Perl 5.36.0 的改進

Alyssa Ross、Andrew Fresh、Aristotle Pagaltzis、Asher Mancinelli、Atsushi Sugawara、Ben Cornett、Bernd、Biswapriyo Nath、Brad Barden、Bram、Branislav Zahradník、brian d foy、Chad Granum、Chris 'BinGOs' Williams、Christian Walde (Mithaldu)、Christopher Yeleighton、Craig A. Berry、cuishuang、Curtis Poe、Dagfinn Ilmari Mannsåker、Dan Book、Daniel Laügt、Dan Jacobson、Dan Kogai、Dave Cross、Dave Lambley、David Cantrell、David Golden、David Marshall、David Mitchell、E. Choroba、Eugen Konkov、Felipe Gasper、François Perrad、Graham Knop、H.Merijn Brand、Hugo van der Sanden、Ilya Sashcheka、Ivan Panchenko、Jakub Wilk、James E Keenan、James Raspass、Karen Etheridge、Karl Williamson、Leam Hall、Leon Timmermans、Magnus Woldrich、Matthew Horsfall、Max Maischein、Michael G Schwern、Michiel Beijen、Mike Fulton、Neil Bowers、Nicholas Clark、Nicolas R、Niyas Sait、Olaf Alders、Paul Evans、Paul Marquess、Petar-Kaleychev、Pete Houston、Renee Baecker、Ricardo Signes、Richard Leach、Robert Rothenberg、Sawyer X、Scott Baker、Sergey Poznyakoff、Sergey Zhmylove、Sisyphus、Slaven Rezic、Steve Hay、Sven Kirmess、TAKAI Kousuke、Thibault Duponchelle、Todd Rinaldo、Tomasz Konojacki、Tomoyuki Sadahiro、Tony Cook、Unicode Consortium、Yves Orton、Михаил Козачков。

以上清單幾乎可以確定是不完整的,因為它是從版本控制記錄自動產生的。特別是,它不包含向 Perl 錯誤追蹤器回報問題的(非常感謝的)貢獻者的姓名。

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

如需 Perl 所有歷史貢獻者的更完整清單,請參閱 Perl 原始碼發行中的 AUTHORS 檔案。

回報錯誤

如果您發現您認為是錯誤的地方,您可以在 https://github.com/Perl/perl5/issues 檢查 perl 錯誤資料庫。在 Perl 首頁 http://www.perl.org/ 也可能會有資訊。

如果您認為您有一個未回報的錯誤,請在 https://github.com/Perl/perl5/issues 開啟一個問題。務必將您的錯誤簡化為一個微小但足夠的測試案例。

如果您回報的錯誤有安全性影響,不適合發送到公開問題追蹤器,請參閱 perlsec 中的「安全性漏洞連絡資訊」,了解如何回報問題的詳細資訊。

致謝

如果您希望感謝 Perl 5 Porters 我們在 Perl 5 中所做的工作,您可以透過執行 perlthanks 程式來這麼做

perlthanks

這會將一封電子郵件寄送至 Perl 5 Porters 清單,表達您的感謝。

另請參閱

變更 檔案,說明如何檢視變更的詳盡詳細資料。

安裝 檔案,說明如何建置 Perl。

自述 檔案,說明一般事項。

藝術複製 檔案,說明版權資訊。