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 套件也會停用 indirect
和 multidimensional
功能。這些功能分別禁止使用「間接」方法呼叫(例如 $x = new Class;
)和使用清單表示式作為雜湊鍵來模擬稀疏多維陣列。這些變更的詳細資訊可以在 feature 中找到,但簡短的版本是:這有點像是啟用更多 use strict
,停用比其好處還多的功能。
此外,use v5.36
也會啟用警告,就像您寫了 use warnings
一樣。
最後,隨著此版本的推出,自 v5.10 中推出功能套件以來存在於每個功能套件中的實驗性質 switch
功能已從 v5.36 套件中移除。如果您想要使用它(儘管我們不建議這麼做),您必須明確啟用它。
新的命令列旗標 -g 已推出。它是 -0777 的簡化別名。
如需更多資訊,請參閱 perlrun 中的「-g」。
請參閱 https://www.unicode.org/versions/Unicode14.0.0/ 以取得詳細資訊。
在此版本之前,regex 集合功能(正式名稱為「延伸方括號字元類別」)被視為實驗性質。自 Perl 版本 5.18.0 推出並經過多次修改後,這項功能現被視為穩定的語言功能,使用時不再會顯示警告。請參閱 perlrecharclass 中的「延伸方括號字元類別」。
在此版本之前,任何形式的變動長度後向參照都被視為實驗性質。在此版本中,實驗性質已縮小為僅涵蓋包含擷取括號的後向參照。這是因為不清楚
"aaz"=~/(?=z)(?<=(a|aa))/
是否應配對並讓 $1 等於「a」或「aa」。目前它將配對最長的可能選項「aa」。雖然我們確信整體結構現在只會在應配對時配對,但我們不確定是否會保留目前的「最長配對」行為。
浮點例外狀況現在會立即傳遞,方式與其他類似「錯誤」的訊號(例如 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 中內建函數的摘要
此函數將其引數視為字串,傳回移除其開頭和結尾所有空白的結果。
此函數傳回一個比其引數清單大兩倍的清單,其中每個項目都加上其在該清單中的索引。這主要用於將新的 foreach
語法與多個反覆變數搭配使用,以反覆陣列或清單,同時追蹤每個項目的索引
use builtin 'indexed';
foreach my ($index, $val) (indexed @array) {
...
}
true
和 false
傳回布林值 true 和 false。Perl 仍然是 perl,且布林值沒有嚴格的類型,但這些值會被識別為布林值。is_bool
會告訴你某個值是否被識別為布林值。
這些函數分別會:弱化參考;強化參考;傳回參考是否弱化。(弱化參考不會計入垃圾回收。請參閱 perlref。)這些函數可以取代 Scalar::Util 中的一些類似常式。
這些函數提供更多關於參考(或實際上是非參考!)的資料,可以取代 Scalar::Util 中的類似常式。
ceil
傳回大於或等於其引數的最小整數。floor
傳回小於或等於其引數的最大整數。這些函數可以取代 POSIX 中的類似常式。
defer
區塊 (實驗性)此版本新增對 defer
區塊的支援,這些區塊是使用 defer
修飾詞為字首的程式碼區塊。它們提供一個在範圍結束時執行的程式碼區段。
簡而言之,當在執行階段到達 defer
區塊時,其主體會被設定為在結束封閉範圍時執行。它與 UNITCHECK 不同(原因之一是),如果包含 defer
區塊的區塊在到達區塊之前就結束,則不會執行該區塊。
defer
區塊可用於取代「範圍防護」物件,其中會將一個程式碼區塊傳遞給物件,讓其由解構函式執行。
如需更多資訊,請參閱 perlsyn 中的「defer 區塊」。
finally
區塊 (實驗性)實驗性的 try
/catch
語法已擴充,以支援由 finally
關鍵字引用的第三個選用區塊。
try {
attempt();
print "Success\n";
}
catch ($e) {
print "Failure\n";
}
finally {
print "This happens regardless\n";
}
這會提供在 try
/catch
建構結束時執行的程式碼,即使被例外或控制流程關鍵字中斷也是如此。它們類似於 defer
區塊。
如需更多資訊,請參閱 perlsyn 中的「嘗試捕捉例外處理」。
Perl 傳統上只允許四對字串/樣式分隔符號:( )
{ }
[ ]
和 < >
,全部在 ASCII 範圍內。Unicode 有數百種可能性,使用此功能可啟用許多可能性。啟用後,您可以說 qr« »
,例如,或 use utf8; q𝄃string𝄂
。請參閱 "功能中的「extra_paired_delimiters」功能" 以取得詳細資訊。
即使子程式簽名現在穩定,使用具有簽名的子程式的舊式引數陣列 (@_
) 仍然 是實驗性的,有其自己的警告類別。將 experimental::signatures
警告類別設為靜音不足以消除此警告。新的警告會以類別名稱 experimental::args_array_with_signatures
發出。
任何具有簽名且嘗試使用預設引數陣列或其元素 (@_
或 $_[INDEX]
) 的子程式,無論是明確或隱含 (例如沒有引數的 shift
或 pop
) 都會在編譯時引發警告
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 或後續版本。
我們現在探測編譯器對 C11 執行緒局部儲存的支援,並在可用的地方將其用於執行緒化 Perl 建置的 XS 擴充套件的「隱式內容」。這需要比 POSIX 執行緒特定儲存更少的 C 層級函式呼叫。如果 C11 方法不可用,我們將繼續使用 pthreads 方法。
使用預設值執行Configure會建置一個未執行緒化的 Perl(速度稍快),但大多數作業系統會提供執行緒化的 Perl。
現在可以設定 Perl 不再從共用字串表中為大型雜湊分配鍵。
所有下列項目都使用相同的內部資料類型(PVHV
)
符號表
物件(預設)
關聯式陣列
共用字串表最初是為了改善用作物件的受祝福雜湊的效能而新增的,因為每個物件實例都有相同的鍵,因此在它們之間共用記憶體是一種最佳化。對於符號表來說也合理,其中衍生類別將具有相同的鍵(通常是方法名稱),並且為方法呼叫建置的 OP 樹也可以共用記憶體。共用字串表大致上就像雜湊鍵的快取。
但是對於實際用作關聯式陣列的雜湊(將鍵對應到值),通常鍵不會在其他雜湊中重複使用。例如,「已見過」雜湊的鍵是物件 ID(或位址),而且在邏輯上這些鍵不會在其他雜湊中重複。
將這些「僅使用一次」的鍵儲存在共用字串表中會增加 CPU 和 RAM 使用量,但沒有好處。對於此類鍵,共用字串表會表現得像命中率為 0% 的快取。將所有鍵儲存在那裡會增加共用字串表的總大小,並隨著其成長而增加其調整大小的次數。更糟的是 - 在任何對子處理程序(例如預先分岔伺服器)具有「寫入時複製」記憶體的環境中,共用字串表使用的記憶體頁面需要在子處理程序處理雜湊時快速複製。因此,如果共用字串表的大部分都是鍵只用於一個地方,則在 perl 解譯器中重複使用沒有好處,但由於作業系統需要複製更多頁面,因此成本很高。
現在可將 perl 詮譯器設定為停用「大型」雜湊的共用雜湊金鑰(既不是物件也不是符號表)。若要執行此動作,請將 -Accflags='-DPERL_USE_UNSHARED_KEYS_IN_LARGE_HASHES'
新增至您的 設定 選項。「大型」是一種啟發式方法,目前啟發式方法為,當新增金鑰至雜湊會觸發更多儲存空間配置,且雜湊有超過 42 個金鑰時,會停用共用。
這可能會導致建立包含多個共用相同金鑰的大型雜湊(未祝福)資料結構的程式記憶體使用量略微增加。但我們的測試通常顯示,對於所描述的特定案例而言,這是一個勝利,且其他程式碼不受影響。
在某些情況下,建立新的純量現在明顯更快。
例如,以下程式碼現在執行速度快約 30%
$str = "A" x 64;
for (0..1_000_000) {
@svs = split //, $str
}
(您可以在 [perl #19414] 中閱讀更多相關資訊。)
Archive::Tar 已從版本 2.38 升級至 2.40。
Attribute::Handlers 已從版本 1.01 升級至 1.02。
attributes 已從版本 0.33 升級至 0.34。
B 已從版本 1.82 升級至 1.83。
B::Concise 已從版本 1.004 升級至 1.006。
B::Deparse 已從版本 1.56 升級至 1.64。
bignum 已從版本 0.51 升級至 0.65。
charnames 已從版本 1.48 升級至 1.50。
Compress::Raw::Bzip2 已從版本 2.101 升級至 2.103。
Compress::Raw::Zlib 已從版本 2.101 升級至 2.105。
CPAN 已從版本 2.28 升級至 2.33。
Data::Dumper 已從版本 2.179 升級至 2.184。
DB_File 已從版本 1.855 升級至 1.857。
Devel::Peek 已從版本 1.30 升級至 1.32。
Devel::PPPort 已從版本 3.62 升級至 3.68。
diagnostics 已從版本 1.37 升級到 1.39。
Digest 已從版本 1.19 升級到 1.20。
DynaLoader 已從版本 1.50 升級到 1.52。
Encode 已從版本 3.08 升級到 3.17。
Errno 已從版本 1.33 升級到 1.36。
experimental 已從版本 0.024 升級到 0.028。
Exporter 已從版本 5.76 升級到 5.77。
ExtUtils::MakeMaker 已從版本 7.62 升級到 7.64。
ExtUtils::Miniperl 已從版本 1.10 升級到 1.11。
ExtUtils::ParseXS 已從版本 3.43 升級到 3.45。
ExtUtils::Typemaps 已從版本 3.43 升級到 3.45。
Fcntl 已從版本 1.14 升級到 1.15。
feature 已從版本 1.64 升級到 1.72。
File::Compare 已從版本 1.1006 升級到 1.1007。
File::Copy 已從版本 2.35 升級到 2.39。
File::Fetch 已從版本 1.00 升級到 1.04。
File::Find 已從版本 1.39 升級到 1.40。
File::Glob 已從版本 1.33 升級到 1.37。
File::Spec 已從版本 3.80 升級到 3.84。
File::stat 已從版本 1.09 升級到 1.12。
FindBin 已從版本 1.52 升級到 1.53。
GDBM_File 已從版本 1.19 升級到 1.23。
Hash::Util 已從版本 0.25 升級到 0.28。
Hash::Util::FieldHash 已從版本 1.21 升級到 1.26。
HTTP::Tiny 已從版本 0.076 升級到 0.080。
I18N::Langinfo 已從版本 0.19 升級到 0.21。
if 已從版本 0.0609 升級到 0.0610。
IO 已從版本 1.46 升級到 1.50。
IO-Compress 已從版本 2.102 升級到 2.106。
IPC::Open3 已從版本 1.21 升級到 1.22。
JSON::PP 已從版本 4.06 升級到 4.07。
libnet 已從版本 3.13 升級到 3.14。
Locale::Maketext 已從版本 1.29 升級到 1.31。
Math::BigInt 已從版本 1.999818 升級到 1.999830。
Math::BigInt::FastCalc 已從版本 0.5009 升級到 0.5012。
Math::BigRat 已從版本 0.2614 升級到 0.2621。
Module::CoreList 已從版本 5.20210520 升級到 5.20220520。
mro 已從版本 1.25_001 升級到 1.26。
NEXT 已從版本 0.68 升級到 0.69。
Opcode 已從版本 1.50 升級到 1.57。
open 已從版本 1.12 升級到 1.13。
overload 已從版本 1.33 升級到 1.35。
perlfaq 已從版本 5.20210411 升級到 5.20210520。
PerlIO 已從版本 1.11 升級到 1.12。
Pod::Functions 已從版本 1.13 升級到 1.14。
Pod::Html 已從版本 1.27 升級到 1.33。
Pod::Simple 已從版本 3.42 升級到 3.43。
POSIX 已從版本 1.97 升級到 2.03。
re 已從版本 0.41 升級到 0.43。
Scalar::Util 已從版本 1.55 升級到 1.62。
sigtrap 已從版本 1.09 升級到 1.10。
Socket 已從版本 2.031 升級到 2.033。
sort 已從版本 2.04 升級到 2.05。
Storable 已從版本 3.23 升級到 3.26。
Sys::Hostname 已從版本 1.23 升級到 1.24。
Test::Harness 已從版本 3.43 升級到 3.44。
Test::Simple 已從版本 1.302183 升級到 1.302190。
Text::ParseWords 已從版本 3.30 升級到 3.31。
Text::Tabs 已從版本 2013.0523 升級到 2021.0814。
Text::Wrap 已從 2013.0523 版升級至 2021.0814 版。
threads 已從 2.26 版升級至 2.27 版。
threads::shared 已從 1.62 版升級至 1.64 版。
Tie::Handle 已從 4.2 版升級至 4.3 版。
Tie::Hash 已從 1.05 版升級至 1.06 版。
Tie::Scalar 已從 1.05 版升級至 1.06 版。
Tie::SubstrHash 已從 1.00 版升級至 1.01 版。
Time::HiRes 已從 1.9767 版升級至 1.9770 版。
Unicode::Collate 已從 1.29 版升級至 1.31 版。
Unicode::Normalize 已從 1.28 版升級至 1.31 版。
Unicode::UCD 已從 0.75 版升級至 0.78 版。
UNIVERSAL 已從 1.13 版升級至 1.14 版。
version 已從 0.9928 版升級至 0.9929 版。
VMS::Filespec 已從 1.12 版升級至 1.13 版。
VMS::Stdio 已從 2.45 版升級至 2.46 版。
warnings 已從 1.51 版升級至 1.58 版。
Win32 已從 0.57 版升級至 0.59 版。
XS::APItest 已從 1.16 版升級至 1.22 版。
XS::Typemap 已從 0.18 版升級至 0.19 版。
XSLoader 已從 0.30 版升級至 0.31 版。
此文件提供在 Perl 核心團隊內管理選舉或投票的流程。
我們已嘗試更新文件以反映此文件所列的變更。如果您發現我們遺漏的任何變更,請在 https://github.com/Perl/perl5/issues 開啟問題。
此外,已進行以下選定的變更
已清理部分內容,且超過 80% 的(以前許多)未記錄函式現在已記錄或被視為不適當地標記為 API。
歡迎提供補丁程式!
記錄從 Pod::Html 移至 Pod::Html::Util 的函數的新位置,不再打算在核心之外使用。
記錄已移除 :win32
IO 偽層(發生在 5.35.2)。
已微調選舉流程,允許在候選人少於空缺席位時略過投票。
現在允許將特別選舉延期最多十二週,例如延期到正常選舉。
現在記錄呼叫方法時,呼叫者只需要是物件或類別名稱,不需要是子常式參考。
已更新以勸阻使用 /d 正規表示式修飾詞。
-? 現在是 -h 的同義詞
-g 現在是 -0777 的同義詞
已對診斷輸出(包括警告和致命錯誤訊息)進行以下新增或變更。如需完整診斷訊息清單,請參閱 perldiag。
(F) 已嘗試使用控制流程陳述式(例如 return
、goto
或迴圈控制)跳出遞延區塊的範圍。這是不允許的。
無法在 %s 中修改 %s(針對對 undef
的純量指派)
嘗試對 undef
執行純量指派,例如透過 undef = $foo;
,以前會觸發致命執行時間錯誤,訊息為「嘗試修改唯讀值」。在執行時間之前偵測到此類嘗試指派會更有幫助,因此它們現在是編譯時間錯誤,導致訊息「無法在純量指派中修改 undef 運算子」。
剖析器在嘗試剖析 foreach
迴圈時,發生內部一致性檢查失敗。
正在呼叫 builtin::
名稱空間中的函數,目前為實驗性質。
遞延
區塊修飾詞為實驗性質。如果您想使用此功能,請使用 no warnings 'experimental::defer'
停用警告,但請注意,這樣做會冒著您的程式碼在未來的 Perl 版本中可能中斷的風險。
此警告會在請求 v5.11 以下版本的 use VERSION
陳述式中發出(當 use strict
的效果會被停用),在先前宣告較大數字(會啟用這些效果)之後
如果您使用 for
一次反覆運算多個值,就會發出此警告。此語法目前為實驗性質,其行為可能會在未來的 Perl 版本中變更。
在使用簽名的子常式中,發現一個隱含包含 @_
參數陣列的表達式。
在使用簽名的子常式中,發現一個包含 @_
參數陣列的表達式。
嘗試將寬字元放入程式名稱($0
)中現在會引發此警告。
此警告過去不包含 in %s
。
區域化的子常式重新定義不再觸發此警告。
unexpected constant lvalue entersub entry via type/targ %d:%d" 現在有 panic 前綴
這使其與編譯子常式時其他內部一致性檢查一致。
在標量內容中無效使用 sort 現在在新的 scalar
類別中。
當 sort
在標量內容中使用時,會引發一個警告,表示這樣做沒有用。此警告過去在 void
類別中。現在已新增一個新的類別,稱為 scalar
,用於標量內容的警告。
移除多個診斷
許多多年來從 Perl 核心移除的診斷,現在也從文件中移除。
Perl C 原始碼現在使用一些 C99 功能,我們已驗證這些功能受到我們鎖定的所有編譯器支援。這表示 Perl 標頭現在包含一些在 C99 中合法但在 C89 中不合法的新程式碼。
如果使用 gcc 或 clang 編譯,這可能會為某些 XS 模組帶來問題,這些模組會無條件地將 -Werror=declaration-after-statement
加入其 C 編譯器旗標。早期版本的 Perl 支援已過時的編譯器,這些編譯器嚴格拒絕某些 C99 功能,特別是混合宣告和程式碼,因此 XS 模組作者審核其程式碼是否違反此規範是有意義的。然而,現在只能在這些早期版本的 Perl 上執行此操作,因此需要變更這些模組,僅為 $] < 5.035005
加入此旗標。
makedepend 步驟現在使用 make 並行執行
使用 MAKEFLAGS=-j8 時,這會大幅減少所需時間
sh ./makedepend MAKE=make cflags
Configure 現在會測試是否需要 #include <xlocale.h>
來使用 POSIX 1003 執行緒安全區域設定函式或某些相關延伸。這可以防止在函式庫更新中移除非公開的 xlocale.h 或 xlocale.h 不供公開使用時出現問題。(github #18936)
已新增和變更測試,以反映此版本的其他新增和變更。
已移除對舊版 MSVC++(VC12 之前版本)的支援
這些版本不支援 C99,因此無法再用來編譯 perl。
已新增對使用 Microsoft Visual Studio 2022(包含 Visual C++ 14.3)在 Windows 上編譯 perl 的支援。
已移除 :win32 IO 層。此 :unix 層的實驗性替換方案在近二十年的存在期間從未達到成熟階段。
keys %ENV
傳回一致的結果在 VMS 上,%ENV
hash 中的項目會在第一次存取時從作業系統環境載入,因此 %ENV
的第一次反覆運算需要掃描整個環境,以找出所有可能的鍵。此初始化始終正確地執行完整反覆運算,但之前並未發生在標量內容中的 %ENV
,這表示如果在任何其他 %ENV
存取之前呼叫 scalar %ENV
,它會傳回 0,或者如果沒有反覆運算,只會傳回已存取的鍵數。
這些錯誤現在已修正 - 標量內容中的 %ENV
和 keys %ENV
現在傳回正確的結果 - 環境中所有鍵的數量。
UWIN 是 Windows 的 UNIX 相容性層。它最後一次發布於 2012 年,現已由 Cygwin 取代。
DJGPP 是 GNU 工具鏈移植到執行 DOS 的 32 位元 x86 系統。最後已知的在上面建置 Perl 的嘗試是在 5.20,只建置到 miniperl。
已移除 Novell NetWare 的支援程式碼。NetWare 是 Novell 的伺服器作業系統。此移植最後更新於 2002 年 7 月,而平台本身最後更新於 2009 年 5 月。
不相關的變更意外中斷了 2009 年 9 月 NetWare 移植的建置,而 12 年來沒有人回報此問題。
此更新使我們能夠建置 EBCDIC 靜態/動態和 31 位元/64 位元位址模式 Perl。通過的測試數量與這些更新之前的基準一致。
這些變更還提供了基本支援,能夠提供 ASCII 靜態/動態和 31 位元/64 位元位址模式 Perl。
已更新 z/OS(以前稱為 OS/390)README,以描述 ASCII 和 EBCDIC 建置。
自 Perl 5.8 中移除 PERL_OBJECT 以來,PERL_IMPLICIT_CONTEXT 和 MULTIPLICITY 已成為同義詞,並且可以互換使用。為了簡化程式碼,所有 PERL_IMPLICIT_CONTEXT 的實例都已替換為 MULTIPLICITY。
PERL_IMPLICIT_CONTEXT 將保持定義,以與 XS 模組相容。
以前稱為 G_ARRAY
的 API 常數,表示清單內容,現在已重新命名為更準確的 G_LIST
。已新增相容性巨集 G_ARRAY
,以允許現有程式碼不受影響地運作。新的程式碼應改用新的常數。這由 Devel::PPPort
版本 3.63 支援。
已新增巨集到 perl.h 以利版本比較:PERL_GCC_VERSION_GE
、PERL_GCC_VERSION_GT
、PERL_GCC_VERSION_LE
和 PERL_GCC_VERSION_LT
。
已新增內嵌函式到 embed.h 以確定字元中最不顯著的 1 位元的位址:lsbit_pos32
和 lsbit_pos64
。
已刪除 Perl_ptr_table_clear
。自 v5.14.0(於 2011 年發布)以來,這已被標記為已棄用,且 CPAN 上沒有任何程式碼使用它。
新增新的布林巨集和函式。有關相關資訊,請參閱 "穩定布林追蹤",有關文件,請參閱 perlapi。
sv_setbool
sv_setbool_mg
SvIsBOOL
新增 4 個用於處理 RV 的遺失函式
sv_setrv_noinc
sv_setrv_noinc_mg
sv_setrv_inc
sv_setrv_inc_mg
xs_handshake()
的兩個失敗模式現在提供不同的訊息。
雜湊反覆運算器狀態的記憶體 (struct xpvhv_aux
) 現在配置為雜湊主體的一部分,而不是配置為為雜湊陣列配置的記憶體區塊的一部分。
新的 phase_name() 介面提供對每個解釋器階段 (即 PL_phase 值) 的名稱的存取。
U
的 pack
行為已針對 EBCDIC 變更。
已新增新的相等性測試函式 sv_numeq
和 sv_streq
,以及 ..._flags
字尾變體。這些公開一個簡單且一致的 API 來執行數值或字串比較,其中會感知運算子超載。
讀取整數值的字串形式不再設定旗標 SVf_POK
。字串形式仍會在內部快取,並且仍會由巨集 SvPV(sv)
等直接重新讀取 (內嵌,不會呼叫 C 函式)。已呼叫 API 來取得值的 XS 程式碼不會受到此變更影響。直接存取旗標而不是使用 API 呼叫來表達其意圖的 XS 程式碼可能會中斷,但如果傳遞其他值 (例如浮點值或具有字串超載的物件),此類程式碼可能已經有錯誤。
此小變更允許程式碼 (例如 JSON 序列化器) 可靠地判斷
最初寫入為整數,但接著讀取為字串的值
my $answer = 42;
print "The answer is $answer\n";
最初寫入為字串,但接著讀取為整數的同一個值
my $answer = "42";
print "That doesn't look right\n"
unless $answer == 6 * 9;
對於第一個案例 (最初寫入為整數),我們現在有
use Devel::Peek;
my $answer = 42;
Dump ($answer);
my $void = "$answer";
print STDERR "\n";
Dump($answer)
SV = IV(0x562538925778) at 0x562538925788
REFCNT = 1
FLAGS = (IOK,pIOK)
IV = 42
SV = PVIV(0x5625389263c0) at 0x562538925788
REFCNT = 1
FLAGS = (IOK,pIOK,pPOK)
IV = 42
PV = 0x562538919b50 "42"\0
CUR = 2
LEN = 10
對於第二個案例 (最初寫入為字串),我們現在有
use Devel::Peek;
my $answer = "42";
Dump ($answer);
my $void = $answer == 6 * 9;
print STDERR "\n";
Dump($answer)'
SV = PV(0x5586ffe9bfb0) at 0x5586ffec0788
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x5586ffee7fd0 "42"\0
CUR = 2
LEN = 10
COW_REFCNT = 1
SV = PVIV(0x5586ffec13c0) at 0x5586ffec0788
REFCNT = 1
FLAGS = (IOK,POK,IsCOW,pIOK,pPOK)
IV = 42
PV = 0x5586ffee7fd0 "42"\0
CUR = 2
LEN = 10
COW_REFCNT = 1
(無法依賴旗標 SVf_IsCOW
的存在或不存在來判斷對純量的操作記錄。)
先前兩個案例都無法區分,且所有 4 個旗標都設定
SV = PVIV(0x55d4d62edaf0) at 0x55d4d62f0930
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 42
PV = 0x55d4d62e1740 "42"\0
CUR = 2
LEN = 10
(且可能為 SVf_IsCOW
,但並非總是如此)
這現在表示,如果 XS 程式碼真的需要判斷值最初寫入的格式,它應該實作大致如下所示的邏輯
if (flags & SVf_IOK|SVf_NOK) && !(flags & SVf_POK)
serialize as number
else if (flags & SVf_POK)
serialize as string
else
the existing guesswork ...
請注意,這不涵蓋「雙重變數」- 在要求其字串形式或數字形式時回報不同值的純量 (例如 $!
)。大多數序列化格式無法表示此類重複性。
現有的猜測仍然存在,因為除了雙重變數之外,值可能是 undef
、參考、超載參考、類型全域變數和其他 Perl 本身可以表示但無法一對一對應到外部格式的事物,因此需要一些近似或封裝。
sv_dump
(和 Devel::Peek 的 Dump
函式)現在會將 PV 中的高位元組轉譯成十六進位,而非八進位。由於大多數人比較容易理解十六進位,這應該會讓這些轉譯更容易閱讀。這不會影響任何其他診斷介面,例如 pv_display
。
utime() 現在會在封閉的句柄上呼叫時正確設定 errno/$!
。
先前會在呼叫 setsockopt() 的 OPTVAL 參數的旗標檢查 magic,可能會將數字值視為封包的緩衝區,反之亦然。它也忽略 UTF-8 旗標,可能會將升級 SV 的內部表示視為提供給 setsockopt() 系統呼叫的位元組。(github #18660)
只設定 IOKp,而非 $) 和 $( 上的 IOK。這是問題 #18955:這將防止序列化器將這些變數序列化為數字(這會遺失額外的群組)。這會還原 5.16 的行為
自 v5.31.10 以來,使用 mktables
除錯工具會導致 perl 發生 croak;此問題現已修正。
makedepend
邏輯現在與 BSD make 相容(修正 GH #19046)。
現在在迭代中斷的繫結雜湊上呼叫 untie
會立即釋放迭代狀態。
迭代繫結雜湊會導致 perl 儲存目前的雜湊金鑰的副本以追蹤迭代狀態,而這個儲存的副本會作為 NEXTKEY
的第二個參數傳遞。當繫結雜湊迭代完成,或雜湊被銷毀時,這個內部狀態會立即釋放,但由於實作疏忽,如果雜湊被解除繫結,它不會被釋放。在這種情況下,金鑰的內部副本會持續到以下最早的時間點:
tie
再次在同一個雜湊上呼叫
(現在解除繫結的)雜湊被迭代(即傳遞給 keys
、values
或 each
中的任何一個)
雜湊被銷毀。
這個不一致性現在已修正 - 內部狀態現在會立即由 untie
釋放。
由於可以使用純 Perl 程式碼(`FIRSTKEY` 和 `NEXTKEY` 傳回的物件上 `DESTROY` 的時間)觀察到此行為的精確時間,因此有些程式碼可能會對此敏感。
在 perl 5.30.0 中新增的 `Internals::getcwd()` 函式現在僅在 miniperl 中可用。[github #19122]
在 BEGIN 或等效的 `use` 陳述式上設定中斷點可能會導致記憶體寫入已釋放的 `dbstate` op。[GH #19198]
當停用裸字檔案句柄時,解析器會將任何裸字解釋為檔案句柄,即使緊接在後面的是括號。
perl5300delta錯誤地識別了一個 CVE,其正確識別為 CVE-2015-1592。
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。
自述 檔案,說明一般事項。
藝術 和 複製 檔案,說明版權資訊。