perl5300delta - Perl v5.30.0 的新功能
本文件描述了 5.28.0 版本和 5.30.0 版本之間的差異。
如果您從較早版本(如 5.26.0)升級,請先閱讀 perl5280delta,該文件描述了 5.26.0 和 5.28.0 之間的差異。
sv_utf8_(downgrade|decode) 不再標記為實驗性功能。 [GH #16822]。
以後向斷言(如 (?<=foo?)
或 (?<!ba{1,9}r)
)之前會產生錯誤並拒絕編譯。 現在,它會編譯(如果最大後向查找最多為 255 個字符),但在新的 experimental::vlb
警告類別中引發警告。 這是為了提醒您,根據來自現場使用的反饋,行為可能會有所變化。
請參閱 perlre 中的 "(?<=pattern)" 和 perlre 中的 "(?<!pattern)"。
"{m,n}"
中可指定的上限 "n"
已增加到 65534未限定上限量詞 "{m,}"
的含義保持不變。 在大多數平台上,它匹配 2**31 - 1 次,而在 C 語言短變量長度超過 4 個字節的平台上,匹配次數更多。
由於Unicode發行週期的更改,Perl從Perl 5.28中的Unicode 10.0跳至Perl 5.30中的Unicode 12.1。
有關Unicode變更的詳細信息,請參閱https://www.unicode.org/versions/Unicode11.0.0/(11.0版本);https://www.unicode.org/versions/Unicode12.0.0/(12.0版本);以及https://www.unicode.org/versions/Unicode12.1.0/(12.1版本)。 (Unicode 12.1與12.0只有一個字符的增加,即新的日本時代名稱。)
與過去的Perl版本一樣,Word_Break屬性仍然被定制為更符合Perl用戶的期望。這意味著水平空白字符的連續運行不會被分開,而是保持為一個運行。 Unicode 11從過去的版本中更改為與Perl更符合,但它將幾個空格字符作為斷裂引起:TAB、NO BREAK SPACE和FIGURE SPACE(U+2007)。我們決定繼續使用對這些字符的以前的Perl定制。
您現在可以在正則表達式模式中執行以下操作
qr! \p{nv= /(?x) \A [0-5] \z / }!
它匹配數值介於0到5之間(包括0和5)的所有Unicode代碼點。因此,它可以匹配數值為0、1、2、3、4或5的泰語或孟加拉數字。
這標誌著實施Unicode Consortium建議的正則表達式功能的又一步。
大多數屬性都受支持,其餘部分計劃在5.32中支持。詳細信息請參見perlunicode中的“屬性值中的萬用字符”。
以前,在單引號正則表達式模式中(其評估從正常位置推遲),評估命名字符\N{...}
是一個錯誤。現在已經取消了這個限制。
突厥語言與其他語言的大小寫規則不同,對於字符 "i"
和 "I"
。 "i"
的大寫是LATIN CAPITAL LETTER I WITH DOT ABOVE(U+0130);而 "I"
的小寫是LATIN SMALL LETTER DOTLESS I(U+0131)。Unicode 提供了用於突厥語言的替代大小寫規則。以前,Perl 忽略了這些規則,但現在,在檢測到處於突厥 UTF-8 地區設置下運行時,它會使用這些規則。
以前,這些調用僅在 Perl 編譯為多線程時使用。要始終啟用它們,請添加
-Accflags='-DUSE_THREAD_SAFE_LOCALE'
到您的 Configure 標誌。
此宏仍被定義,但不再在核心中使用
-Drv
現在在 -DDEBUGGING
構建中有意義現在,將冗長標誌(-Dv
)添加到 -Dr
標誌將打開所有可能的正則表達式調試。
$[
是致命的自 Perl 5.12 起,設置 $[
為非零值已被廢棄,現在將引發致命錯誤。參見 "將非零賦值給 $[
是致命的" 在 perldeprecation 中。
參見 "在正則表達式中使用未分配的代碼點或非獨立字形元素作為分隔符。" 在 perldeprecation 中
"{"
使用現在是非法的為了避免不必要地破壞代碼,大多數發出廢棄警告的實例現在仍然是合法的,並且現在會發出非廢棄警告。參見 "正則表達式中的未轉義左大括號" 在 perldeprecation 中。
在一個:utf8
處理程序上呼叫sysread()、syswrite()、send()或recv(),無論是明確應用還是隱含應用,現在都會導致致命錯誤。這在perl 5.24中已被棄用。
在:utf8
處理程序上調用這些函數存在兩個問題
所有四個函數只關注:utf8
標誌。其他層完全被忽略,因此具有:encoding(UTF-16LE)
層的處理程序將被視為UTF-8。其他層,例如壓縮層,無論是否有:utf8
標誌,都將完全被忽略。
sysread()和recv()將從處理程序讀取,跳過任何層的驗證,並且不進行自己的驗證。這可能導致無效編碼的perl標量。
如my $x if 0
等聲明不再被允許。
這些特殊變量,長期被棄用,現在在使用時會拋出異常。
dump()函數,長期不建議使用,除非完全限定,即CORE::dump(),否則將不再被使用。
已移除長期棄用的File::Glob::glob()函數,現在會拋出一個異常,建議使用File::Glob::bsd_glob()代替。
pack()
不再能返回格式不正確的UTF-8如果它否則會返回包含格式不正確的UTF-8的UTF-8字符串,它將發出croak。這可以保護免受潛在的安全威脅。這也被認為是一個bug修復。 [GH #16035]。
在通用腳本中有幾組數字集。 [0-9]
是最熟悉的。但還有 [\x{FF10}-\x{FF19}]
(全角數字零至九),以及幾組用於數學表示法的集合,例如數學雙字形數字。這些集合中的任何一組都應該能夠出現在腳本運行中,例如希臘文。但 5.30 的設計忽略了除了 ASCII 數字 [0-9]
以外的所有內容,因此該設計存在缺陷。這已經修復,因此這既是一個錯誤修正,也是一個不相容性。 [GH #16704].
一個運行中的所有數字仍然必須來自同一組十個數字。
由於 JSON::XS 4.0 改變了其策略並默認啟用 allow_nonref,因此 JSON::PP 也默認啟用 allow_nonref。
此功能已計劃在 5.30 中變為致命,但由於一些 CPAN 模塊出現了問題,已延遲到 5.32。有關受影響內容的詳細信息,請參見 perldeprecation。
現在將 UTF-8 轉換為其表示的代碼點是通過有限確定自動機完成的,從而加快了速度。作為典型示例,ord("\x7fff")
現在需要的指令數比以前少了 12%。檢查一個字節序列是否有效的 UTF-8 的性能也同樣得到了提高,這是通過使用 DFA 實現的。
從 finalize_op() 中消除遞歸。[GH #11866]。
與正則表達式中的字符折疊和字符類相關的一些小優化。
IV
到 UV
轉換的優化。[GH #16761]。
將整數字符串化算法的速度提高,改為一次處理兩個數字而不是一個。 [GH #16769]。
基於 LGTM 分析和建議的改進。(https://lgtm.com/projects/g/Perl/perl5/alerts/?mode=tree)。 [GH #16765]。 [GH #16773]。
regcomp.c、regcomp.h、regexec.c 中的代碼優化。
類似 qr/[^a]/
的正則表達式模式匹配速度顯著提高,其中 a 是任何 ASCII 字符。其他類也可以獲得此加速,但涉及的字符的底層位模式複雜,因此在 ASCII 和 EBCDIC 平台之間有所不同,但所有大小寫對,如 qr/[Gg]/
都包括在內,以及 [^01]
。
Archive::Tar 已從版本 2.30 升級至 2.32。
B 已從版本 1.74 升級至 1.76。
B::Concise 已從版本 1.003 升級至 1.004。
B::Deparse 已從版本 1.48 升級至 1.49。
bignum 已從版本 0.49 升級至 0.51。
bytes 已從版本 1.06 升級至 1.07。
Carp 已從版本 1.38 升級至 1.50
Compress::Raw::Bzip2 已從版本 2.074 升級至 2.084。
Compress::Raw::Zlib 已從版本 2.076 升級至 2.084。
Config::Extensions 已從版本 0.02 升級至 0.03。
Config::Perl::V。已從版本 0.29 升級至 0.32。這是因為新增了一個影響二進位相容性的新配置變數:USE_THREAD_SAFE_LOCALE
。
CPAN 已從版本 2.20 升級至 2.22。
Data::Dumper 已從版本 2.170 升級至 2.174
Data::Dumper 現在在 croak
時避免洩漏。
DB_File 已從版本 1.840 升級至 1.843。
deprecate 已從版本 0.03 升級至 0.04。
Devel::Peek 已從版本 1.27 升級至 1.28。
Devel::PPPort 已從版本 3.40 升級至 3.52。
Digest::SHA 已從版本 6.01 升級至 6.02。
Encode 已從版本 2.97 升級至 3.01。
Errno 已從版本 1.29 升級至 1.30。
experimental 已從版本 0.019 升級至 0.020。
ExtUtils::CBuilder 已從版本 0.280230 升級至 0.280231。
ExtUtils::Manifest 已從版本 1.70 升級至 1.72。
ExtUtils::Miniperl 已從版本 1.08 升級至 1.09。
ExtUtils::ParseXS 已從版本 3.39 升級至 3.40。自動生成的函數原型不再錯誤地包含 OUTLIST
參數。[GH #16746]。
feature 已從版本 1.52 升級至 1.54。
File::Copy 已從版本 2.33 升級至 2.34。
File::Find 已從版本 1.34 升級到 1.36。
$File::Find::dont_use_nlink
現在在所有平台上默認為 1。[GH #16759]。
變數 $Is_Win32
和 $Is_VMS
正在初始化。
File::Glob 已從版本 1.31 升級到 1.32。
File::Path 已從版本 2.15 升級到 2.16。
File::Spec 已從版本 3.74 升級到 3.78。
在 Android 构建中,如果未定義 targetsh
,則消除 Cwd 警告。
File::Temp 已從版本 0.2304 升級到 0.2309。
Filter::Util::Call 已從版本 1.58 升級到 1.59。
GDBM_File 已從版本 1.17 升級到 1.18。
HTTP::Tiny 已從版本 0.070 升級到 0.076。
I18N::Langinfo 已從版本 0.17 升級到 0.18。
IO 已從版本 1.39 升級到 1.40。
IO-Compress 已從版本 2.074 升級到 2.084。
增加對 IO::Uncompress::Zstd
和 IO::Uncompress::UnLzip
的支持。
現在 BinModeIn
和 BinModeOut
選項已經無效。所有文件將以二進制模式讀取/寫入。
IPC::Cmd 已從版本 1.00 升級到 1.02。
JSON::PP 已從版本 2.97001 升級到 4.02。
JSON::PP 作為 JSON::XS 4.0 現在默認啟用 allow_nonref
。
lib 已從版本 0.64 升級到 0.65。
Locale::Codes 已從版本 3.56 升級到 3.57。
Math::BigInt 已從版本 1.999811 升級到 1.999816。
bnok()
現在完全支援 Kronenburg 擴展。[cpan #95628]。
Math::BigInt::FastCalc 已從版本 0.5006 升級到 0.5008。
Math::BigRat 已從版本 0.2613 升級到 0.2614。
Module::CoreList 已從版本 5.20180622 升級到 5.20190520。
B::Op_private 和 Config 的變更
Module::Load 已從版本 0.32 升級到 0.34。
Module::Metadata 已從版本 1.000033 升級到 1.000036。
在測試後妥善清理臨時目錄。
NDBM_File 已從版本 1.14 升級到 1.15。
Net::Ping 已從版本 2.62 升級到 2.71。
ODBM_File 已從版本 1.15 升級到 1.16。
PathTools 已從版本 3.74 升級到 3.78。
parent 已從版本 0.236 升級到 0.237。
perl5db.pl 已從版本 1.54 升級到 1.55。
調試多線程代碼不再在 DB::sub
或 DB::lsub
中出現死鎖。
perlfaq 已從版本 5.021011 升級到 5.20190126。
PerlIO::encoding 已從版本 0.26 升級到 0.27。
通過在 $PerlIO::encoding::fallback
中設置 WARN_ON_ERR
標誌啟用的警告現在只有在使用 use warnings "utf8";
或設置 $^W
時才產生。
PerlIO::scalar 已從版本 0.29 升級到 0.30。
podlators 已從版本 4.10 升級到 4.11。
POSIX 已從版本 1.84 升級到 1.88。
re 已從版本 0.36 升級到 0.37。
SDBM_File 已從版本 1.14 升級到 1.15。
sigtrap 已從版本 1.08 升級到 1.09。
Storable 已從版本 3.08 升級到 3.15。
Storable 不再在構建時探測遞迴限制。 [GH #16780] 等。
包含 Metasploit 開發的漏洞利用代碼用於測試 CVE-2015-1592 檢測,這導致至少一個防病毒套件的檢測。漏洞利用代碼已被移除並替換為簡單的功能測試。 [GH #16778]
Test::Simple 已從版本 1.302133 升級到 1.302162。
Thread::Queue 已從版本 3.12 升級到 3.13。
threads::shared 已從版本 1.58 升級到 1.60。
添加了對鎖定額外跟踪的支持,這需要使用 -DDEBUGGING
和額外的編譯標誌。
Time::HiRes 已從版本 1.9759 升級到 1.9760。
Time::Local已從版本1.25升級至1.28。
Time::Piece已從版本1.3204升級至1.33。
Unicode::Collate已從版本1.25升級至1.27。
Unicode::UCD已從版本0.70升級至0.72。
User::grent已從版本1.02升級至1.03。
utf8已從版本1.21升級至1.22。
vars已從版本1.04升級至1.05。
vars.pm
在檢查是否啟用嚴格變數時,不再禁用非變數嚴格。 [GH #15851]。
version已從版本0.9923升級至0.9924。
warnings已從版本1.42升級至1.44。
XS::APItest已從版本0.98升級至1.00。
XS::Typemap已從版本0.16升級至0.17。
以下模組將在未來的發行版中從核心發行版中刪除,屆時將需要從CPAN安裝它們。在CPAN上需要這些模組的發行版需要將它們列為前置條件。
這些模組的核心版本現在將發出"deprecated"
類別的警告,以通知您這一事實。要消除這些棄用警告,請從CPAN安裝相應的模組。
請注意,這些(除了極少數例外)都是優秀的模組,鼓勵您繼續使用。它們從核心中排除的主要原因主要是它們對啟動完全功能、支持CPAN的Perl安裝的必要性,通常不是對其設計的考慮。
B::Debug不再與核心發行版一起分發。您仍然可以在CPAN上找到它:B::Debug
。
Locale::Codes已經根據其作者的要求刪除。您仍然可以在CPAN上找到它:Locale::Codes
[GH #16660]。
我們已嘗試更新文件以反映此文件中列出的更改。如果您發現我們漏掉了任何內容,請發送電子郵件至 perlbug@perl.org。
AvFILL()
被錯誤地列為不推薦使用的項目。這已被更正。 [GH #16586]
我們不再有 null(空行)的 here 文標記終止符號,因此 perlop 不應再提及它們。
當分隔符號是撇號時,tr
的行為已被澄清。特別是,連字號不是特殊字符,而且 \x{}
不會被插值。 [GH #15853]
改善 lastparen、lastcloseparen 的文件。
在 perlfunc 中 "-X" 的項目 已被澄清,以表明對於大多數測試,將跟隨符號連結。
澄清了 reset EXPR
的行為。
試圖澄清 ref(qr/xx/)
返回 Regexp
而不是 REGEXP
的原因。及其原因。 [GH #16801].
澄清了 /(?(cond)yes)/ 的語法。
實際上有兩種稍微不同的 UTF-8 區域設置:一種用於土耳其語言,另一種用於其他所有語言。從 Perl v5.30 開始,Perl 可無縫處理這兩種類型。
為 ::xdigit:: 字元類別添加了一個注意事項。
段落模式的更具體文檔。 [GH #16787].
已對診斷輸出進行了以下新增或更改,包括警告和致命錯誤消息。有關診斷消息的完整列表,請參閱 perldiag。
如上所述在"不相容的更改"中,將不推薦使用的警告 "正則表達式中未轉義的左花括號在此已不推薦使用(在 Perl 5.30 中將會是致命的),在正則表達式中通過;標記為 <-- HERE 在 m/%s/" 已更改為非不推薦使用的警告 "正則表達式中未轉義的左花括號在正則表達式中通過;標記為 <-- HERE 在 m/%s/"。
指定 \o{}
而大括號之間沒有任何內容現在將產生致命錯誤訊息 "空的 \o{}"。之前是 "沒有數字的數字"。這意味著與類似構造(如 \p{}
)的錯誤使用相同的措辭。
在實驗性特性 use re 'strict'
的範圍內,指定 \x{}
而大括號之間沒有任何內容現在將產生致命錯誤訊息 "空的 \x{}"。之前是 "沒有數字的數字"。這意味著與類似構造(如 \p{}
)的錯誤使用相同的措辭。雖然在 re 'strict'
外部具有空的 \x
是合法的,但不明智;它將默默生成一個 NUL 字元。
對哈希或全局變數進行推送、彈出等操作現在將產生此訊息,而不是抱怨它們不再在標量上工作。 [GH #15774]。
現在報告此錯誤的檔案和行號。 [GH #16697]
在 -Dr
(或 use re 'Debug'
)下,顯示已編譯的正則表達式引擎程式。它以前會使用兩種不同拼寫的 無限,INFINITY
和 INFTY
。現在它僅使用後者,因為該拼寫存在最長時間。
生成的原型(使用 PROTOTYPES: ENABLE
)將包含 OUTLIST
參數,但這些不是 perl 函數的參數。這已經得到了更正。 [GH #16746]。
通常僅在線程化構建上使用線程安全的區域函數。現在可以在具有這些功能的系統上的非線程化構建中強制使用它們,方法是在 Configure 中包含 -Accflags='-DUSE_THREAD_SAFE_LOCALE'
選項。
提高 memrchr、strlcat 和 strlcpy 的檢測
改進 memmem() 的配置檢測。[GH #16807]。
針對 -DPERL_GLOBAL_STRUCT 建構選項進行多項改進和修復。
修復 -DPERL_GLOBAL_STRUCT_PRIVATE 建構選項。
t/lib/croak/op [GH #15774]。
對於哈希/全局範圍的push
等操作提供單獨的錯誤處理。
t/op/svleak.t [GH #16749]。
在過載洩漏中添加對goto &sub
的測試。
將t/re/fold_grind.t拆分為多個測試文件。
修復由於並行測試期間出現的競爭條件而導致的不定期測試失敗問題。 [GH #16795]。
通過使用新的測試文件t/io/paragraph_mode.t徹底測試段落模式。 [GH #16787]。
t/io/eintr.t中的一些測試導致進程在16版以前的Darwin上掛起。這些測試會跳過那些版本的Darwin。
使用HP C-ANSI-C編譯時pack()
中的一個微妙問題已通過在pp_pack.c中禁用優化來修復。
Perl在Mac OS X上進行-Duseshrplib
建構時的建構和測試過程現在與Mac OS X系統完整性保護(SIP)兼容。
SIP防止在/bin(和其他幾個地方)的二進制文件中傳遞DYLD_LIBRARY_PATH
環境變量。就我們的目的而言,這阻止了DYLD_LIBRARY_PATH
被傳遞到shell,從而防止該變量被傳遞到測試或建構過程中,因此運行perl
找不到libperl.dylib。
為了解決這個問題,初始的perl
可執行文件的建構期望在建構目錄中找到libperl.dylib,然後在安裝期間調整庫路徑以指向已安裝的庫。
重新添加了對Minix3的部分支持。
Cygwin不會使cuserid
可見。
C99數學函數現在可用。
在 win32/Makefile(对于 nmake)和 win32/makefile.mk(对于 dmake)中长期可用的 USE_CPLUSPLUS
构建选项,现在也可在 win32/GNUmakefile(对于 gmake)中使用。
nmake 的 makefile 不再默认为 Visual C++ 6.0(一种很旧的版本,不太可能被广泛使用)。因此,现在需要指定 CCTYPE
,因为没有明显的选择可以默认为哪个现代版本。未指定 CCTYPE
将导致输出错误并停止构建。
(dmake 和 gmake 的 makefile 将自动检测正在使用的编译器,因此不需要设置 CCTYPE
。此功能尚未添加到 nmake 的 makefile。)
在启用警告的情况下,使用 USE_IMP_SYS
构建的 sleep()
不再警告睡眠超时时间过长。 [GH #16631]。
支持使用 Microsoft Visual Studio 2019(包含 Visual C++ 14.2)在 Windows 上编译 perl 已添加。
如果协议、地址族和套接字类型的组合未找到,socket()
现在会设置 $!
。[GH #16849]。
在 Perl 5.27.9 中,意外地破坏了 Windows Server 2003 SP1 平台 SDK 构建,其中包含早期的 x64 编译器和工具。现在已修复。
从正则表达式编译器中消除了大小调整过程。在某些情况下,可能需要额外的传递来计算括号捕获组的数量。
现在可以使用与 libc strtod() 相同签名的新函数 "my_strtod
" in perlapi 或其同义词 Strtod()。它在所有平台上提供了与 strtod() 等效的行为,使用最佳可用精度,具体取决于平台功能和 Configure 选项,同时处理与区域设置相关的问题,例如小数点应该是点还是逗号。
添加了 newSVsv_nomg()
以在源上不处理 get 魔法的情况下复制 SV。[GH #16461]。
现在禁止 malloc 超过 PTRDIFF_T_MAX
字节。许多代码(包括 C 优化器)假定所有数据结构都不会比此大,因此这在溢出发生之前捕获此类尝试。
引入了两个新的 regnode: EXACT_ONLY8
和 EXACTFU_ONLY8
。它们等效于 EXACT
和 EXACTFU
,只是它们包含一个需要使用 UTF-8 表示/匹配的代码点。因此,如果目标字符串不是 UTF-8,则我们知道它不可能匹配,而无需尝试。
print_bytes_for_locale()
現在在DEBUGGING
下定義,之前只有在平台上定義了LC_COLLATE
時才定義。
在-DPERL_MEM_LOG
和-DNO_LOCALE
下的編譯已經修復。
當Perl 5.28引入index()
優化以與-1進行比較(或間接地,例如& gt;= 0)時,如果此優化在when
子句中觸發,將導致警告(“參數%s在智能匹配中不是數字”)。現在已經修復了這個問題。[GH #16626]
新的就地編輯代碼不再洩漏目錄處理程序。[GH #16602]。
從重載值進行常量折疊操作產生的警告不再產生虛假的“使用未初始化的值”警告。[GH #16349]。
修正了“mutator not seen in (lex = ...) .= ...”。[GH #16655]。
pack "u", "invalid uuencoding"
現在正確地將生成的零長度SV結尾設置為NUL。[GH #16343]。
改進了使用-Dm
調用calloc()的調試輸出。[GH #16653]。
在某些情況下,正則表達式腳本運行失敗以允許ASCII數字。 [GH #16704]。
在支持特定於平台的技術以確定$^X
的Unix-like系統上,Perl未能在特定於平台的技術失敗時退回到通用技術(例如,具有未掛載/proc的Linux系統)。這是Perl 5.28.0中的回歸。 [GH #16715]。
SDBM_File現在對損壞的數據庫文件更加堅固。這些改進不使SDBM文件適合作為一種交換格式。 [GH #16164]。
binmode($fh);
或binmode($fh, ':raw');
現在正確地從Win32的默認:crlf
I/O層中刪除:utf8
標誌。[GH #16730]。
實驗性的引用別名特性錯誤地將數組和哈希片段分配解釋為本地化,例如
\(@a[3,5,7]) = \(....);
被解釋為
local \(@a[3,5,7]) = \(....);
當EXPR
進行UTF-8升級時,eval EXPR
內的sort SUBNAME
如果SUBNAME
是非ASCII的,可能會出現當機。[GH #16979]。
正確處理realloc()在成功時修改errno
,以使修改對perl用戶不可見,因為realloc()是解釋器隱式調用的。此修改符合C標準,但僅在FreeBSD 13.0-CURRENT上觀察到。 [GH #16907]。
Perl現在將POSIX getcwd
公開為Internals::getcwd()
(如果可用)。這是為了在引導過程中由Cwd.pm
使用,並且可能會在不事先通知的情況下被刪除或更改。這修復了在構建perl的目錄中某些祖先目錄不可讀取時的一些引導問題。 [GH #16903]。
pack()
不再返回格式不正確的UTF-8。如果否則
當更新 $^R
時,正則表達式匹配不再留下陳舊的 UTF-8 長度魔法。這可能導致 length($^R)
返回不正確的值。
減少對 ops 的遞歸 [GH #11866]。
這可以防止處理極其深層 op 樹時的堆棧溢出。
避免多重連接的泄漏。 [GH #16823]。
用戶定義的 \p{}
屬性的處理(參見 "perlunicode中的用戶定義字符屬性")已被重寫為 C(而不是 Perl)。這加快了處理速度,但在此過程中進行了幾處不一致和錯誤修復。
一些錯誤消息有輕微的措辭變化。這主要是因為新的方式被集成到正則表達式錯誤處理機制中,該機制標記錯誤發生的輸入位置。這是以前無法實現的。現在,如果錯誤發生在嵌套調用的深處,消息中還包含額外的回溯信息。
用戶定義的屬性被實現為具有某些高度限制的命名慣例的 Perl 子例程。以前曾記錄過,如果未指定包,則子例程將位於當前包中。結果證明這並不對所有情況都成立,但現在是真的。
所有遞歸調用都被視為無限遞歸。以前它們會使解釋器恐慌。現在,它們會導致正則表達式模式無法編譯。
同樣,任何其他錯誤可能會導致恐慌;現在只會導致模式無法編譯。
舊的機制沒有檢測屬性定義中的非法範圍。現在,範圍的最大值不能小於範圍的最小值。否則,模式將無法編譯。
打算是在程序的生命周期內每個子例程只調用一次,這樣一個屬性的定義就是不可變的。這被放寬了,以便它可以為所有/i編譯調用一次,並且可能為非/i(子例程被傳遞一個指示的參數)第二次調用。然而,在實際應用中,有時會破壞這一點,多次調用是可能的。這些已被修復。現在(除了/i、非/i 情況外),子例程可以多次調用的唯一方式是如果它的某個組件尚未定義。例如,假設我們有一個在編譯時就已知其定義的子例程 IsA(),它又調用了在此時其定義未知的 isB()。每次編譯包含它的模式時,IsA() 將被調用一次。如果 IsA() 也調用了已知定義的 isC(),則 isC() 將只被調用一次。
當一個線程正在編譯與另一個線程同時編譯同一個屬性時,會出現一些競爭和非常長的掛起。這些問題現在已被修復。
修復了無法正確匹配的問題。
一個 EXACTFish regnode 具有一個有限的長度,可以容納要匹配的字符串。如果超出了該長度,則需要使用第二個節點來處理字符串的下一段,需要多少個 regnodes 就使用多少個。必須注意在哪裡斷開字符串,以正確處理 Unicode 中的多字符折疊。如果我們希望在可能位於多字符折疊中間的地方斷開字符串,則需要向後退一個(或多個)字符,留下一個較短的 EXACTFish regnode。這個向後退機制包含了一個 off-by-one 的錯誤。[GH #16806]。
現在,對於沒有先前文件處理器的裸 eof
調用將返回 true。[GH #16786]
無法編譯格式現在將中止編譯。與子解析中的其他錯誤一樣,這可能會使解析器處於奇怪的狀態,如果繼續編譯,可能會使 perl 崩潰。[GH #16169]
如果在全局銷毀期間仍在進行就地編輯,並且進程退出代碼(存儲在 $?
中)為零,perl 現在將把就地編輯視為成功,將輸入文件替換為生成的任何輸出。
這允許像以下這樣的代碼
perl -i -ne 'print "Foo"; last'
替換輸入文件,而像以下這樣的代碼
perl -i -ne 'print "Foo"; die'
將不會。部分解決了[GH #16748]。
5.28 中的一個回歸導致以下代碼失敗
close(STDIN); open(CHILD, "|wc -l")'
因為子進程的 stdin 將在執行 exec 後關閉。這現在已得到修復。
修復了一個問題,即編譯包含編譯時和運行時代碼塊的正則表達式可能導致嘗試編譯無效語法的問題。
修復了使用 -DNO_LOCALE_NUMERIC
和 -DNO_LOCALE_COLLATE
時的構建失敗。[GH #16771]。
防止跳過 ext/B/t/strict.t 中的測試。[GH #16783]。
/di
節點在結束或開始於 s 的情況下現在是 EXACTF
。我們不希望兩個 EXACTFU
在優化期間結合在一起,並形成 ss
、sS
、Ss
或 SS
序列;它們是唯一可能在 /ui
和 /di
下匹配不同的多字符序列。
Perl 5.30.0 自 Perl 5.28.0 以來大約經過了 11 個月的開發,包含大約 58 位作者在 1,300 個文件中進行了約 620,000 行的更改。
在排除自動生成的文件、文檔和發行工具後,對 750 個 .pm、.t、.c 和 .h 文件進行了約 510,000 行的更改。
Perl 因為一個充滿活力的使用者和開發者社群,在其第四個十年裡持續蓬勃發展。以下人員被知道為 Perl 5.30.0 的改進做出貢獻:
Aaron Crane、Abigail、Alberto Simões、Alexandr Savca、Andreas König、Andy Dougherty、Aristotle Pagaltzis、Brian Greenfield、Chad Granum、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Book、Dan Dedrick、Daniel Dragan、Dan Kogai、David Cantrell、David Mitchell、Dominic Hargreaves、E. Choroba、Ed J、Eugen Konkov、François Perrad、Graham Knop、Hauke D、H.Merijn Brand、Hugo van der Sanden、Jakub Wilk、James Clarke、James E Keenan、Jerry D. Hedden、Jim Cromie、John SJ Anderson、Karen Etheridge、Karl Williamson、Leon Timmermans、Matthias Bethke、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Petr Písař、Phil Pearl(Lobbes)、Richard Leach、Ryan Voots、Sawyer X、Shlomi Fish、Sisyphus、Slaven Rezic、Steve Hay、Sullivan Beck、Tina Müller、Tomasz Konojacki、Tom Wyant、Tony Cook、Unicode Consortium、Yves Orton、Zak B. Elep。
上述列表幾乎肯定是不完整的,因為它是從版本控制歷史自動生成的。特別是,它不包括大多數(非常感激)向 Perl Bug 追踪器報告問題的貢獻者的名字。值得注意的是,在此版本中,許多由於 Sergey Aleynikov 使用 AFL 進行模糊測試而發現的問題,而由他的高品質 perlbug 報告所可能的大量錯誤修正。
本版本中包含的許多變更源於 Perl 核心中包含的 CPAN 模組。我們感謝整個 CPAN 社群幫助 Perl 蓬勃發展。
要查看 Perl 的所有歷史貢獻者的更完整列表,請參閱 Perl 源分發中的 AUTHORS 文件。
如果您發現了您認為是一個錯誤,您可以檢查 perl 的 bug 數據庫,網址是 https://rt.perl.org/。您也可能在 Perl 官方網站 http://www.perl.org/ 上找到相關資訊。
如果您認為您發現了一個未報告的錯誤,請運行隨附於您的發行版中的 perlbug 程式。請確保將您的錯誤減少到一個足夠小但又足夠的測試案例。您的錯誤報告以及 perl -V
的輸出將被發送到 perlbug@perl.org 以供 Perl 移植團隊進行分析。
如果您報告的錯誤具有安全性影響,使其不適合發送到公開存檔的郵件列表,那麼請參閱 perlsec 中的“SECURITY VULNERABILITY CONTACT INFORMATION” 以了解如何報告問題的詳細信息。
如果您希望感謝 Perl 5 移植團隊在 Perl 5 中所做的工作,您可以運行 perlthanks
程式。
perlthanks
這將向 Perl 5 移植團隊列表發送一封感謝函。
Changes 文件以獲取有關如何查看詳細更改的解釋。
INSTALL 文件以了解如何構建 Perl。
README 文件以獲取一般資訊。
Artistic 和 Copying 文件以獲取版權信息。