perl5380delta - Perl v5.38.0 的新功能
本文件描述了 5.36.0 版本與 5.38.0 版本之間的差異。
class
功能現在可以使用新的實驗性語法來定義物件類別,其中每個實例的數據存儲在「field」變數中,其行為類似於語彙範疇。
use feature 'class';
class Point
{
field $x;
field $y;
method zero { $x = $y = 0; }
}
更多詳細信息請參閱perlclass。其實現的內部細節和其他相關細節可在perlclassguts中找到。
這仍然是一個新的實驗性功能,仍在積極開發中。它將成為未來版本中的更多添加、改進和變更的主題。由於它是實驗性的,因此在experimental::class
類別中會產生警告。可以通過no warnings
語句消除這些警告。
use feature 'class';
no warnings 'experimental::class';
詳情請參見https://www.unicode.org/versions/Unicode15.0.0/。
所有棄用警告現在都有自己特定的棄用類別,可以單獨禁用。您可以在perldeprecation和warnings中查看所有棄用功能的列表。以下列表來自warnings
+- deprecated ----+
| |
| +- deprecated::apostrophe_as_package_separator
| |
| +- deprecated::delimiter_will_be_paired
| |
| +- deprecated::dot_in_inc
| |
| +- deprecated::goto_construct
| |
| +- deprecated::smartmatch
| |
| +- deprecated::unicode_property_name
| |
| +- deprecated::version_downgrade
仍然可以使用一條語句禁用所有棄用警告
no warnings 'deprecated';
但現在可以更細緻地控制。 歷史上一直如此,這些警告會自動啟用
use warnings;
因為各種原因,對於某些Perl關鍵字創建子程序包裹可能會很困難。 任何具有未定義原型的關鍵字都無法用子程序包裹,而一些Perl允許包裹的關鍵字在實踐中非常棘手。 例如require
是很棘手的,雖然可能,但這樣做會改變堆棧深度,並且標準的導出方法假定它們將導出到特定堆棧深度的包裹,否則封裝將改變函數導出到的位置,除非實施得非常小心,否則這可能非常棘手。
因此,我們引入了一個名為%{^HOOK}
的新哈希,旨在促進這種情況。 當關鍵字支持任何類型的特殊鉤子時,鉤子將存在於這個新哈希中。 這個哈希中的鉤子將以調用它們的函數命名,然後是兩個下劃線,然後是它們被執行的階段,目前只有在關鍵字執行之前或之後。
在這個初始版本中,我們支持兩個鉤子require__before
和require__after
。 這些用於在require
語句之前和之後執行任務,以使其更容易。
更多詳細信息請參見perlvar。
新增了一個新的環境變量PERL_RAND_SEED
,可以用來使使用rand
但未明確使用srand()
的Perl程序或者使用無參數的srand()
的程序可以重複運行。參見perlrun。此功能可以在編譯時通過傳遞
-Accflags=-DNO_PERL_RAND_SEED
給編譯過程中的Configure來禁用。
現在,可以使用//=
或||=
運算符來分配子程序簽名參數的默認表達式,以便在調用者提供未定義或false值(分別)時應用默認值,而不僅僅是在參數完全缺失時。有關更多詳細信息,請參見perlsub中的文檔。
已經加固了@INC
鉤子的內部,以處理各種邊界情況,當鉤子在require操作期間修改@INC
時,不再會出現段錯誤或斷言失敗。作為此操作的一部分,我們現在確保在一次require調用期間最多執行一次任何給定的鉤子,並且任何重複的目錄不會觸發額外的目錄探測。
為了提供開發者對動態模組查找更多控制權,現在支援一個名為INCDIR
的新鉤子方法。支援此方法的物件可以被注入到@INC
陣列中,當在模組搜索過程中遇到時,它將被執行,就像執行INC鉤子一樣,並將其返回值用作要搜索模組的目錄列表。返回一個空列表相當於沒有操作。請注意,由於此鉤子返回的任何參考都將被轉換為字符串並用作字符串,您不能通過此API返回稍後執行的鉤子。
當在require期間調用@INC
鉤子(INC
或INCDIR
之一)時,$INC
變數將被局部化為鉤子來自的@INC
的索引值。如果鉤子希望覆蓋@INC
中的“下一個”索引應該是什麼,它可以將$INC
更新為比所需索引少一的值(undef
等同於-1
)。這允許@INC
鉤子完全重寫@INC
陣列並使perl從@INC
的開始重新啟動其目錄探測。
@INC
中的已祝福CODE參考不再觸發異常,而是將與未祝福的coderef一樣對待,並且像它們是INC
鉤子一樣執行。
defer
或finally
中的控制流程被禁止嘗試通過諸如return
或goto
之類的控制流程離開defer
或finally
塊是被禁止的。之前的perl版本只能在實際運行時檢測到這一點。
這個perl版本為許多可以在靜態上確定的情況添加了編譯時檢測。這可能意味著在先前版本的perl上成功編譯的代碼現在在此版本上被報告為編譯時錯誤。這只在實際執行代碼時會是一個錯誤的情況下才發生;錯誤只是在較早的時間發生。
在模式中使用(?{ ... })
和(??{ ... })
會全域地停用各種最佳化。這可能是程式設計者所期望的,也可能不是。此版本新增了(*{ ... })
的等效方式。唯一的差異在於它不會且永遠不會停用正規表達式引擎中的任何最佳化。這可能使其在未來被呼叫的次數更多或更少,但它執行的次數將完全符合正規表達式引擎的功能。例如,當模式中包含(?{ ... })
時,某些類型的最佳化會被停用,使得在正常使用時為O(N)的模式變為包含(?{ ... })
模式時為O(N*N)。切換到(*{ ... })
意味著模式將保持O(N)。
過去許多正規表達式量詞的限制為U16_MAX
,但現在限制為I32_MAX
,因此現在可以寫/(?:word){1000000}/
。請注意,這樣做可能會導致正規表達式引擎運行時間較長並使用更多記憶體。
有兩個新的API函數可用於操作optree片段,確保您可以調用可能否則不會被調用的optree生成過程的所需部分(例如,當創建自定義LOGOP時)。要訪問這些函數,您首先需要將一個#define
設置為允許使用這些函數。
#define PERL_USE_VOLATILE_API
這些函數與解釋器內部的運作方式密切相關,如果其他內部更改需要,它們可能隨時會被修改或移除。
goto
現在允許在defer
和finally
區塊中Perl版本5.36.0新增了defer
區塊並允許finally
關鍵字也添加類似於try
/catch
語法的行為。這些並不允許區塊內部有任何goto
表達式,因為這可能導致控制流跳出區塊。現在,如果它們具有常數目標標籤並且該標籤位於區塊內,則允許一些goto
表達式。
use feature 'defer';
defer {
goto LABEL;
print "This does not execute\n";
LABEL: print "This does\n";
}
這允許訪問在當前作用域中匹配的最後一個成功模式。正則表達式引擎的許多方面都涉及到“最後一個成功的模式”。空模式重複使用它,所有魔法正則表達式變量都與它相關。這允許訪問它的模式。以下代碼
if (m/foo/ || m/bar/) {
s//PQR/;
}
可以改寫為:
if (m/foo/ || m/bar/) {
s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
}
並且它將執行完全相同的操作。
對於具有 GNU 擴展 LC_NAME
類別的平台,您現在可以將其作為 POSIX 中的 "setlocale" 的類別參數 來設置和查詢其語言環境。
readline()
,也寫作 <>
,在流上發生錯誤後將不再清除處理的錯誤和 eof 標誌。
現在幾乎所有情況下都不再執行此清除,因此錯誤和 eof 標誌現在正確地反映了 readline() 後流的狀態。
由於錯誤標誌不再被清除,因此在流上調用 close() 可能會失敗,並且如果未顯式關閉流,則隱式關閉流可能會產生警告。
這導致了下游 CPAN 模塊中的兩種主要問題,這些問題也可能發生在您的代碼中
如果您的代碼讀取到文件結尾,然後將處理綁定到新的文件描述符,以前由於 eof 標誌未設置,您可以繼續從流中讀取。現在您需要使用 $handle->clearerr()
自行清除 eof 標誌以繼續讀取。
如果您的代碼在使用 readline() 讀取時遇到流上的錯誤,您需要調用 $handle->clearerr
以繼續讀取。這發生的一種情況是底層文件描述符被標記為非阻塞,因此 read() 系統調用失敗並返回 EAGAIN
,導致在流上設置錯誤標誌。
唯一一個在錯誤時持續清除錯誤和 eof 標誌的情況是在 miniperl 中的 glob() 讀取子處理程序時。這使其能夠在 close() 時正確報告子處理程序的錯誤。這在正常 perl 開發期間不太可能成為問題。
INIT
區塊在 BEGIN
中的 exit()
後不再運行BEGIN
中執行 exit()
後 INIT
區塊將不再運行。這意味著 -v
選項和 -c
選項的組合不再執行編譯檢查,同時顯示 perl 版本。在 BEGIN
區塊內部打印版本信息後,-v
選項執行 exit(0),而 -c
檢查是使用 INIT
鉤子實現的,導致 -v
選項優先。
通常,即使在遇到編譯錯誤後,perl 也會繼續解析源代碼。在許多情況下,這是有幫助的,例如對於拼寫錯誤的變量名,顯示盡可能多的錯誤示例是有幫助的。但是,在語法錯誤的情況下繼續進行通常會產生奇怪的錯誤消息,甚至可能在編譯過程中導致段錯誤。在此版本中,編譯器將在遇到第一個語法錯誤時停止。這意味著任何期望看到我們以前產生的特定錯誤消息的代碼將會失敗。發出的錯誤將是以前產生的診斷之一,但在某些情況下,以前產生的某些消息將不再顯示。
詳情請參見 "現有診斷的更改"。
utf8::upgrade()
從這個版本開始,如果輸入字符串是undef
,它將保持undef
。以前它會被改成一個已定義的、零長度的字符串。
Perl 5.28 在支持的系統上引入了"線程安全"語言環境,即現代 Windows 和支持 POSIX 2008 語言環境操作的系統。這些系統通過擁有每個線程的語言環境來實現這一點,同時繼續支持舊的全局語言環境操作,以供不使用新的每個線程語言環境所需步驟的代碼使用。
事實證明,一些 POSIX 2008 平台存在或曾經存在有缺陷的實現,這迫使 Perl 不使用它們。${^SAFE_LOCALES}
标量变量包含 0 或 1,以指示当前平台是否被 Perl 認為具有可用的線程安全實現。一些實現已經修復了,但 FreeBSD 和 Cygwin 最近被發現有足夠多的缺陷,以至於 Perl 不再在本版本中使用線程安全操作。因此,對於它們,${^SAFE_LOCALES}
現在為 0。可以通過在 Configure 選項中添加 -DNO_POSIX_2008_LOCALE
來配置舊版本的 Perl 避免這些有缺陷的實現。
在 v5.38 中修復了所有先前版本中導致語言環境不完全線程安全的錯誤。完成的第一個線程導致主線程(命名為thread0
)恢復到啟動時生效的全局語言環境,丟棄線程的語言環境之前的設置。如果任何其他線程通過在 XS 代碼中調用 switch_to_global_locale()
切換到全局語言環境,那些線程將共享全局語言環境,並且thread0
將不是線程安全的。
'
作為包名分隔符已棄用在雙引號字符串中命名的變量中使用'
作為包分隔符自 Perl 5.28 開始已發出警告。現在在字符串內插和非內插上下文中都已棄用,並將在 Perl 5.42 中刪除。
"switch" 功能和智能匹配運算符~~
在 v5.10 中引入。它們的行為在 v5.10.1 中被顯著改變。當在 v5.18.0 中添加了 "experiment" 系統時,switch 和 smartmatch 被後續宣佈為實驗性的。多年來,有提案修復或補充這些功能。
在 v5.38.0 中,我們宣告該實驗失敗。一些未來的系統可能會取代 smartmatch 的概念位置,但目前尚未設計或建立。
這些功能將在 v5.42.0 中從 perl 中完全移除。
對於常見的 OP 模式進行額外的 optree 優化。例如,多個簡單的 OP 被一個單一的簡化 OP 取代,以使運行時更有效率。[GH #19943], [GH #20063], [GH #20077]
現在,創建匿名 sub 不再生成 srefgen
op,而是在 anoncode
或 anonconst
op 中進行引用生成,節省運行時。[GH #20290]
新增了 is_tainted()
內建函式。[GH #19854]
支援 PPC 0018,use feature "module_true";
已添加到 v5.38 及以後的預設功能捆綁包中。也可以明確使用。當在模組內啟用時,該模組不需要明確返回 true,實際上,返回值將被強制為一個簡單的 true 值,無論它最初是什麼。
Attribute::Handlers 已從版本 1.02 升級到 1.03。
attributes 已從版本 0.34 升級到 0.35。
autodie 已從版本 2.34 升級到 2.36。
B 已從版本 1.83 升級到 1.88。
B::Concise 已從版本 1.006 升級到 1.007。
B::Deparse 已從版本 1.64 升級到 1.74。
Benchmark 已從版本 1.23 升級到 1.24。
bignum 已從版本 0.65 升級到 0.66。
Carp 已從版本 1.52 升級到 1.54。
Class::Struct 已從版本 0.66 升級到 0.68。
Compress::Raw::Bzip2 已從版本 2.103 升級至 2.204_001。
Compress::Raw::Zlib 已從版本 2.105 升級至 2.204_001。
Config::Perl::V 已從版本 0.33 升級至 0.36。
CPAN 已從版本 2.33 升級至 2.36。
Data::Dumper 已從版本 2.184 升級至 2.188。
DB_File 已從版本 1.857 升級至 1.858。
Devel::Peek 已從版本 1.32 升級至 1.33。
Devel::PPPort 已從版本 3.68 升級至 3.71。
Digest::MD5 已從版本 2.58 升級至 2.58_01。
Digest::SHA 已從版本 6.02 升級至 6.04。
DynaLoader 已從版本 1.52 升級至 1.54。
Encode 已從版本 3.17 升級至 3.19。
encoding::warnings 已從版本 0.13 升級至 0.14。
Env 已從版本 1.05 升級至 1.06。
Errno 已從版本 1.36 升級至 1.37。
experimental 已從版本 0.028 升級至 0.031。
ExtUtils::CBuilder 已從版本 0.280236 升級至 0.280238。
ExtUtils::Install 已從版本 2.20 升級至 2.22。
ExtUtils::MakeMaker 已從版本 7.64 升級至 7.70。
ExtUtils::Miniperl 已從版本 1.11 升級至 1.13。
ExtUtils::ParseXS 已從版本 3.45 升級至 3.51。
ExtUtils::PL2Bat 已從版本 0.004 升級至 0.005。
ExtUtils::Typemaps 已從版本 3.45 升級至 3.51。
feature 已從版本 1.72 升級至 1.82。
File::Basename 已從版本 2.85 升級至 2.86。
File::Copy 已從版本 2.39 升級至 2.41。
File::Find 已從版本 1.40 升級至 1.43。
File::Glob 已從版本 1.37 升級至 1.40。
File::Spec 已從版本 3.84 升級至 3.89。
File::stat 已從版本 1.12 升級至 1.13。
FileHandle 已從版本 2.03 升級至 2.05。
Filter::Util::Call 已從版本 1.60 升級至 1.64。
GDBM_File 已從版本 1.23 升級至 1.24。
Getopt::Long 已從版本 2.52 升級至 2.54。
Hash::Util 已從版本 0.28 升級至 0.30。
HTTP::Tiny 已從版本 0.080 升級至 0.083。
I18N::Langinfo 已從版本 0.21 升級至 0.22。
IO 已從版本 1.50 升級至 1.52。
IO-Compress 已從版本 2.106 升級至 2.204。
IO::Socket::IP 已從版本 0.41 升級至 0.41_01。
在 DragonflyBSD 上,偵測 setsockopt() 即使在 setsockopt() 返回成功時未實際清除 IPV6_V6ONLY。[cpan #148293]
IO::Zlib 已從版本 1.11 升級至 1.14。
JSON::PP 已從版本 4.07 升級至 4.16。
libnet 已從版本 3.14 升級至 3.15。
Locale::Maketext 已從版本 1.31 升級至 1.33。
Math::BigInt 已從版本 1.999830 升級至 1.999837。
Math::BigInt::FastCalc 已從版本 0.5012 升級至 0.5013。
Math::BigRat 已從版本 0.2621 升級至 0.2624。
Math::Complex 已從版本 1.5902 升級至 1.62。
Memoize 已從版本 1.03_01 升級至 1.16。
MIME::Base64 已從版本 3.16 升級至 3.16_01。
Module::CoreList 已從版本 5.20220520 升級至 5.20230520。
mro 已從版本 1.26 升級至 1.28。
NDBM_File 已從版本 1.15 升級至 1.16。
Net::Ping 已從版本 2.74 升級至 2.76。
ODBM_File 已從版本 1.17 升級至 1.18。
Opcode 已從版本 1.57 升級至 1.64。
overload 已從版本 1.35 升級至 1.37。
parent 已從版本 0.238 升級至 0.241。
PerlIO::via::QuotedPrint 已從版本 0.09 升級到 0.10。
Pod::Checker 已從版本 1.74 升級到 1.75。
Pod::Html 已從版本 1.33 升級到 1.34。
Pod::Usage 已從版本 2.01 升級到 2.03。
podlators 已從版本 4.14 升級到 5.01。
POSIX 已從版本 2.03 升級到 2.13。
re 已從版本 0.43 升級到 0.44。
Safe 已從版本 2.43 升級到 2.44。
Scalar::Util 已從版本 1.62 升級到 1.63。
SDBM_File 已從版本 1.15 升級到 1.17。
Socket 已從版本 2.033 升級到 2.036。
Storable 已從版本 3.26 升級到 3.32。
Sys::Hostname 已從版本 1.24 升級到 1.25。
Term::Cap 已從版本 1.17 升級到 1.18。
Test::Simple 已從版本 1.302190 升級到 1.302194。
Text::Balanced 已從版本 2.04 升級到 2.06。
threads 已從版本 2.27 升級到 2.36。
threads::shared 已從版本 1.64 升級到 1.68。
Tie::File 已從版本 1.06 升級到 1.07。
Time::HiRes 已從版本 1.9770 升級到 1.9775。
Time::Piece 已從版本 1.3401 升級到 1.3401_01。
Unicode::Normalize 已從版本 1.31 升級到 1.32。
UNIVERSAL 已從版本 1.14 升級到 1.15。
User::grent 已從版本 1.03 升級到 1.04。
User::pwent 已從版本 1.01 升級到 1.02。
utf8 已從版本 1.24 升級到 1.25。
warnings 已從版本 1.58 升級到 1.65。
XS::APItest 已從版本 1.22 升級到 1.32。
XSLoader 已從版本 0.31 升級到 0.32。
描述了新的class
功能。
描述了新 class
功能的內部。
我們試圖更新文件,以反映本文列出的更改。如果您發現我們遺漏了任何更改,請在 https://github.com/Perl/perl5/issues 開啟一個問題。
此外,已進行了以下選擇性更改
已記錄 hv_ksplit
已記錄 hv_name_set
已記錄 gv_autoload_pv
已記錄 gv_autoload_pvn
已記錄 gv_autoload_sv
已記錄 gv_name_set
已記錄 start_subparse
已記錄 save_aelem
已記錄 save_aelem_flags
已記錄 save_helem
已記錄 save_helem_flags
新增了有關未安排淘汰和其類別的信息。
為現有已安排淘汰添加了類別信息。
將智能匹配和撇號作為包分隔符淘汰資料添加了。
已記錄 save_pushptr
已記錄 save_scalar_at
為新的 newAV_alloc_x
、newAV_alloc_xz
和 *_simple
函數添加了 perlguts 的條目。
從 perlcommunity 和 perlmodstyle 中刪除了對現已廢棄的 PrePAN 服務的引用。
對 perlhacktips 添加了有關符號命名的部分。
已編輯 perlexperiment,以正確引用延遲區塊修飾符和引用類似操作符的額外警告類別。
智能匹配已從實驗性狀態移到淘汰狀態。不幸的是,這個實驗並未成功。
對於 ucfirst
, push
, unshift
和 bless
函式進行了一些用詞改進,並新增了額外的範例。
新增了一個新的章節,"撰寫更安全的巨集" 在 perlhacktips,討論在 C 和 XS 程式碼中使用 C 巨集時的問題和解決方案。
新增了一個新的章節,"選擇好的符號名稱" 在 perlhacktips,討論名稱方面的意外狀況。
更好地描述了匹配空模式的行為,並正確指定其與新的 ${^LAST_SUCCESSFUL_PATTERN}
的關係。
新增了一節關於 "正規表達式變數的作用範圍規則",並在整個文件中進行了文字上的改進。
新增了有關新的 %{^HOOK}
介面的信息,以及它公開的新的 require__before
和 require__after
鉤子。
更正了關於正規表達式變數 ${^PREMATCH}
, ${^MATCH}
和 ${^POSTMATCH}
的信息,這些信息由於疏忽而錯誤地記錄了。具體來說,它們僅在使用 /p 修飾符啟用它們的正規表達式操作之後才能正常工作。
新增了有關新的正規表達式變數 ${^LAST_SUCCESSFUL_PATTERN}
的信息,該變數表示作用域內上一次成功的正規表達式匹配的模式。
對於診斷輸出,包括警告和致命錯誤消息進行了以下添加或更改。有關完整的診斷消息列表,請參見 perldiag。
新增了一個新的語法錯誤,用於表示 catch
块沒有其所需的變量聲明。請參見 catch block requires a (VAR)
(F) 您正嘗試使用一個新風格的 class
作為包名呼叫 bless
。這是不必要的,因為由構造函數創建的實例已經在正確的類中。實例不能通過其他方式創建,例如 bless
。
無法將 :param(%s) 分配給字段 %s,因為該名稱已經被使用
(F) 當在同一個類中或其父類的字段中已經使用該名稱時,嘗試將參數名稱應用於字段時,不允許此操作。這將導致名稱衝突,因此不允許此操作。
(F) 嘗試從已經具有 @ISA
陣列且該陣列不為空的包中創建一個類。這是不允許的,因為這將導致具有不一致繼承的類。
(F)您嘗試通過傳遞不是相同類別實例的值來直接調用一個類的 method
子程序。這是不允許的,因為該方法將無法訪問正確的實例字段。
(F)您嘗試通過傳遞不是該類別實例的值來直接調用一個類的 method
子程序。這是不允許的,因為該方法將無法訪問其實例字段。
(F)您試圖在不在類定義內的位置使用僅在 class
定義內有意義的關鍵字。
(F)您試圖開始對已存在的類別定義一個 class
定義塊。一個類別只能有一個定義塊。
(F)您試圖對已經指向真實物件實例的值調用 bless
。
(F)在Cygwin上,您對空路徑使用了路徑轉換函數。只有非空路徑是合法的。
(F)當已經指定了一個超類時,您試圖使用 :isa
屬性指定第二個超類給一個 class
。與使用 bless
創建其實例的類別不同,通過 class
關鍵字創建的類別不能有多於一個的超類。
(F)您為一個類別指定了一個屬性,該屬性需要在括號內傳遞一個值,但您沒有提供。請記住屬性名稱和其值之間不允許有空格;您必須這樣寫
class Example::Class :attr(VALUE) ...
(F)使用 class
:isa
屬性創建子類別時,命名的超類也必須是使用 class
關鍵字創建的真實類別。
(F)一個字段最多只能有一個應用 :param
屬性來為其指定一個參數名;一旦應用了第二個,就不允許再次應用。
(F)您為一個字段指定了一個屬性,該屬性需要在括號內傳遞一個值,但您沒有提供。請記住屬性名稱和其值之間不允許有空格;您必須這樣寫
field $var :attr(VALUE) ...
(F) 嘗試從不在 方法
程序體內的程式碼中存取類別的欄位變數。這是不允許的,因為只有方法才能存取實例的欄位。
(F) 嘗試從實際定義它的類別內部的另一個類別的方法中存取類別的欄位變數。這是不允許的,因為只有由給定類別定義的方法才能存取該類別的欄位。
(F) 您嘗試將 :param
屬性應用於陣列或雜湊欄位。目前不允許這樣做。
(F) 您呼叫了一個有必要命名參數的類別的構造函式,但根本沒有傳遞該參數。
(F) 您嘗試使用可選的後置版本號以外的其他東西作為 class
:isa
屬性的值。這會混淆解析器。
(F) 您嘗試將一個命名屬性添加到 class
定義中,但 perl 不認識所要求屬性的名稱。
(F) 您嘗試將一個命名屬性添加到 field
定義中,但 perl 不認識所要求屬性的名稱。
這是已經存在的診斷的簡化形式,用於沒有切換到新地域的情況。在這種情況下,先前的診斷具有誤導性。
(S experimental::class)如果您使用use feature 'class'
的ADJUST
關鍵字,將會發出此警告。此關鍵字目前是實驗性的,其行為可能會在未來的Perl版本中更改。
(S experimental::class)如果您使用use feature 'class'
的class
關鍵字,將會發出此警告。此關鍵字目前是實驗性的,其行為可能會在未來的Perl版本中更改。
(W redefine)您重新定義了一個方法。若要抑制此警告,請說:
{
no warnings 'redefine';
*name = method { ... };
}
(W misc)您指定了一個奇數個元素來初始化物件的哈希字段。哈希從一個鍵/值對列表初始化,因此每個鍵都必須對應一個值。最後缺少的值將被填充為undef。
(W deprecated, syntax)您在變數、子程式或套件名稱中使用了舊的套件分隔符 "'"。對舊的套件分隔符的支援將在Perl 5.40中移除。
(S experimental::class)如果您使用use feature 'class'
的field
關鍵字,將會發出此警告。此關鍵字目前是實驗性的,其行為可能會在未來的Perl版本中更改。
(S experimental::class)如果您使用use feature 'class'
的method
關鍵字,將會發出此警告。此關鍵字目前是實驗性的,其行為可能會在未來的Perl版本中更改。
編譯器現在會在遇到第一個語法錯誤時停止解析。在歷史上,編譯器會嘗試“跳過”錯誤並繼續解析,以便列出多個錯誤。對於像在strict模式下使用未聲明的變數這樣的情況,這是有意義的。但是,對於語法錯誤,發現繼續解析往往會導致一連串不相關或奇怪的錯誤,這些錯誤大多只會混淆真正的錯誤。在極端情況下,這甚至可能導致段錯誤和其他不正確的行為。
因此,我們已經重新設計了繼續解析的邏輯,以便在第一次遇到語法錯誤後停止解析。像未聲明的變數這樣的語義錯誤不會停止解析,因此在編譯代碼時仍然可能看到多個錯誤。但是,如果有語法錯誤,它將是perl報告的最後一個錯誤消息,您所看到的所有錯誤都是真正需要修正的內容。
輸出類別或套件名稱的錯誤訊息已修改為輸出雙引號字串,其中各種字元已進行轉義,以使讀者清楚了解確切的值。目前的確切規則是逃逸哪些字元可能會隨時間改變,但目前是這樣:可列印的ASCII代碼點(不包括"
和\
),以及代碼點超過255的Unicode單字元被原始輸出,任何其他符號都會被逃逸,就像Data::Dumper可能會逃逸它們一樣,使用\n
表示換行和\"
表示雙引號等。範圍為128-255的代碼點始終會被逃逸,因為它們在原始輸出時可能對Unicode終端機造成麻煩。
在較舊版本的perl中,單行程式碼
$ perl -le'"thing\n"->foo()'
會輸出如下錯誤訊息,完全如此,因為文字分佈在多行上,因為"\n"會作為原始換行字元輸出
Can't locate object method "foo" via package "thing
" (perhaps you forgot to load "thing
"?) at -e line 1.
從這個版本開始,我們會改為輸出這樣(作為一行)
Can't locate object method "foo" via package "thing\n"
(perhaps you forgot to load "thing\n"?) at -e line 1.
請注意,套件名稱中的換行已被引用和逃逸,因此錯誤訊息是單行的。此處顯示的文字僅為了可讀性而被包裹在兩行中。
當錯誤中的套件或類別名稱非常長時,訊息中的中間多餘部分將從訊息中省略。從這個版本開始,錯誤訊息將僅顯示套件或類別名稱的前128個字元和後128個字元。例如
$ perl -le'("Foo" x 1000)->new()'
將輸出以下一行
Can't locate object method "new" via package "FooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFo"..."oFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFoo" (perhaps you forgot to load
"FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFo"...
"oFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo"?)
at -e line 1.
請注意,在此情況下,套件名稱的形式是 "前綴"..."後綴"
。在perl的先前版本中,將顯示完整的字串,使得錯誤訊息超過6k長,而且錯誤訊息的長度沒有上限。如果意外使用1MB字串作為類別名稱,那麼錯誤訊息將超過2MB長。在這個perl中,考慮到省略和逃逸,上限應該大約是2k。
移除了複雜的正規子表達式遞迴限制(%d)超過
正規表達式引擎已經有一段時間沒有使用遞迴。這個警告已經不再有意義。
參見[GH #19636]。
以前產生帶有主要警告訊息下方和其“位置數據”之後的帶括號提示的各種警告已更改為將提示內嵌到主訊息中。例如
Bareword found where operator expected at -e line 1, near "foo bar"
(Do you need to predeclare foo?)
現在將會看起來像這樣,但作為一行
Bareword found where operator expected (Do you need to predeclare
foo?) at -e line 1, near "foo bar"
因此,此類警告將不再觸發$SIG{__WARN__}
兩次,並且在啟用致命警告時,提示將可見。
當require
或use
語句失敗時產生的錯誤消息已更改。它以前包含字詞@INC contains:
,並顯示require
完成並失敗後的@INC
狀態。錯誤消息已更改為顯示@INC entries checked:
,並反映require
語句期間執行的實際目錄或鉤子。例如
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC contains:) at (eval 1) line 1.
將更改為(為了清晰起見省略了一些輸出)
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC entries checked:
.../site_perl/5.38.0/x86_64-linux .../site_perl/5.38.0
.../5.38.0/x86_64-linux .../5.38.0 CODE(0x562745e684b8))
at (eval 1) line 1.
因此顯示實際檢查的目錄。在錯誤消息中檢查@INC contains:
的代碼應對@INC
和:
之間的任何未來措辭變化進行強化,例如在測試中使用qr/\@INC[ \w]+:/
而不是使用qr/\@INC contains:/
或qr/\@INC entries checked:/
,因為這將確保前向和後向兼容性。
此診斷現在也是deprecated
類別的一部分。
given is deprecated取代given is experimental
。
when is deprecated取代when is experimental
。
Smartmatch is deprecated取代Smartmatch is experimental
。
make -j6 minitest
可能因主要製作過程和子製作過程之間在構建$(MINIPERL_EXE)
時出現衝突而失敗。[GH #19829]
當主機名未設置時,正確填充Dragonfly BSD的osvers。
糾正C99宏名稱PRIX64
的拼寫錯誤。
刪除古老且已損壞的VMS支持的GCC。
刪除對/VAXC
修飾詞的痕跡參考。
在VMS上刪除sharedperl選項。
VMS現在有mkostemp。
Configure
現在正確處理gcc輸出的引號元素。[GH #20606]
Configure
通過測試那些函數的聲明是否與實現產生函數類型不匹配,來探測malloc()和free()的返回類型。在Solaris上,使用C++編譯器,這個檢查總是失敗的,因為Solaris會從std::
中使用using
將malloc()和free()引入C++構建。由於malloc()和free()的返回類型已在C標準中明確定義,因此跳過對它們的探測。在不太可能需要的情況下,Configure
命令行參數和提示仍然可以覆蓋這些類型。[GH #20806]
測試已新增和修改,以反映此版本中的其他新增和更改。此外,還進行了這些重大更改
已新增 Unicode 正規化測試。
t/test.pl:新增取消看門狗計時器的功能
已移除 DEC Ultrix 的支援程式碼。Ultrix 是數個 Digital Equipment Corporation 機器的原生類 Unix 作業系統。其最後版本發行於 1995 年。
跳過測試以解決 setproctitle()
中的明顯錯誤。[GH #19894]
FreeBSD 不再使用線程安全的區域設置操作,以避免 FreeBSD 中的錯誤
用 uname -p
取代 archname 的第一部分。[GH #19791]
避免 NetBSD/Solaris 中 regexec.c 和 regcomp.c 的一些編譯器和編譯問題。
為 DSM 7 更新 Synology 自述文件。
從 vmem.h 修正 gcc-12 所需的 win32 記憶體對齊。
如果在 Win32 上將 utimes()
失敗地轉換提供的 time_t
為 FILETIME
,則會將消息打印到 stderr。[GH #19668]
在某些情況下,由 stat() 和 lstat() 返回的時間戳未考慮夏令時。[GH #20018] [GH #20061]
stat()
現在在 AF_UNIX
套接字文件上運作。[GH #20204]
readlink()
現在返回符號鏈接重解析點的 PrintName
,而不是 SubstituteName
,這應該使其更符合創建鏈接的名稱。[GH #20271]
在 Windows 上,lstat()
現在將連結目標的長度作為文件大小返回,就像在 POSIX 系統上一樣。[GH #20476]
在 Windows 上,symlink()
現在將目標中的任何 /
替換為 \
,因為 Windows 不識別符號鏈接中的 /
。 readlink() 不進行相反的轉換。[GH #20506]
當目標是絕對路徑到目錄時,symlink() 會錯誤地建立為檔案符號連結。 [GH #20533]
POSIX::dup2
現在不再建立壞掉的套接字。 [GH #20920]
關閉忙碌的管道可能導致 Perl 掛起。 [GH #19963]
移除了許多已棄用的 C 函數。
這些已經被棄用很長時間了。請參閱https://github.com/perl/perl5/commit/7008caa915ad99e650acf2aea40612b5e48b7ba2以獲得完整清單。
get_op_descs
、get_op_names
、get_opargs
、get_no_modify
和 get_ppaddr
已被標記為已棄用。
hv_free_ent
已被標記為內部 API。
save_pushptr
、save_pushptrptr
和 save_pushi32ptr
已被標記為內部 API。
新增了與 5.36 中引入的新 bool 類型相匹配的新布爾相關函數和宏。
這些函數是
newSVbool(const bool bool_val)
newSV_true()
newSV_false()
sv_set_true(SV *sv)
sv_set_false(SV *sv)
sv_set_bool(SV *sv, const bool bool_val)
這些宏是
Perl 不再直接操縱 environ
陣列。 變數 PL_use_safe_putenv
已被移除,PERL_USE_SAFE_PUTENV
總是被定義。 這意味著 XS 模塊現在可以調用 setenv
和 putenv
而不會導致段錯誤。 [perl #19399]
內部 C API 函數現在在支援它的平台上隱藏了 __attribute__((hidden))
。 這意味著它們在這些平台上不再可從 XS 模塊調用。
應當注意,這些函數在 Windows 上一直都被隱藏。 這個變更只是將其帶到其他平台上。 [perl #19655
新增了用於打印聲明為U32
或I32
的值的新格式符號
這些符號的使用方式與已經存在的類似符號,例如IVdf
相同。參見perlapi 中的 "I/O Formats"。
新增 'HvHasAUX' 宏
regexec.c: 添加一些分支預測重排條件
locale: 更改宏名以符合 C 標準
將PADNAMEt_*
常數重命名為PADNAMEf_*
將檢索 PV 的所有 API 宏更改為調用內聯函數,以便僅評估一次參數。
regexec.c: 多處代碼重構以使代碼更易讀
perl.h: 更改宏名以符合 C 標準(從 NOT_IN_NUMERIC 宏中刪除前導 _)
regcomp.h: 除了現有的BITMAP_BYTE
和BITMAP_TEST
外,添加新的BITMAP_BIT
宏。
創建新的 regnode 類型 ANYOFH。將 populate_ANYOF_from_invlist 重命名為 populate_bitmap_from_invlist
正則表達式:重構 qr/[]/ 的位圖與非位圖
regcomp.c: 添加新函數以將反向列表轉換為位圖(反之亦然)populate_bitmap_from_invlist
和populate_invlist_from_bitmap
。
添加newAVav()
以從現有的 AV 創建 AV。添加newAVhv()
以使用現有 HV 中的鍵和值創建 AV。
修復Perl_atof
的定義。
修復與regcomp.c
中的OPTIMIZE_INFTY
和 delta 相關的溢出的未定義行為。
修復regcomp.h
中的 regnode 指針對齊問題。
CVf_METHOD
CV 標誌及相關的CvMETHOD
宏已更名為CVf_NOWARN_AMBIGUOUS
和CvNOWARN_AMBIGUOUS
。這更接近其實際行為(它抑制了否則將生成的有關模糊名稱的警告),以便與CvIsMETHOD
不至於混淆,後者指示 CV 是與class
功能相關的method
子例程。
OPf_SPECIAL
標誌不再設置在構造用於調用use
語句和屬性應用的VERSION
、import
和unimport
方法的OP_ENTERSUB
op,也不在分配給:lvalue
子例程時設置。
新增了一個 CV 標誌 CVf_REFCOUNTED_ANYSV
,表示 CV 是一個 XSUB,並在 CvXSUBANY.any_sv
聯合字段中存儲了一個 SV 指針。Perl 核心操作,如克隆或銷毀 CV,將維護指向的 SV 的引用計數,在需要時銷毀它。
新增了一個 API 函數 "Perl_localeconv
" 在 perlapi 中。這與 POSIX::localeconv
相同(返回 localeconv()
字段的哈希),但可以直接從 XS 代碼中調用。
新增了一個 API 函數,"Perl_langinfo8
" 在 perlapi 中。這與普通的 "Perl_langinfo
" 在 perlapi 相同,但具有一個額外的參數,允許調用者簡單而可靠地知道返回的字符串是否為 UTF-8。
我們引入了對嵌套 eval EXPR
/BEGIN
塊和 require
/BEGIN
(以及 use
語句)數量的限制,以防止 C 堆棧溢出。此變量還可用於禁止在 eval EXPR
編譯期間執行 BEGIN
塊。該限制默認為 1000
,但可以通過設置 ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
變量來覆蓋。默認本身可以在編譯時更改。
-Accflags='-DPERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT=12345'
請注意,此值與您的 C 堆棧大小有關,如果您選擇了不適當大的值,Perl 可能會段錯誤,請在選擇時保守。
新增了一個魔術類型 PERL_MAGIC_extvalue
。這可用於像 PERL_MAGIC_ext
一樣使用,但是是一個值魔術:在本地化時,新值將不再是魔術的。
現在,SSNEW()
、SSNEWt()
、SSNEWa()
和 SSNEWat()
API 現在返回一個 SSize_t
值。SSPTR()
和 SSPTRt()
宏現在期望一個 SSize_t
參數,並在調試構建上強制執行。[GH #20411]
在線程中,cops 中的文件名現在是引用計數的。在線程下,我們將文件名複製到每個操作碼中。這是因為理論上,在一個線程中創建的操作碼可以在另一個線程中銷毀。該更改添加了一個新的結構/類型 RCPV
,它是一個使用共享內存的引用計數字符串。這是以這樣一種方式實現的,即先前使用 char * 的代碼可以繼續使用,因為引用計數數據位於 char * 指針本身的特定偏移量之前。
新增了 HvNAMEf
和 HvNAMEf_QUOTEDPREFIX
特殊格式。它們以一個 HV *
作為參數,並使用 HvNAME()
和相關的宏來確定字符串、它的長度和是否是 utf8。
實現長期不推薦使用的 GIMME
宏的底層 Perl_dowantarray
函數已被標記為不推薦使用,因此使用該宏會發出編譯時警告。GIMME
自 Perl v5.6.0 起就已被記錄為不推薦使用,但以前未發出警告。
API函式"utf8_length"在perlapi現在更有效率。
新增SAVERCPV()
和SAVEFREERCPV()
,以更好地支援RCPV
(引用計數字串/指標值)結構,目前在操作碼中使用以記憶體有效方式分享檔名和警告位資料。
新增MORTALSVFUNC_SV()
和MORTALDESTRUCTOR_SV()
巨集,可讓您建立一個在目前陳述結束時觸發的解構函式。這使用PERL_MAGIC_destruct
魔法使用“free”魔法來在釋放變數時觸發動作。動作可以指定為C函式或Perl程式碼參考。
新增%{^HOOK}
API和相關PERL_MAGIC_hook
和PERL_MAGIC_hookelem
,提供一種方式來掛鉤選定的perl函式,這些函式因某種原因而不易用自訂子程序包裝。
新增支援${^HOOK}{require__before}
,可用於重寫require
將嘗試載入的檔名,並阻止require
載入特定模組,甚至通過完全限定的檔名。掛鉤還可用於執行“前置require”和“後置require”操作。
新增支援${^HOOK}{require__after}
,可用於跟蹤事後已經被要求的模組。
正規表達式操作碼(regops)現在使用標準化的結構布局,使用聯合來公開不同格式的資料。這意味著擴展或修改regops以使用更多記憶體應該更容易。消耗這種方式使許多regops跟蹤它們包含多少對括號。
避免遞迴和堆疊溢位解析'pack'範本
在正規表達式程式碼塊中,eval()作為最後一個陳述可能會觸發解譯器恐慌;例如
/(?{ ...; eval {....}; })/
禁用bareword_filehandles
功能不再將print Class->method
視為錯誤。[GH #19704]
當Perl子例程尾呼叫XS子例程使用goto &xs_sub
時,XS子例程現在可以正確確定其呼叫上下文。以前總是報告為純量。
此外,當Perl子例程同時被釋放時
sub foo { *foo = sub {}; goto &xs_sub }
以前如果XS子例程嘗試使用PL_op
的值,這可能會導致崩潰,因為這會被設置為NULL。現在這已經修復了。
setsockopt()現在使用在5.36中添加的機制更好地區分作為OPTVAL
參數提供的數值和字串值。[GH #18761]
4參數select()
現在拒絕具有超出255的碼點的字串。此外,對於128-255的碼點,此運算符現在將始終給出對應的八位組給OS,無論Perl如何在記憶體中存儲此類碼點。 (以前Perl將其內部字串存儲洩漏給OS。)[GH #19882]
修復了val {} inside /(?{...})/
引起的恐慌問題[GH #19390]
修復了從regexp.c,locale.c中的多個編譯器警告[GH #19915]
修復了在
在S_maybe_multideref()
中預防未定義的行為。
避免use integer
操作中的有符號整數溢位。
在hv_delete_common
中避免將偏移量添加到NULL指針。
PerlIO::get_layers
現在也將接受IO引用。
以前它只會接受glob引用或glob的名稱。現在它也將接受IO引用。
修復PL_splitstr
的內存處理問題。
如果創建了一個線程,分配的字符串將被兩次釋放。
如果提供了兩個-F
開關,第一個開關分配的內存將不會被釋放。
在傳播lvalue上下文時,正確處理由CPAN模塊生成的沒有包括OPf_REF標誌的OP_ANONCODE
操作碼。[GH #20532]
POSIX::strxfrm現在使用LC_CTYPE
區域設定類別來指定其排序,忽略任何不同的LC_COLLATE
。將一個字符串編碼為一個區域設定(例如ISO-8859-6,阿拉伯文),並根據另一個區域設定(如ISO-8859-7,希臘文)排序是沒有意義的。Perl假設當前的LC_CTYPE
區域設定正確地表示了編碼,並相應地進行排序。
此外,現在允許在輸入中嵌入NUL
字符。
如果平台上未啟用區域設定排序(LC_COLLATE
),則返回未更改的輸入。
修正了返回過載對象的連接標量串行化期間的雙重FETCH。FETCH方法應該只調用一次,但在此版本之前實際上調用了兩次。[GH #20574]
如果IO對象已從所選的輸出處理程序中清除,則將寫入與所選輸出處理程序關聯的魔法變量$^
、$~
、$=
、$-
和$%
,perl不再崩潰。[GH #20733]
現在,用use constant
重新定義use constant
列表常量將正確發出警告。這改變了use constant
的行為,但這是一個核心更改,不是對constant.pm的更改。[GH #20742]
用空原型常量子重新定義use constant
列表常量將導致斷言失敗。[GH #20742]
修復了一個回歸,其中在 5.36 版本中,@INC
中對象的 INC
方法將不會被 AUTOLOAD
解析,而它現在已經可以被解析了。對於 @INC
中對象的 INCDIR
方法,由於 INC
將首先被解析,因此無法被 AUTOLOAD
解析。[GH #20665]
無論編譯過程中的代碼如何死亡,現在都將從 eval 中調用 $SIG{__DIE__}
,這意味著期望將 $@
升級為對象的代碼將始終被調用。在較早版本的 perl 中,對於某些編譯錯誤,$SIG{__DIE__}
將不會被調用,例如未聲明的變量。對於其他錯誤,如果錯誤數量超過一定數量,則可能會被調用,但如果錯誤數量少於一定數量,則不會。現在您可以預期它將在任何情況下都會被調用。
有錯誤的代碼編譯過程曾經會不一致地停止,具體取決於遇到的錯誤計數和類型。本意是在發生 10 次錯誤後停止編譯,但是這個邏輯中的錯誤意味著某些類型的錯誤將被計算,但不會觸發停止編譯的閾值檢查。其他錯誤則會。通過此版本,編譯將在最多 10 次錯誤後終止,無論錯誤類型如何。
請注意,您可以在配置過程中通過定義 PERL_STOP_PARSING_AFTER_N_ERRORS
來更改最大計數為其他值。例如
./Configure ... -Accflags='-DPERL_STOP_PARSING_AFTER_N_ERRORS=100'
將允許最多 100 次錯誤。
API 函數 "perlapi 中的 "my_snprintf" 現在將打印非點十進制小數點,如果 perl 代碼最終呼叫它處於 use locale
範圍並且有效的地域設置需要它。
已經修復了與正則表達式中的定量組中的捕獲組相關的一些錯誤,特別是在交替中。例如,在一個模式中,像
"foobazfoobar" =~ /((foo)baz|foo(bar))+/
regex 變量 $2
不再是以前的 "foo",而是未定義。
已經修復了位於捕獲組內部的正則表達式反向參考運算符的錯誤。例如
"xa=xaaa" =~ /^(xa|=?\1a){2}\z/
現在將正確不匹配。[GH #10073]
SSGROW()
和 SSCHECK()
已經重新設計,以確保實際分配所需的空間。SSCHECK()
現在是 SSGROW()
的別名。
Perl 5.38.0代表自Perl 5.36.0以來大約12個月的開發,包含了來自100位作者的大約290,000行變更,涵蓋了大約1,500個文件。
在排除自動生成的文件、文檔和發行工具後,大約有190,000行的變更涉及到970個 .pm、.t、.c 和 .h 文件。
由於一個充滿活力的使用者和開發者社區,Perl在其第四個十年繼續蓬勃發展。以下這些人被認為對成為Perl 5.38.0的改進作出了貢獻。
Alex、Alexander Nikolov、Alex Davies、Andreas König、Andrew Fresh、Andrew Ruthven、Andy Lester、Aristotle Pagaltzis、Arne Johannessen、A. Sinan Unur、Bartosz Jarzyna、Bart Van Assche、Benjamin Smith、Bram、Branislav Zahradník、Brian Greenfield、Bruce Gray、Chad Granum、Chris 'BinGOs' Williams、chromatic、Clemens Wasser、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Book、danielnachun、Dan Jacobson、Dan Kogai、David Cantrell、David Golden、David Mitchell、E. Choroba、Ed J、Ed Sabol、Elvin Aslanov、Eric Herman、Felipe Gasper、Ferenc Erki、Firas Khalil Khana、Florian Weimer、Graham Knop、Håkon Hægland、Harald Jörg、H.Merijn Brand、Hugo van der Sanden、James E Keenan、James Raspass、jkahrman、Joe McMahon、Johan Vromans、Jonathan Stowe、Jon Gentle、Karen Etheridge、Karl Williamson、Kenichi Ishigaki、Kenneth Ölwing、Kurt Fitzner、Leon Timmermans、Li Linjie、Loren Merritt、Lukas Mai、Marcel Telka、Mark Jason Dominus、Mark Shelor、Matthew Horsfall、Matthew O. Persico、Mattia Barbon、Max Maischein、Mohammad S Anwar、Nathan Mills、Neil Bowers、Nicholas Clark、Nicolas Mendoza、Nicolas R、Paul Evans、Paul Marquess、Peter John Acklam、Peter Levine、Philippe Bruhat (BooK)、Reini Urban、Renee Baecker、Ricardo Signes、Richard Leach、Russ Allbery、Scott Baker、Sevan Janiyan、Sidney Markowitz、Sisyphus、Steve Hay、TAKAI Kousuke、Todd Rinaldo、Tomasz Konojacki、Tom Stellard、Tony Cook、Tsuyoshi Watanabe、Unicode Consortium、vsfos、Yves Orton、Zakariyya Mughal、Zefram、小鸡。
上面的列表幾乎肯定是不完整的,因為它是從版本控制歷史自動生成的。特別是,它不包括向Perl錯誤跟踪器報告問題的(非常感激)貢獻者的名字。
在這個版本中包含的許多變更源於Perl核心中包含的CPAN模塊。我們感謝整個CPAN社區幫助Perl蓬勃發展。
有關Perl所有歷史貢獻者的更完整列表,請參見Perl源代碼分發中的AUTHORS文件。
如果您發現了您認為是一個bug,您可以查看Perl bug數據庫,網址為https://github.com/Perl/perl5/issues。您也可以在Perl官方網站http://www.perl.org/上找到相關信息。
如果您認為您發現了一個未報告的bug,請在https://github.com/Perl/perl5/issues上開啟一個問題。請確保將您的bug縮減為一個足夠小的測試案例。
如果您要報告的bug具有安全影響,使其無法發送到公共問題跟踪器,那麼請參見perlsec中的“安全漏洞聯繫信息”以獲取詳細信息。
如果您希望感謝 Perl 5 Porters 在 Perl 5 中所做的工作,您可以運行 perlthanks
程式
perlthanks
這將向 Perl 5 Porters 列表發送一封電子郵件,表達您的感謝之意。
關於如何查看變更的詳細信息,請參閱 Changes 文件。
有關如何構建 Perl 的信息,請參閱 INSTALL 文件。
有關一般信息,請參閱 README 文件。
版權信息,請參閱 Artistic 和 Copying 文件。