內容

名稱

perl5260delta - Perl v5.26.0 的新特性

描述

本文件描述了 5.24.0 版本與 5.26.0 版本之間的差異。

注意

此版本包含三個具有廣泛影響的更新

核心增強

詞彙子例程不再是實驗性質

在v5.18中引入的lexical_subs功能不再發出警告。禁用先前該功能使用的experimental::lexical_subs警告類別的現有代碼將繼續運行。lexical_subs功能沒有影響;所有Perl代碼都可以使用詞彙子例程,而不管當前範圍內的功能聲明是什麼。

縮排的Here-documents

這新增了一個新的修飾符"~",告訴解析器它應該尋找/^\s*$DELIM\n/作為結束分隔符。

支援以下語法

<<~EOF;
<<~\EOF;
<<~'EOF';
<<~"EOF";
<<~`EOF`;
<<~ 'EOF';
<<~ "EOF";
<<~ `EOF`;

"~"修飾符將從每個here-doc中的每一行中刪除與分隔符之前相同的空格。

換行符將按原樣複製,而不包含適當開頭空格的行將導致perl錯誤。

例如

if (1) {
  print <<~EOF;
    Hello there
    EOF
}

不帶前置空格地打印"Hello there\n"。

新的正則表達式修飾符/xx

指定兩個"x"字符以修改正則表達式模式可以完成單個字符所做的一切,此外,括號字符類中的TAB和空格字符通常被忽略,可以添加以提高可讀性,如/[ ^ A-Z d-f p-x ]/xx。詳細信息請參閱perlre中的"/x和/xx"

@{^CAPTURE}%{^CAPTURE}%{^CAPTURE_ALL}

@{^CAPTURE}將最後一次匹配的捕獲緩衝區公開為數組。因此,$1等同於${^CAPTURE}[0]。這是一種更有效的等效於substr($matched_string,$-[0],$+[0]-$-[0])的代碼,而且你不必再跟蹤$matched_string。請注意,與其他正則表達式魔術變量一樣,此變量的內容是動態的;如果你希望將其存儲超出匹配生命週期,則必須將其複製到另一個數組中。

%{^CAPTURE}等同於%+(即,命名捕獲)。除了更自描述外,兩種形式之間沒有區別。

%{^CAPTURE_ALL}等同於%-(即,所有命名捕獲)。除了更自描述外,兩種形式之間沒有區別。

聲明對變量的引用

作為一個實驗性功能,Perl現在允許在my()state()our()local()之後使用引用運算符。此語法必須使用use feature 'declared_refs'啟用。這是一個實驗性功能,除非啟用了no warnings 'experimental::refaliasing',否則將默認發出警告。它主要用於賦值給引用。例如

use experimental 'refaliasing', 'declared_refs';
my \$a = \$b;

更多細節請參閱 perlref 中的「將參考指定給參考」

現在支援 Unicode 9.0

更改清單請參閱 http://www.unicode.org/versions/Unicode9.0.0/。核心 Perl 中附帶但由 p5p 不維護的模組不一定支援 Unicode 9.0。但Unicode::Normalize在 9.0 上可運作。

使用 \p{script} 使用了改良的 Script_Extensions 屬性

Unicode 6.0 引入了 Script(sc)屬性的改良形式,並將其稱為 Script_Extensions(scx)。Perl 現在在屬性僅指定為 \p{script} 時使用此改良版本。這應該使得程式在確定某個字元是否用於給定腳本時更準確,但對於非常明確需要舊行為的程式有輕微破壞性。複合形式的含義,如 \p{sc=script},保持不變。參閱 perlunicode 中的「腳本」

Perl 現在在支援的平台上可以在 UTF-8 語言環境中進行默認排序

某些平台在 UTF-8 語言環境中原生支援合理的排序和排序。Perl 現在與這些平台配合工作。為了可移植性和完全控制,仍建議使用 Unicode::Collate,但現在您可能不需要特別進行任何操作就可以獲得足夠好的結果,具體取決於您的應用。參閱 perllocale 中的「類別 LC_COLLATE:排序:文本比較和排序」

更好的語言環境排序,包含嵌入 NUL 字符的字符串

在具有多級字符權重的語言環境中,現在會忽略較高優先級的 NUL 字符。但是某些字符串仍然存在一些問題。參閱 perllocale 中的「包含嵌入 NUL 字符的字符串排序」

通過參考可調用的哈希和陣列函數的 CORE 子例程

CORE命名空間中,哈希和數組函數(keyseachvaluespushpopshiftunshiftsplice)現在可以使用符號語法(&CORE::keys(\%hash)和通過引用調用(my $k = \&CORE::keys; $k->(\%hash))。以前它們只能在內聯時使用。

64 位元建構的新哈希函數

我們已經切換到混合式哈希函數,以更好地平衡短鍵和長鍵的性能。

對於短鍵(16 個位元組及以下),我們使用了 One At A Time Hard 的優化變體,而對於更長的鍵,我們使用了 Siphash 1-3。對於非常長的鍵,這在性能上是一個很大的改進。對於較短的鍵,則有一個適度的改進。

安全性

@INC中移除當前目錄("."

perl 二進位檔包含一組預設路徑在@INC中。從歷史上看,它還包括了當前目錄(".")作為最後一個項目,除非啟用了污點模式(perl -T)。雖然方便,但這對安全性有影響:例如,當腳本嘗試在其當前目錄不受信任(如/tmp)時加載可選模塊時,它可能會從該目錄下加載並執行代碼。

從 v5.26 開始,"."將始終被預設移除,而不僅僅是在使用污點時。這對於安裝模塊和執行腳本有著重大的影響。

以下新功能已添加以幫助緩解這些問題。

這是一些腳本和模組作者可能需要在新的制度下使其軟件正常運作的事情。

PATH 中的逃脫冒號和相對路徑

在 Unix 系統上,Perl 在啟動新進程時將 PATH 環境變量中的任何相對路徑視為受污染的。以前,它允許反斜杠來逃脫冒號(與操作系統不同),因此如果 PATH 設置為類似 /\:. 的內容,則會將相對路徑視為安全的。該檢查已被修正為在該示例中將 "." 視為受污染。

PerlIO 調試輸出現在需要新的 -Di 開關

這用於調試 PerlIO 內的代碼,以避免遞歸調用。以前,如果 perl 沒有以 setuid 運行且尚未解析 -T-t 開關,則此輸出將被發送到由 PERLIO_DEBUG 環境變量指定的文件中。

如果 perl 在尚未解析其開關的地方執行輸出,這可能導致 perl 即使提供了 -T 開關,仍創建或覆蓋由 PERLIO_DEBUG 命名的文件。

現在,Perl 現在要求存在 -Di 開關,才會生成 PerlIO 調試輸出。默認情況下,此輸出寫入 stderr,但可以通過設置 PERLIO_DEBUG 環境變量可選地將其重定向到文件中。

如果 perl 正在以 setuid 運行或提供了 -T 開關,則將忽略 PERLIO_DEBUG,並將調試輸出發送到 stderr,就像對於任何其他 -D 開關一樣。

不相容變更

正則表達式模式中未轉義的字面 "{" 字符不再允許

您現在必須像 "\{""[{]" 這樣說明要匹配的左大括號,否則將出現致命的模式編譯錯誤。此更改將允許對語言進行未來擴展。

自 Perl v5.16 以來,這些已被棄用,在 v5.22 中對一些用法提出了棄用消息。不幸的是,為引發消息而添加的代碼存在錯誤,在某些情況下未能提出警告。因此,對於這些情況的禁止執行被延遲到 Perl 5.30,但與此同時已修復了代碼以對它們提出默認開啟的棄用消息。

在某些上下文中使用字面 "{" 的一些用法中,我們不預見其含義除了字面含義之外的任何其他含義,例如在模式中的第一個字符之後,或在 "|" 意味著替換時。因此,

qr/{fee|{fie/

匹配字符串 {fee{fie 中的任何一個。為了避免強制不必要的代碼更改,這些用法不需要轉義,並且不會對它們提出警告,目前也沒有更改計劃。

但是逃避 "{" 始終是正確的,要記住的簡單規則是始終這樣做。

參見 正則表達式中未轉義的左大括號在此處是非法的

scalar(%hash) 返回簽名已更改

對於scalar(%hash)返回的值將不再顯示有關哈希中分配的桶的信息。它將僅返回使用的鍵的計數。因此,它等效於0+keys(%hash)

通過Hash::Util::bucket_ratio()提供了向後兼容性的一種形式,它提供了與Perl 5.24及更早版本中提供的scalar(%hash)相同的行為。

keys從lvalue子例程返回

keys從lvalue子例程返回時,不再能夠在列表上下文中進行賦值。

sub foo : lvalue { keys(%INC) }
(foo) = 3; # death
sub bar : lvalue { keys(@_) }
(bar) = 3; # also an error

這使得lvalue子例程的情況與(keys %hash) = ...(keys @_) = ...一致,這也是錯誤的。 [GH #15339]

已刪除${^ENCODING}功能

與將值分配給此變量相關的特殊行為已被刪除。因此,不再支持encoding pragma的默認模式。如果您仍然需要在除UTF-8之外的編碼中編寫源代碼,請使用CPAN上的Filter::EncodingencodingFilter選項等源代碼過濾器。

已刪除POSIX::tmpnam()

基本上不安全的tmpnam()接口已於Perl 5.22中被棄用,現已被刪除。您可以使用例如File::Temp接口來替代它。

要求::Foo::Bar現在是非法的。

以前,require ::Foo::Bar將嘗試讀取/Foo/Bar.pm。現在,任何以雙冒號開頭的裸字要求都會中止。

字面控制字符變量名不再允許

變量名不再能夠包含字面控制字符,無論在什麼情況下都是如此。在ASCII平台上,這些以前是允許的單字符名稱,但自Perl 5.20以來已在那裡被棄用。這影響像$\cT這樣的東西,其中\cT是源代碼中的字面控制(例如NAKNEGATIVE ACKNOWLEDGE字符)。

NBSP\N{...}中已不再被允許

自Perl 5.22以來,字符的名稱不再可以包含不可斷行的空格。這已經被棄用。

棄用

不再獨立成字形的字符串定界符已被棄用

為了讓Perl最終允許字符串定界符為Unicode字形簇(看起來像單個字符,但可能是幾個字符的序列),我們必須停止允許不是字形獨立的單個字符定界符。這些在實際代碼中不太可能存在,因為它們通常會顯示為附加在它們前面的字符上。

\cX 對應到可打印字符的情況不再被棄用

這意味著我們沒有計劃刪除此功能。它仍然會引發警告,但僅在啟用語法警告時。該功能最初旨在表示沒有助記符的不可打印字符(\t\n是兩個不可打印字符的助記符,但大多數不可打印字符沒有助記符)。但是該功能也可用於指定一些可打印字符,儘管這些字符更清晰地表示為可打印字符本身。參見http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html

性能增強

模組和Pragma

更新的模組和Pragma

文件

新文件

perldeprecation

此文件記錄了所有即將被棄用的功能,以及已經被移除的一些被棄用功能。此文件的目的是雙重的:一方面記錄將要消失的功能及其版本,另一方面為處理在升級 Perl 後不再運作的代碼的人提供指南。

現有文檔的更改

我們已嘗試更新文檔以反映本文檔中列出的更改。如果您發現我們漏掉了任何內容,請發送電子郵件至 perlbug@perl.org

此外,所有對 Usenet 的引用已被刪除,並對以下選定的更改進行了修改

perlfunc

perlguts

perlhack

perlhacktips

perlinterp

perllocale

perlmod

perlmodlib

perlobj

perlootut

perlop

perlre

perlretut

perlunicode

perlvar

診斷

新診斷

新錯誤

新警告

現有診斷的變更

效用變更

c2phpstruct

Porting/pod_lib.pl

Porting/sync-with-cpan

perf/benchmarks

Porting/checkAUTHORS.pl

t/porting/regen.t

utils/h2xs.PL

perlbug

配置和編譯

測試

新增了測試並更改了這個版本中的其他新增和更改的反映。此外,進行了以下實質性的更改

  • 添加了一個新的測試腳本comp/parser_run.t,類似於comp/parser.t,但包括test.pl,因此可以使用runperl()等功能。

  • 測試區域使用了與 Perl 不相容的區域。

  • 測試套件中的一些部分試圖積極地測試正則表達式實現中的邊緣情況,已限制最多運行五分鐘。在速度較慢的系統上,否則可能需要幾個小時,並且對於我們對於測試代碼的正確性的理解幫助不大。

  • 一個新的內部設施允許分析 Perl 自己測試套件中單個測試所花費的時間;參見 Porting/harness-timer-report.pl

  • t/re/regexp_nonull.t 已添加,用於測試正則表達式引擎是否能處理字符串末尾沒有空字節的純量。

  • 已添加新的測試腳本,t/op/decl-refs.t,用於測試新功能 "聲明對變量的引用"

  • 已添加新的測試腳本,t/re/keep_tabs.t,包含 \t 字符不應展開為空格的測試。

  • 已添加新的測試腳本,t/re/anyof.t,用於測試括號字符類生成的 ANYOF 節點是否符合預期。

  • 現在更廣泛地測試與 Unicode 相關的 API 宏和函數。

  • 將一些運行時間較長的 API 測試文件拆分為多個測試文件,以便可以並行運行。

  • t/harness 現在會盡最大努力不運行位於 Perl 源代碼樹之外的測試。 [GH #14578]

  • 防止調試器測試 (lib/perl5db.t) 因 $ENV{PERLDB_OPTS} 的內容而失敗。 [GH #15782]

平台支持

新平台

NetBSD/VAX

Perl 現在可以在 VAX 機器上的 NetBSD 下編譯。然而,該平台無法實現與大多數現代系統相容的浮點無窮大和 NaN,這些系統實現了 IEEE-754 浮點標準。十六進制浮點數(0x...p[+-]n 文字,printf %a)也沒有實現。 make test 通過 98% 的測試。

  • 測試修復和小更新。

  • 考慮到對 infnan-0.0 支持的缺乏。

特定平台注意事項

達爾文
  • 不要將 -Dprefix=/usr 視為特殊:相反地,要求使用額外的選項 -Ddarwin_distribution 以產生相同的結果。

  • OS X El Capitan 不實現 clock_gettime()clock_getres() API;必要時模擬它們。

  • macOS 10.12 上已棄用 syscall(2)

EBCDIC

已更新多個測試以在 EBCDIC 平台上工作(或跳過)。

HP-UX

現在在 HP-UX 上跳過 Net::Ping 的 UDP 測試。

Hurd

已改善 Hurd 的提示,啟用 malloc wrap 並報告使用的 GNU libc(以前在報告時是空字符串)。

VAX

現在在 NetBSD 上支援 VAX 浮點格式。

VMS
  • 在 Unix shell 下運行時,PERL5LIBPERLLIB 環境項目的路徑分隔符現在是冒號(":")。在 DCL 下運行時不變(仍然是 "|")。

  • configure.com 現在識別 VSI 品牌的 C 編譯器,不再識別 "DEC" 品牌的 C 編譯器(因為這種情況已經有 15 年以上了)。

Windows
  • 已添加使用 Microsoft Visual Studio 2015(包含 Visual C++ 14.0)在 Windows 上編譯 perl 的支援。

    此版本的 VC++ 包括完全重寫的 C 運行時庫,其中的一些變更意味著對 perl #120091 和 perl #118059 中解決套接字 close() 錯誤的工作在當前狀態下與此版本的 VC++ 不可行。因此,我們基於使用 VS2015 以後版本進行構建的重要性,已有效地恢復了該錯誤修復。我們可能會在將來重新檢查此問題,以嘗試以與 VS2015 兼容的方式再次修復該錯誤。

    這些變更不影響使用 GCC 編譯或使用 VS2013 或更早版本的 Visual Studio 編譯,即,對於這些編譯器,錯誤修復保持不變。

    請注意,如果將使用 GCC 或 VS <= VS2013 編譯的 perl 與使用 VS2015 編譯的 XS 模塊混合使用,或者將使用 VS2015 編譯的 perl 與使用 GCC 或 VS <= VS2013 編譯的 XS 模塊混合使用,則可能會遇到兼容性問題。某些不兼容性可能是由於已經針對 VS2015 構建的 perl 恢復了錯誤修復,但也可能是由於 VS2015 中重寫的 CRT(例如,參見http://stackoverflow.com/questions/30412951 上的討論)。

  • 現在它會自動偵測 GCC 與 Visual C,並在 Win32 上設置 VC 版本號。

Linux

不再支援 Linux 的 a.out 可執行格式。Linux 已經使用 ELF 超過二十年。

OpenBSD 6

OpenBSD 6 仍然不支援使用 SA_SIGINFO 返回 pidgiduid。請確保考慮到這一點。

FreeBSD

t/uni/overload.t:在 FreeBSD 上跳過懸掛測試。

DragonFly BSD

DragonFly BSD 現在支援 setproctitle()[GH #15703]

Internal Changes

  • 新的 API 函數 sv_setpv_bufsize() 允許同時設置 SV 中的長度和分配的大小,在必要時增加緩衝區大小。

  • 新的 API 宏 SvPVCLEAR() 將其 SV 參數設置為空字符串,就像 Perl 空間中的 $x = '',但具有幾個優化。

  • 已向 API 中添加了幾個新的宏和函數,用於處理 Unicode 和 UTF-8 編碼的字符串,以及對現有函數功能的一些更改(詳細信息請參見 perlapi 中的 "Unicode 支持")。

  • Perl 現在默認啟用了 PERL_OP_PARENT 編譯器定義。要禁用它,請使用 PERL_NO_OP_PARENT 編譯器定義。此標誌會更改在 OP 結構中如何使用 op_sibling 字段,自從 Perl 5.22 以來可選使用。

    詳細了解此生成選項的內容,請參閱 "perl5220delta" 中的 "Internal Changes"

  • 新增了三個新的 op,OP_ARGELEMOP_ARGDEFELEMOP_ARGCHECK。這些主要用於實現子例程簽名的各個元素,以及任何所需的整體檢查。

  • OP_PUSHRE op 已經被刪除,並且 OP_SPLIT op 已從類別 LISTOP 更改為 PMOP

    以前,split 的第一個子節點是一個 pushre,它會將 split 的正則表達式附加到它上面。現在正則表達式直接附加到 split op 上,並且 pushre 已被刪除。

  • 新增了 op_class() API 函數。這與現有的 OP_CLASS() 宏相似,但可以更準確地確定 op 分配為哪個結構。例如,OP_CLASS() 可能返回 OA_BASEOP_OR_UNOP,表示此類型的 op 通常分配為 OPUNOP;而 op_class() 將返回適當的 OPclass_BASEOPOPclass_UNOP

  • 內部的所有部分現在都一致地將 sassign op 視為 BINOP;以前它在 regen/opcodes 中被列為 BASEOP,這意味著內部的幾個部分必須特殊處理才能容納它。這個怪異的原始動機是為了處理像 $x ||= 1 這樣的代碼;現在以更簡單的方式處理。

  • op_dump() 函數(由 perl -Dx 使用)的輸出格式已更改:它現在顯示一個“ASCII 藝術”樹狀結構,並顯示有關每個 op 的更多低級細節,如其地址和類別。

  • PADOFFSET 類型已從無符號更改為有符號,並且幾個與填充相關的變數,如 PL_padix,已從類型 I32 更改為類型 PADOFFSET

  • 正規表達式編譯和執行的 DEBUGGING 模式輸出已得到增強。

  • 已消除幾個不常見的 SV 標誌,有時與操作它們的宏一起消除: SVpbm_VALIDSVpbm_TAILSvTAIL_onSvTAIL_offSVrepl_EVALSvEVALED

  • 已消除 OP op_private 標誌: OPpRUNTIME。這在以前常常在 PMOP 操作中設置,但隨著時間的推移變得毫無意義。

已選取的錯誤修正

  • 在具有 libc 中存在錯誤的 strxfrm() 實現的機器上切換到某些區域設置時,Perl 不再發生崩潰。 [GH #13768]

  • $-{$name} 在每次訪問時如果正則表達式沒有命名捕獲,將會發生一次 AV 泄漏。如果使用 Tie::Hash::NamedCapture 綁定的哈希並且使用 all => 1,也是同樣的情況。 [GH #15882]

  • 嘗試將已棄用的變數 $# 用作間接對象方法調用中的對象可能導致堆使用後空釋或緩衝區溢出。 [GH #15599]

  • 在檢查間接對象方法調用時,某些罕見情況下解析器可能重新分配行緩衝區,但然後繼續使用指向舊緩衝區的指針。 [GH #15585]

  • 將 glob 作為 formline 的格式參數時會導致斷言失敗。 [GH #15862]

  • 類似於 $value1 =~ qr/.../ ~~ $value2 的代碼會將匹配轉換為 qr// 運算符,導致堆棧上留下多餘的元素以混淆周圍的表達式。 [GH #15859]

  • 自 v5.24 以來,在某些不常見的情況下,一個包含來自多個來源的代碼塊(例如,通過嵌入式 qr// 對象)的正則表達式可能會得到錯誤的當前填充並且崩潰或產生奇怪的結果。 [GH #15657]

  • 在模式中的代碼塊內偶爾 local() 沒有在模式匹配回溯時被取消。 [GH #15056]

  • 在某些情況下,使用 substr() 修改魔法變量可能會訪問已釋放的內存。 [GH #15871]

  • use utf8 下,現在將檢查整個源代碼是否為 UTF-8 格式,而不僅僅是以前的引用字符串。 [GH #14973]

  • 字符串上的範圍運算符 ".." 現在在 unicode_strings 功能的範圍內正確處理其參數。我們認為先前的行為非常出乎意料,因此我們相信沒有正確的程序可以使用它。

  • 在标量上下文中,split 操作符未确保为其返回值分配足够的空间。这可能会导致它在分配给栈的内存块的末尾之后立即写入单个指针。 [GH #15749]

  • 使用当前输出位置在恰当位置对齐的大代码点与 "W" 打包模板字符可能会导致在已分配缓冲区的末尾之后立即写入单个零字节。 [GH #15572]

  • 在格式参数列表中作为格式参数的格式图片参数,如果图片指定修改参数,则可能导致访问新释放的编译格式。 [GH #15566]

  • sort() 操作符的内置数值比较函数未处理大整数,这些整数不能被双精度数精确表示。现在使用了与实现 <=> 操作符相同的代码。 [GH #15768]

  • 修复了破坏了 Method::Signatures/(?{ ... <<EOF })/ 的问题。 [GH #15779]

  • 修复了 chopchomp 的断言失败,这可能会由 chop(@x =~ tr/1/1/) 触发。 [GH #15738].

  • 修复了在 /x 下模式中的注释跳过错误;它可能会提前停止跳过一个字节,这可能会在一个 UTF-8 字符的中间。 [GH #15790].

  • perldb 现在在非 Unix 系统上忽略 /dev/tty[GH #12244];

  • $x 未定义时,修复了 {}->$x 的断言失败。 [GH #15791].

  • 修复了在模式中前瞻字符串超出最小长度时可能触发的断言错误。 [GH #15796].

  • 对于一个放置不当的 "_",每个文字数字只警告一次。 [GH #9989].

  • tr/// 解析代码在 perse 错误后可能会查看未初始化的数据。 [GH #15624].

  • 在模式匹配中,对未匹配捕获的反向引用(\1)可能会读取字符串开始位置之前的数据。 [GH #15634].

  • use re 'strict' 应该警告如果使用一个范围(例如 /(?[ [ X-Y ] ])/)其起始和结束数字不来自同一组的 10。对于从 U+1D7E 开始的五个数学数字组,它没有执行该警告。

  • 一个包含相同名称的“前向”声明的子程序(例如sub c { sub c; })有时可能会崩溃或无限循环。 [GH #15557]

  • 修復了使用非錨定的 UTF-8 子字串對目標字串執行正則表達式時的崩潰,目標字串也使用了 UTF-8。

  • 以前,類似 #!perl -i u 的 shebang 行可能被錯誤地解釋為請求 -u 選項。這已經修正。

  • 在某些罕見情況下,當回溯過一個僅匹配一個項目的交替時,正則引擎以前會產生不正確的結果;這表現為捕獲緩衝區($1$2,等等)錯誤地包含來自未實際執行最終匹配的正則表達式執行路徑的數據。已經修復了這個問題。

  • 某些使用實驗性 regex_sets 功能的正則表達式可能觸發斷言失敗。這已經修正。

  • 對於引用構造函數(例如,\eval=time)的無效賦值有時可能會崩潰,而不僅僅是給出語法錯誤。這已經修正。

  • 如果在 evalbytes 之後出現裸字,解析器有時可能會崩潰。

  • 通過方法調用自動加載有時會錯誤地警告(“對非方法的繼承 AUTOLOAD 的使用”),如果在該物件所屬的包中存在存根。不再在這種情況下發出警告。

  • 在具有不存在元素的數組上使用 splice 可能會導致其他運算符崩潰。

  • 當模式包含固定的 utf8 子字串時,可能會發生緩衝區溢出。

  • 修復了 perl 語法分析器中兩個可能的使用後釋放的錯誤。

  • 修復了 s///l 中的一個崩潰,它認為自己處理的是 UTF-8,但實際上不是。

  • 修復了正則表達式解析器在句法不正確的模式上未正確設置語法錯誤的地方。

  • 運算子 &. (以及當它將其參數視為字串時的 "&" 運算子)在內部標記為 utf8 時未能附加尾隨的空字節。許多程式路徑(系統調用、正則表達式編譯)仍然期望字符串緩衝區的末尾恰好是一個空字節。這導致了斷言失敗。[GH #15606]

  • 在解析器中避免在創建語法上無效的 heredoc 的錯誤消息時發生堆使用後錯誤。[GH #15527]

  • 在 DEBUGGING 版本上以 -DC 選項運行時修復了一個段錯誤。[GH #15563]

  • 修復了子程序屬性中的解析器錯誤處理,對於沒有結束 '")"' 的 ':attr(foo'。

  • 修復了 perl 詞法分析器以正確處理引號字符串上的反斜線作為最後一個字符。這實際上修復了兩個錯誤,[GH #15546][GH #15582]

  • 在 API 函數 gv_fetchmethod_pvn_flags 中,重新設計了分隔符解析,以防止在具有無效 len 參數的情況下可能的字符串溢出。[GH #15598]

  • 在原地數組排序中存在問題:像 @a = sort { ... } @a 這樣的代碼,其中排序的源和目的地是同一個普通數組,被優化以減少複製。這種優化的兩個副作用是,排序例程看到的 @a 的內容部分排序;並且在排序期間訪問 @a 在某些情況下可能會使解釋器崩潰。這兩個問題都已經解決,並且排序函數看到 @a 的原始值。[GH #15387]

  • 非 ASCII 字符串分界符現在在未結束字符串的錯誤消息中正確報告。[GH #15469]

  • pack("p", ...) 在某些情況下錯誤地發出其警告("Attempt to pack pointer to temporary value"),但已被修復。

  • @DB::args 現在免於 "used once" 警告。警告僅在 -w 下出現,因為 warnings.pm 本身多次使用 @DB::args

  • 在雙引號字符串中使用內置數組或哈希片段,如果變量之前尚未提及,將不再發出警告("Possible unintended interpolation...")。這影響了像 qq|@DB::args|qq|@SIG{'CHLD', 'HUP'}| 這樣的代碼。(特殊變量 @-@+ 已經免於該警告。)

  • gethostent 和類似的函數現在在內部執行空值檢查,以避免與 torsocks 函式庫崩潰。這是 v5.22 的回歸。 [GH #15478]

  • defined *{'!'}defined *{'['}defined *{'-'} 現在如果該型別全局變量從未被訪問過,則不再洩漏記憶體。

  • 連續兩次提及相同的常量(這是語法錯誤)不再在調試版本中失敗於斷言。這是 v5.20 的回歸。 [GH #15017]

  • 許多與十六進制浮點數 printf "%a" 有關的問題已被修復。此外,“次常態”(以前稱為“非常態”)浮點數現在在純粹的 IEEE 754 浮點數(64 位或 128 位)和 x86 80 位“擴展精度”中都得到支援。請注意,次常態十六進制浮點數文字將對“指數下溢”發出警告。 [GH #15495] [GH #15503] [GH #15504] [GH #15505] [GH #15510] [GH #15512]

  • v5.24 中 tr/\N{U+...}/foo/ 的回歸在編碼點在 128 和 255 之間時已經修復。 [GH #15475].

  • 在允許的平台上,現在對代碼點大於 2**31 的字符串定界符的使用正常工作。以前,由於截斷,某些字符會與具有特殊含義的其他定界符字符(例如在 m?...? 中的 "?")混淆,導致行為不一致。請注意,這是不可移植的,並且基於 Perl 對 UTF-8 的擴展,可能不可顯示也無法由任何編輯器輸入。 [GH #15477]

  • @{x 後跟一個換行符,其中 "x" 代表一個控制或非 ASCII 字符,不再產生錯誤的語法錯誤消息或崩潰。 [GH #15518]

  • 使用 %: = 0 的斷言失敗已被修復。 [GH #15358]

  • 在 Perl 5.18 中,"$foo::$bar" 的解析意外更改,導致它將被視為 $foo."::".$bar。已恢復到先前的行為,即將其解析為 $foo:: . $bar[GH #15408]

  • 自 Perl 5.20 起,當使用 -x 選項調用 perl 時,行號已經錯位了一個。已修復此問題。 [GH #15413]

  • 在已刪除的存儲區中創建一個子例程存根(例如,delete $My::{"Foo::"}; \&My::Foo::foo)不再崩潰。自 Perl 5.18 開始會崩潰。 [GH #15420]

  • 一些子例程和文件處理程序同時釋放的複雜情況可能導致崩潰,但已經修復。崩潰是在 Perl 5.22 中引入的。 [GH #15435]

  • 在處理未初始化值相關的變數名稱時,可能導致斷言失敗的程式碼,例如$ISA[0][0],已經修復。 [GH #15364]

  • 在像sub P::f{} undef *P::; *P::f =sub{};這樣的情況下,程式碼生成警告“Subroutine STASH::NAME redefined”導致的崩潰已經修復。在這些情況下,如果 STASH 缺失,警告將顯示為“Subroutine NAME redefined”。 [GH #15368]

  • 修復了一個由於處理已棄用的格式行為而觸發的斷言問題,例如

    format STDOUT =
    @
    0"$x"

    [GH #15366]

  • 在 Windows 上的字串轉換程式碼中可能發生除以零的情況,從而避免了在整理空字串時的崩潰。 [GH #15439]

  • 一些正則表達式解析錯誤可能導致正則表達式失敗,例如/(?<=//(?<!/。現在已經修復。 [GH #15332]

  • until ($x = 1) { ... } ... until $x = 1 現在在啟用語法警告時會正確發出警告。 [GH #15138]

  • 在失敗時,socket()現在將系統返回的錯誤碼保留在$!中。 [GH #15383]

  • bitwise功能下,任何位元運算的賦值變體如果左邊是陣列或哈希將會崩潰。 [GH #15346]

  • require後跟一個冒號(如foo() ? require : ...)現在被正確解析為具有隱式$_require,而不是require ""[GH #15380]

  • 在所有標量lvalue上下文中,現在可以一致地將標量keys %hash分配給。以前它對某些上下文有效,但對其他上下文無效。

  • 將陣列或哈希分配給vecsubstr的列表,其第一個參數在過去可能導致崩潰或在運行時產生“無法強制轉換”錯誤消息,而不像標量賦值,標量賦值會在編譯時產生錯誤。現在列表賦值也會在編譯時產生錯誤。 [GH #15370]

  • 在某些情況下,包含&&||運算符(或它們的同義詞andor)的表達式被編譯時會出現錯誤。如果左邊包含否定的裸字常量或包含常量表達式的否定do {}塊,右邊包含不可折疊表達式,則其中一個否定將被忽略。在ifunless語句修飾符中也是如此,只是左邊和右邊的表達式被交換了。這個長期存在的錯誤現在已經被修復。 [GH #15285]

  • reset 使用參數時,在遇到除了 glob 以外的暫存項目時不再崩潰。 [GH #15314]

  • 將哈希賦值給名為 *:::::: 的型態環以及刪除它們不再導致崩潰。 [GH #15307]

  • Perl 在列表賦值的左側(LHS)未正確處理 true/false 值;特別是布林運算符返回的真值。這可能會觸發類似以下情況的斷言失敗

    for ($x > $y) {
        ($_, ...) = (...); # here $_ is aliased to a truth value
    }

    這是從 v5.24 起的一個退化。 [GH #15690]

  • 使用者定義的類似 Unicode 屬性導致斷言失敗。 [GH #15696]

  • 修正正規表達式中未閉合的 \N{ 的錯誤訊息。一個未閉合的 \N{ 可能會給出錯誤的訊息:"\N{NAME} must be resolved by the lexer"

  • 在列表上下文中的列表賦值,其中 LHS 包含聚合,並且 RHS 元素不足時,以前會跳過純量左值。以前,(($a,$b,@c,$d) = (1)) 在列表上下文中返回 ($a);現在它返回 ($a,$b,$d)(($a,$b,$c) = (1)) 不變:它仍然返回 ($a,$b,$c)。這可以在以下中看到

    sub inc { $_++ for @_ }
    inc(($a,$b,@c,$d) = (10))

    以前,($a,$b,$d) 的值會保留為 (11,undef,undef);現在它們是 (11,1,1)

  • 像這樣的代碼:/(?{ s!!! })/ 在最後一個成功的模式本身時可能觸發 C 堆棧上的無限遞迴(而不是正常的 perl 堆棧)。我們通過簡單地禁止在當前執行的模式解析為空模式時使用空模式來避免段錯誤。 [GH #15669]

  • 在 perl 的 lexer 中,當末尾有一個短的 UTF-8 字符時,避免在讀取超出行緩衝區的末尾。 [GH #15531]

  • 正規表達式中的交替有時無法將 utf8 字符串與 utf8 替代匹配。 [GH #15680]

  • 使 do "a\0b" 靜默失敗(並返回 undef 並設置 $!)而不是拋出錯誤。 [GH #15676]

  • chdir 沒有參數時,未確保有堆棧空間用於返回其結果。 [GH #15569]

  • 所有與 do 相關的錯誤訊息現在都提到 do ;一些以前聲稱來自 require

  • 執行 undef $x 其中 $x 是被綁定或神奇的變數,不再錯誤地將變數歸咎於由綁定/神奇代碼遇到的未初始化值警告。

  • 像這樣的代碼 $x = $x . "a"$x 是一個帶有未定義值的詞法變量時,錯誤地未產生 使用未初始化值 警告。現在已經修復了這個問題。 [GH #15269]

  • undef *_; shiftundef *_; pop 在子程序內,若 shiftpop 沒有參數,自 Perl 5.14 開始崩潰,但現已修復。

  • "string$scalar->$*" 現在正確地優先使用串接運算子重載而不是字串重載,如果 $scalar->$* 返回一個重載對象,使其與 $$scalar 保持一致。

  • /@0{0*->@*/*0 及類似的扭曲在過去可能會崩潰,但現在不再崩潰,僅會產生語法錯誤。 [GH #15333]

  • dorequire 的參數是一個引用或型別全局符號時,當該參數被字符串化包含空字符時,自 Perl 5.20 開始崩潰,但現已修復。 [GH #15337]

  • 改善缺少 tie() 包/方法的錯誤消息。這使得錯誤消息與常規方法調用的消息保持一致。

  • 解析錯誤的 POSIX 字符組現在不再泄漏記憶體。 [GH #15382]

已知問題

  • G++ 6 處理次正規(非正規)浮點值與 gcc 6 或 g++ 5 不同,導致“flush-to-zero”。最終結果是,如果使用十六進制浮點格式指定非常小的值,如 0x1.fffffffffffffp-1022,它們將變為零。 [GH #15990]

先前版本的勘誤

  • 修復了遞歸正則表達式的問題。此行為在 Perl 5.24 中已修復。 [GH #14935]

訃聞

Jon Portnoy(AVENJ),一位多產的 Perl 作者和受人尊敬的 Gentoo 社區成員,於 2016 年 8 月 10 日去世。他將被所有與他接觸過並因他的智慧、機智和精神而受益的人所記住和想念。

我們也懷著沉痛的心情悼念 Kip Hampton 的離世。他最著名的是在 XML.com 上撰寫的 Perl & XML 專欄的作者,他是 AxKit 的核心貢獻者,這是一個成為 Apache 基金會項目的 XML 服務器平台。他在 OSCON 的早期經常發言,最近在麥迪遜的 YAPC::NA 上發言。他在 irc.perl.org 上經常以 ubu 的身份出現,通常在 #axkit-dahut 社區,這個社區負責 2011 年的 YAPC::NA Asheville。

Kip 和他對社區的不懈貢獻將被深深地想念。

致謝

Perl 5.26.0 自 Perl 5.24.0 開發約 13 個月,包含大約 86 位作者在 2,600 個檔案中共約 360,000 行的更改。

排除自動生成的檔案、文件和發布工具,大約有 86 位作者對 1,800 個 .pm、.t、.c 和 .h 檔案進行了約 230,000 行的更改。

Perl 因為活躍的使用者和開發者社群,持續蓬勃發展進入第三個十年。以下這些人被認為是貢獻了成為 Perl 5.26.0 改進的人:

Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alex Vandiver, Andreas König, Andreas Voegele, Andrew Fresh, Andy Lester, Aristotle Pagaltzis, Chad Granum, Chase Whitener, Chris 'BinGOs' Williams, Chris Lamb, Christian Hansen, Christian Millour, Colin Newell, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, Dave Cross, Dave Rolsky, David Golden, David H. Gutteridge, David Mitchell, Dominic Hargreaves, Doug Bell, E. Choroba, Ed Avis, Father Chrysostomos, François Perrad, Hauke D, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, James Raspass, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, J. Nick Koston, John Lightsey, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Matthew Horsfall, Maxwell Carey, Misty De Meo, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter Avalos, Petr Písař, Pino Toscano, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo Signes, Richard Levitte, Rick Delaney, Salvador Fandiño, Samuel Thibault, Sawyer X, Sébastien Aperghis-Tramoni, Sergey Aleynikov, Shlomi Fish, Smylers, Stefan Seifert, Steffen Müller, Stevan Little, Steve Hay, Steven Humphrey, Sullivan Beck, Theo Buehler, Thomas Sibley, Todd Rinaldo, Tomasz Konojacki, Tony Cook, Unicode Consortium, Yaroslav Kuzmin, Yves Orton, Zefram。

上述名單幾乎肯定不完整,因為它是根據版本控制歷史自動生成的。特別是,它不包括向 Perl 問題追踪器報告問題的(非常感激的)貢獻者的名字。

此版本中包含的許多更改源於包含在 Perl 核心中的 CPAN 模塊。我們感謝整個 CPAN 社群幫助 Perl 蓬勃發展。

有關 Perl 所有歷史貢獻者的更完整列表,請參閱 Perl 源發行版中的 AUTHORS 文件。

回報錯誤

如果您發現了您認為是錯誤的問題,您可以查看 Perl 的錯誤資料庫:https://rt.perl.org/。您也可以在 Perl 官方網站:http://www.perl.org/ 上找到相關資訊。

如果您相信您發現了一個未報告的錯誤,請執行您的版本中包含的 perlbug 程式。請確保將您的錯誤簡化到一個小而足夠的測試案例。您的錯誤報告,連同 perl -V 的輸出,將被發送到 perlbug@perl.org 以供 Perl 移植團隊分析。

如果您要報告的錯誤具有安全性影響,使其不適合發送到公開存檔的郵件列表,請參閱 perlsec 中的"安全性漏洞聯絡資訊" 以了解如何報告問題的詳細資訊。

致謝

如果您想感謝 Perl 5 移植團隊在 Perl 5 中所做的工作,您可以執行 perlthanks 程式。

perlthanks

這將會向 Perl 5 移植團隊郵件列表發送您的感謝。

參見

查看 Changes 文件以獲取關於變更的詳細資訊。

查看 INSTALL 文件以了解如何構建 Perl。

查看 README 文件以獲取一般信息。

查看 ArtisticCopying 文件以獲取版權信息。