perl5240delta - perl v5.24.0 的新增功能
此文件說明 5.22.0 版本和 5.24.0 版本之間的差異。
使用 postderef
和 postderef_qq
功能不再會產生警告。先前停用 experimental::postderef
警告類別的現有程式碼將會繼續運作。postderef
功能沒有作用;所有 Perl 程式碼都可以使用後綴式解參考,不論範圍內有哪些功能宣告。5.24
功能套件現在包含 postderef_qq
功能。
有關此版本內容的詳細資訊,請參閱 http://www.unicode.org/versions/Unicode8.0.0/。
到目前為止,系統並未偵測到無法關閉就地編輯的輸出檔案,這表示輸入檔案可能會在編輯未成功完成的情況下遭到破壞。現在,如果無法成功關閉輸出檔案,系統會引發例外狀況。
\b{lb}
界線lb
代表換行符號。這是一個 Unicode 屬性,用於判斷文字列在哪裡適合換行(通常是為了讓文字列輸出時不會超出可用的水平空間)。Unicode::LineBreak 模組很早就提供這個功能,但現在核心 Perl 中有一個輕量級、不可自訂的版本,適用於許多目的。
qr/(?[ ])/
現在可以在 UTF-8 地區設定中運作延伸方括號字元類別現在會在 use locale
生效時成功編譯。編譯後的模式會使用標準 Unicode 規則。如果執行時期的地區設定不是 UTF-8,系統會引發警告,並仍使用標準 Unicode 規則。由於結果實際上並不依賴於地區設定,因此不會發生污染。
<<
和 >>
) 現在有更明確的定義負位移是反向位移:左位移變為右位移,而右位移變為左位移。
以原生整數中的位元數(或更多)進行位移為零,但當「過度位移」在「使用整數」下右位移負值時除外,這種情況下結果為 -1(算術位移)。
到目前為止,負位移和過度位移尚未定義,因為它們依賴於 C 實作所執行的任何操作。例如,對於過度位移,常見的 C 行為是「模數位移」
1 >> 64 == 1 >> (64 % 64) == 1 >> 0 == 1 # Common C behavior.
# And the same for <<, while Perl now produces 0 for both.
現在,這些行為在 Perl 中已明確定義,無論底層 C 實作如何。但是,請注意,您仍然受到原生整數寬度的限制:您需要知道可以向左移動多遠。例如,您可以使用
use Config;
my $wordbits = $Config{uvsize} * 8; # Or $Config{uvsize} << 3.
如果您需要在左位移上使用更多位元,則可以使用例如 bigint
pragma 或 CPAN 中的 Bit::Vector
模組。
也就是說,sprintf '|%.*2$d|', 2, 3
現在傳回 |002|
。這擴充了現有的重新排序機制(允許對用作格式欄位、寬度和向量分隔符的引數重新排序)。
SA_SIGINFO
提供給 sigaction
回呼的更多欄位將 SA_SIGINFO
旗標傳遞給 sigaction 時,errno
、status
、uid
、pid
、addr
和 band
欄位現在包含在傳遞給處理常式的雜湊中(如果平台支援的話)。
以前,perl 會將雜湊符號路徑重新導向到另一個直譯器,除非路徑包含「perl」(請參閱 perlrun)。為了改善與 Perl 6 的相容性,此行為已延伸到「perl」後面接著「6」時也會重新導向。
mkstemp(3)
之前設定適當的 umask在 5.22 中,perl 開始在呼叫 mkstemp(3)
之前將 umask 設定為 0600,然後再將其還原。這錯誤地告訴 open(2)
在套用給定的模式之前,從該模式中移除所有者讀取和寫入位元,而不是預期的僅保留這些位元的否定。
在 mkstemp(3)
中使用模式 0666 的系統(例如舊版本的 glibc)會建立一個權限為 0066 的檔案,讓世界讀取和寫入權限不受當前 umask 影響。
這已透過改用 umask 0177 修復。[perl #127322]
這是 CVE-2015-8608。如需更多資訊,請參閱 [GH #15067]
這是 CVE-2015-8607。如需更多資訊,請參閱 [GH #15084]
crypt()
中存取未初始化的記憶體新增驗證,將偵測到 salt 中的短 salt 和無效字元。 [GH #15091]
environ
中移除重複的環境變數先前,如果環境變數在 environ[]
中出現超過一次,%ENV
會包含該名稱的最後一個項目,而典型的 getenv()
會傳回第一個項目。我們現在確保 %ENV
包含與 getenv
傳回相同的內容。
其次,我們從 environ[]
中移除重複項目,因此如果在 %ENV
中設定具有該名稱的設定,我們不會傳遞不安全的數值給子程序。
[CVE-2016-2381]
autoderef
功能已移除實驗性的 autoderef
功能(允許在標量引數上呼叫 push
、pop
、shift
、unshift
、splice
、keys
、values
和 each
)已被視為不成功。它現已移除;嘗試使用該功能(或停用它先前觸發的 experimental::autoderef
警告)現在會產生例外狀況。
my $_
在 Perl 5.10 中引入,隨後造成許多混淆,沒有明顯的解決方案。在 Perl 5.18.0 中,它被設定為實驗性的,理論上它將會被移除或以較不混淆(但向後不兼容)的方式重新設計。在接下來的幾年中,沒有提出任何替代方案。該功能現已移除,且無法編譯。
qr/\b{wb}/
現在已根據 Perl 期望進行調整這現在更適合作為純粹 \b
的插入替換,但對於解析自然語言有更好的結果。先前,它嚴格遵循目前的 Unicode 規則,要求它與每個空白字元相符。現在,它通常不與空白範圍內相符,行為就像 \b
一樣。請參閱 perlrebackslash 中的「\b{wb}」
一些在執行階段發生錯誤的正規表示式模式現在根本無法編譯。
現在,使用 \p{}
和 \P{}
正規表示式模式建構的所有 Unicode 屬性幾乎都在模式編譯階段檢查其有效性,而無效的屬性將導致程式無法編譯。在早期版本中,此檢查通常會延後到執行階段。每當錯誤檢查從執行階段移至編譯階段時,錯誤程式碼就會 100% 被捕獲,而之前只有在實際執行有問題的部分時才會被捕獲,對於無法到達的程式碼來說,可能永遠不會被捕獲。
use re "strict"
下不允許使用 qr/\N{}/
一個空的 \N{}
沒有意義,但為了向後相容性,它被接受為不執行任何操作,儘管預設會提出不建議使用的警告。但現在,這在 re 中的實驗性功能「「嚴格」模式」下是一個致命錯誤。
my
、our
或 state
宣告不再允許在其他 my
、our
或 state
宣告內部。
例如,以下現已為致命錯誤
my ($x, my($y));
our (my $x);
/\C/
字元類別已移除。此正規表示式字元類別已在 v5.20.0 中標示為不建議使用,並自 v5.22.0 起產生不建議使用警告。它現在是編譯時期錯誤。如果您需要檢查組成 UTF8 編碼字元的個別位元組,請先對字串(或副本)使用 utf8::encode()
。
chdir('')
不再 chdirs home自 perl v5.8 起,使用 chdir('')
或 chdir(undef)
來 chdir home 已標示為不建議使用,現在將會失敗。請改用 chdir()
。
在 ASCII 平台上,變數名稱包含非圖形 ASCII 控制字元(序數 0 到 31,以及 127,也就是 C0 控制字元和 DELETE
)一直是合法的。此用法已於 v5.20 版中棄用,而且現在會導致語法錯誤。這些名稱所指的變數很特別,Perl 保留這些變數,供其現在或未來使用。每個此類變數都有另一種拼寫方式。除了單一非圖形控制字元之外,還會使用以插入符號開頭的兩個字元序列,例如 $^]
和 ${^GLOBAL_PHASE}
。詳情請參閱 perlvar。在未使用 use utf8
的情況下,在變數名稱中使用某些非圖形非 ASCII 字元仍然合法,但不明智且已棄用(會產生棄用警告)。不應有任何程式碼執行此操作,因為所有此類變數都已由 Perl 保留,而且 Perl 目前並未定義任何變數(但可能隨時在未通知的情況下定義)。
$Carp::MaxArgNums
中的 off by one 問題$Carp::MaxArgNums
應為要顯示的引數數量。在此版本之前,它會顯示 $Carp::MaxArgNums
+ 1 個引數,這與文件說明不符。
(?[...])
內的 [...]
內使用空白和 tab。實驗性的擴充方括號字元類別可以在其中包含常規方括號字元類別。它們與常規類別的不同之處在於,通常會忽略空白,除非在空白前面加上反斜線作為跳脫字元。現在,被忽略的空白僅限於 tab \t
和 SPACE 字元。以前,它會忽略任何空白。請參閱 "perlrecharclass 中的「擴充方括號字元類別」"。
IV_MAX
以上的代碼點Unicode 定義範圍在 0..0x10FFFF
中的代碼點。某些標準曾經將它們定義為最高 2**31 - 1,但 Perl 允許它們高到與所使用平台上的字元一樣高。但是,在某些結構中,使用平台 IV_MAX
以上的代碼點會中斷,特別是 tr///
、涉及量詞的正規表示式模式,以及某些算術和比較運算,例如作為迴圈的上限。現在,使用此類代碼點會產生不建議使用的功能警告,除非關閉該警告類別。在 32 位元平台上,IV_MAX
通常為 2**31 -1,在 64 位元平台上則為 2**63-1。
字串位元運算子將其運算元視為位元組字串,而在此上下文中,0xFF 以上的值沒有意義。若要對編碼位元組執行運算,請先對字串進行編碼。若要對代碼點的數值執行運算,請使用 split
和 map ord
。未來,此警告將被例外狀況取代。
sysread()
、syswrite()
、recv()
和 send()
在明確或隱含具有 :utf8
層的句柄上,sysread()
、recv()
、syswrite()
和 send()
算子已棄用,例如,使用 :encoding(UTF-16LE)
層。
目前 sysread()
和 recv()
都只使用串流的 :utf8
標記,忽略實際的層。由於 sysread()
和 recv()
沒有進行 UTF-8 驗證,因此可能會產生編碼無效的純量。
類似地,syswrite()
和 send()
也只使用 :utf8
標記,否則會忽略任何層。如果設定標記,則兩者都會寫入 UTF-8 編碼的值,即使該層是其他編碼,例如上述範例。
理想情況下,所有這些算子都應該完全忽略 :utf8
狀態,只使用位元組,但這會導致靜默中斷現有程式碼。為避免這種情況,未來版本的 perl 將在 sysread()
、recv()
、syswrite()
或 send()
在具有 :utf8
層的句柄上呼叫時擲回例外。
範圍進入和離開的開銷已大幅減少,因此例如子常式呼叫、迴圈和基本區塊現在都更快了。此空函式呼叫現在執行時間減少了約三分之一
sub f{} f();
許多語言,例如中文,是不區分大小寫的。Perl 現在知道大多數常見的語言,並且當程式嘗試在其中變更大小寫(例如 ucfirst()
)或不區分大小寫地比對(qr//i
)時,會略過大部分工作。這將加速程式,例如可以在多種語言上運作的網路伺服器,而它在不區分大小寫的語言上運作時。
/fixed-substr/
已大幅提升速度。
在 libc memchr()
實作充分利用底層硬體支援的平台上,包含固定子字串的模式現在通常會快很多;例如在最近的 x86_64 CPU 上使用 glibc,這
$s = "a" x 1000 . "wxyz";
$s =~ /wxyz/ for 1..30000
現在快了約 7 倍。在 memchr()
較慢的系統上,例如 32 位元 ARM Raspberry Pi,速度會小幅提升或幾乎沒有提升。相反地,某些異常情況,例如 "ab" x 1000 =~ /aa/
現在會變慢;在 rPi 上慢了 3 倍,在 x86_64 上慢了 1.5 倍。
加法、減法和乘法更快。
自 5.8.0 以來,由於需要支援 64 位元整數,算術運算變慢了。為了處理 64 位元整數,需要檢查更多邊界情況,這會增加時間。我們現在會偵測不需要檢查這些邊界情況的常見情況,並對它們進行特殊處理。
透過將處理多個情況的函式內部分割成不同的函式,使前置遞增、前置遞減、後置遞增和後置遞減變得更快。
已移除 XSUB 和 const 子常式的 Perl 除錯器資料結構 (請參閱 perldebguts 中的「除錯器內部」)。這會為每個 XSUB 和 const 子常式來自的獨特 .c
檔案移除一個 glob/scalar 組合。在啟動時 (perl -e"0"
),大約會建立六個 glob/scalar 除錯器組合。載入 XS 模組會建立更多 glob/scalar 組合。這些項目會在不論 Perl 除錯器是否正在使用的情況下建立,而且儘管它無法除錯 C 程式碼
在 Win32 上,如果檔案或目錄不存在,則 stat
或 -X
路徑現在比以前快 3.5 倍。
現在,清單指定中的單一引數會快一些
($x) = (...);
(...) = ($x);
編譯正規表示式模式時現在使用的峰值記憶體較少。
arybase 已從版本 0.10 升級至 0.11。
Attribute::Handlers 已從版本 0.97 升級至 0.99。
autodie 已從版本 2.26 升級至 2.29。
autouse 已從版本 1.08 升級至 1.11。
B 已從版本 1.58 升級至 1.62。
B::Deparse 已從版本 1.35 升級至 1.37。
base 已從版本 2.22 升級至 2.23。
Benchmark 已從版本 1.2 升級至 1.22。
bignum 已從版本 0.39 升級至 0.42。
bytes 已從版本 1.04 升級至 1.05。
Carp 已從版本 1.36 升級至 1.40。
Compress::Raw::Bzip2 已從版本 2.068 升級至 2.069。
Compress::Raw::Zlib 已從版本 2.068 升級至 2.069。
Config::Perl::V 已從版本 0.24 升級至 0.25。
CPAN::Meta 已從版本 2.150001 升級至 2.150005。
CPAN::Meta::Requirements 已從版本 2.132 升級至 2.140。
CPAN::Meta::YAML 已從版本 0.012 升級至 0.018。
Data::Dumper 已從版本 2.158 升級至 2.160。
Devel::Peek 已從版本 1.22 升級至 1.23。
Devel::PPPort 已從版本 3.31 升級至 3.32。
Dumpvalue 已從版本 1.17 升級至 1.18。
DynaLoader 已從版本 1.32 升級至 1.38。
Encode 已從版本 2.72 升級至 2.80。
encoding 已從版本 2.14 升級至 2.17。
encoding::warnings 已從版本 0.11 升級至 0.12。
English 已從版本 1.09 升級至 1.10。
Errno 已從版本 1.23 升級至 1.25。
experimental 已從版本 0.013 升級至 0.016。
ExtUtils::CBuilder 已從版本 0.280221 升級至 0.280225。
ExtUtils::Embed 已從版本 1.32 升級至 1.33。
ExtUtils::MakeMaker 已從版本 7.04_01 升級至 7.10_01。
ExtUtils::ParseXS 已從版本 3.28 升級至 3.31。
ExtUtils::Typemaps 已從版本 3.28 升級至 3.31。
feature 已從版本 1.40 升級至 1.42。
fields 已從版本 2.17 升級至 2.23。
File::Find 已從版本 1.29 升級至 1.34。
File::Glob 已從版本 1.24 升級至 1.26。
File::Path 已從版本 2.09 升級至 2.12_01。
File::Spec 已從版本 3.56 升級至 3.63。
Filter::Util::Call 已從版本 1.54 升級至 1.55。
Getopt::Long 已從版本 2.45 升級至 2.48。
Hash::Util 已從版本 0.18 升級至 0.19。
Hash::Util::FieldHash 已從版本 1.15 升級至 1.19。
HTTP::Tiny 已從版本 0.054 升級至 0.056。
I18N::Langinfo 已從版本 0.12 升級至 0.13。
if 已從版本 0.0604 升級至 0.0606。
IO 已從版本 1.35 升級至 1.36。
IO-Compress 已從版本 2.068 升級至 2.069。
IPC::Open3 已從版本 1.18 升級至 1.20。
IPC::SysV 已從版本 2.04 升級至 2.06_01。
List::Util 已從版本 1.41 升級至 1.42_02。
locale 已從版本 1.06 升級至 1.08。
Locale::Codes 已從版本 3.34 升級至 3.37。
Math::BigInt 已從版本 1.9997 升級至 1.999715。
Math::BigInt::FastCalc 已從版本 0.31 升級至 0.40。
Math::BigRat 已從版本 0.2608 升級至 0.260802。
Module::CoreList 已從版本 5.20150520 升級至 5.20160320。
Module::Metadata 已從版本 1.000026 升級至 1.000031。
mro 已從版本 1.17 升級至 1.18。
ODBM_File 已從版本 1.12 升級至 1.14。
Opcode 已從版本 1.32 升級至 1.34。
parent 已從版本 0.232 升級至 0.234。
Parse::CPAN::Meta 已從版本 1.4414 升級至 1.4417。
Perl::OSType 已從版本 1.008 升級至 1.009。
perlfaq 已從版本 5.021009 升級至 5.021010。
PerlIO::encoding 已從版本 0.21 升級至 0.24。
PerlIO::mmap 已從版本 0.014 升級至 0.016。
PerlIO::scalar 已從版本 0.22 升級至 0.24。
PerlIO::via 已從版本 0.15 升級至 0.16。
Pod::Functions 已從版本 1.09 升級至 1.10。
Pod::Perldoc 已從版本 3.25 升級至 3.25_02。
Pod::Simple 已從版本 3.29 升級至 3.32。
Pod::Usage 已從版本 1.64 升級至 1.68。
POSIX 已從版本 1.53 升級至 1.65。
Scalar::Util 已從版本 1.41 升級至 1.42_02。
SDBM_File 已從版本 1.13 升級至 1.14。
SelfLoader 已從版本 1.22 升級至 1.23。
Socket 已從版本 2.018 升級至 2.020_03。
Storable 已從版本 2.53 升級至 2.56。
strict 已從版本 1.09 升級至 1.11。
Term::ANSIColor 已從版本 4.03 升級至 4.04。
Term::Cap 已從版本 1.15 升級至 1.17。
Test 已從版本 1.26 升級至 1.28。
Test::Harness 已從版本 3.35 升級至 3.36。
Thread::Queue 已從版本 3.05 升級至 3.08。
threads 已從版本 2.01 升級至 2.06。
threads::shared 已從版本 1.48 升級至 1.50。
Tie::File 已從版本 1.01 升級至 1.02。
Tie::Scalar 已從版本 1.03 升級至 1.04。
Time::HiRes 已從版本 1.9726 升級至 1.9732。
Time::Piece 已從版本 1.29 升級至 1.31。
Unicode::Collate 已從 1.12 版升級至 1.14 版。
Unicode::Normalize 已從 1.18 版升級至 1.25 版。
Unicode::UCD 已從 0.61 版升級至 0.64 版。
UNIVERSAL 已從 1.12 版升級至 1.13 版。
utf8 已從 1.17 版升級至 1.19 版。
version 已從 0.9909 版升級至 0.9916 版。
warnings 已從 1.32 版升級至 1.36 版。
Win32 已從 0.51 版升級至 0.52 版。
Win32API::File 已從 0.1202 版升級至 0.1203 版。
XS::Typemap 已從 0.13 版升級至 0.14 版。
XSLoader 已從 0.20 版升級至 0.21 版。
已記錄使用未記錄全域變數的程序,也就是說,您應先寄電子郵件至 perl5-porters@perl.org,以取得記錄和使用未記錄函數或全域變數的許可。
已對 perlcall 進行多項清理,包括
使用 EXTEND(SP, n)
和 PUSHs()
,而非 XPUSHs()
(若適用),並更新說明文字以符合
將 POPu、POPul 和 POPpbytex 加入「POP 巨集完整清單」,並釐清部分現有條目的文件,以及關於副作用的注意事項
加入 POPu 和 POPul 的 API 文件
更有效率地使用 ERRSV
SV 的執行緒安全儲存方法
已修訂 hex
的文件,以釐清有效的輸入
更清楚說明 waitpid
中負面 PID 的意義。 [GH #15108]
一般清理:現在更一致(在 POD 使用、語法、程式碼範例中),程式碼範例中的最佳實務(使用 my
、移除裸字檔案句柄、呼叫子常式時不再使用 &
等)
已新增一個章節,perlguts 中的「動態範圍和內容堆疊」,說明 perl 內容堆疊如何運作
對在執行緒應用程式中使用區域設定提出更強烈的警告。區域設定並非執行緒安全,如果在其中使用,可能會得到錯誤的結果,甚至會發生區段錯誤
我們現在建議在尋求模組命名建議時,聯絡模組作者清單或 PAUSE
qx//
的文件現在說明 $?
如何受到影響
此註解已新增至 perlpolicy
While civility is required, kindness is encouraged; if you have any
doubt about whether you are being civil, simply ask yourself, "Am I
being kind?" and aspire to that.
修正一些範例以符合 strict 規範。
說明在日文和泰文等語言中,需要進行字典查詢才能判斷字詞邊界。
更新為註明匿名子常式可以有簽章。
修正一個範例,其中在 do/while 範例中的條件式中使用了 =
而不是 ==
。
已說明 FIRSTKEY
和 NEXTKEY
的用法。
建議不要使用「In」作為表示 Unicode 區塊屬性的前綴。
已重新表述 $@
的文件,以說明它不只適用於 eval
中的語法錯誤。 [GH #14572]
已說明 $!{E...}
的特定真值,並註明它可能會變更,且不保證不變。
建議不要再使用 $OLD_PERL_VERSION
。
PROTOTYPES
的文件已修正;它們預設是停用的,而不是啟用的。
已對診斷輸出(包括警告和致命錯誤訊息)進行下列新增或變更。如需完整的診斷訊息清單,請參閱 perldiag。
存取 glob 的 IO
部分,將 FILEHANDLE
改為 IO
不再被棄用。建議統一使用(例如,更容易 grep),但不會移除。 [GH #15105]
診斷 Hexadecimal float: internal error
已變更為 Hexadecimal float: internal error (%s)
,以包含更多資訊。
此錯誤現在會回報您嘗試用作 l 值的非 l 值子常式名稱。
在嘗試增加堆疊大小時記憶體不足時,perl 以前會使用難懂的訊息 panic: av_extend_guts() negative count (-9223372036854775681)
執行 die。此問題已修正,會顯示較為友善的訊息:堆疊延伸期間記憶體不足
Configure
現在會像總是傳遞 -O
選項一樣作用,允許命令列選項覆寫已儲存的組態。當命令列選項未出於明顯原因而被忽略時,這應可消除混淆。-O
現在已允許,但會被忽略。
現在支援 Bison 3.0。
Configure 不再預設探測 libnm。原本這是「新數學」函式庫,但名稱已被 GNOME NetworkManager 重新使用。 [GH #15115]
已新增 Configure 探測,用於 newlocale
、freelocale
和 uselocale
。
PPPort.so/PPPort.dll
不再安裝,因為它們不會被 PPPort.pm
使用,只會被它的測試檔案使用。
現在可以透過設定巨集 PERL_BUILD_DATE
來指定要在 perl -V
輸出中顯示哪個編譯日期。
自 Perl 5.17.10 以來,在與預設雜湊演算法 PERL_HASH_FUNC_ONE_AT_A_TIME_HARD
結合使用 NO_HASH_SEED
定義時,會在編譯直譯器時造成致命錯誤。此問題已修正。
Configure 應可稍稍更妥善地處理路徑中的空白。
不再產生 EBCDIC POSIX-BC 表格。我們不認為目前有人同時使用 Perl 和 POSIX-BC,而且透過不產生這些表格,可以在開發期間節省時間,並讓產生的 tar 檔案變小。
Win32 的 GNU Make makefile 現在支援平行建置。[perl #126632]
現在可以使用 GNU Make 在 Win32 上使用 MSVC++ 建置 perl。[perl #126632]
Win32 miniperl 現在有真正的 getcwd
,可提升建置效能,讓 Win32 miniperl 中的 getcwd()
快上 605 倍。
現在設定會在計算 alignbytes
設定變數時考量 -Dusequadmath
。先前錯誤計算的 alignbytes
可能會造成除錯建置發生對齊錯誤。[perl #127894]
已新增一個新測試 (t/op/aassign.t) 來測試清單指定運算子 OP_AASSIGN
。
已將平行建置新增到 dmake makefile.mk
makefile。支援所有 Win32 編譯器。
AmigaOS 埠已重新整合到主程式碼樹,根據 Perl 5.22.1。
測試對異常的 cygdrive 前置字元更強健。 [GH #15076]
UTF-EBCDIC 類似於 UTF-8,但適用於 EBCDIC 平台。現在已延伸,因此可以在 64 位元字元的平台上表示高達 2 ** 64 - 1 的碼點。這使其與 UTF-8 相等。此增強功能需要對 2 ** 30 至 2 ** 31 -1 範圍內碼點的表示方式進行不相容的變更 (後者是先前可表示的最大碼點)。這表示使用先前版本 perl 寫出的、包含其中一個碼點的檔案,無法在不轉換的情況下,由包含此變更的 perl 讀取。我們不認為有此類檔案存在,但如果您有,請提交票證至 perlbug@perl.org,我們會為您撰寫轉換指令碼。
cmp()
和 sort()
,適用於 UTF-EBCDIC 字串比較兩個編碼為 UTF-8 (或更精確地說,UTF-EBCDIC) 的字串,直到現在都無法正常運作。由於 sort()
使用 cmp()
,這也修正了這個問題。
tr///
和 y///
,適用於 \N{}
和 use utf8
範圍Perl v5.22 引入了可攜式範圍的概念,適用於正規表示式模式。不論在什麼平台上執行,可攜式範圍都會比對同一組字元。這個概念現在延伸到 tr///
。請參閱 tr///
。
在 use utf8
下,這些運算也有一些問題,現在已修正
如果可以使用,請使用 FreeBSD 的 fdclose()
函式。 [GH #15082]
在某些情況下,IRIX stdio fgetc()
和 fread()
會將 errno 設定為 ENOENT
,這根據 IRIX 或 POSIX 文件都沒有道理。在這種情況下,現在會清除 Errno。 [GH #14557]
已修正將長雙精度乘以無限大時出現的問題。 [GH #14993]
到目前為止,perl 的 OS X 建置已指定 10.3(Panther,2003)的連結目標,但未指定編譯器目標。從現在開始,在 OS X 10.6 或更新版本(Snow Leopard,2008)上建置 perl 時,預設會擷取目前的 OS X 版本,並在編譯器和連結器旗標中將其指定為明確的建置目標,從而保留二進位相容性,以便在 OS X、SDK 或編譯器和連結器版本變更後,仍可建置擴充功能。若要覆寫建置中使用的預設值並保留在旗標中,請在設定和建置 perl 之前指定 export MACOSX_DEPLOYMENT_TARGET=10.N
,其中 10.N 是您希望鎖定的 OS X 版本。在 OS X 10.5 或更早版本中,當這些系統為目前版本時,行為並無變更;連結目標仍為 OS X 10.3,且沒有明確的編譯器目標。
在 OS X 上從 Terminal 建置或測試時,同時啟用 -DDEBUGGING 和執行緒的建置會因「恐慌:從錯誤的池中釋放」錯誤而失敗。這是因為 perl 內部管理的環境與使用 libc setenv()
函數更新環境的 atfork 處理常式發生衝突所致。
Perl 現在使用 setenv()
/unsetenv()
來更新 OS X 上的環境。 [GH #14955]
所有 Solaris 變體現在都會建置共用 libperl
Solaris 和 OpenIndiana 等變體現在總是使用共用 Perl 函式庫建置(Configure -Duseshrplib)。OpenIndiana 建置需要這樣做,但這也是 Oracle/Sun Perl 建置好幾年的設定。
當原型列為 PERL_STATIC_INLINE
,但測試使用 -DPERL_NO_INLINE_FUNCTIONS
建置時,解決 Tru64 會出錯的問題。
在 VMS 上,math.h
中的數學函式原型現在可以在 C++ 中顯示。現在使用 C++ 建置 POSIX 擴充套件將不再會當機。
VMS 自 v7.0(於 1996 年發布)以來就有 setenv
/unsetenv
,Perl_vmssetenv
現在總是使用 setenv
/unsetenv
。
Perl 現在透過掃描指定處理程序群組中的處理程序來實作自己的 killpg
,這可能與 Unix 處理程序群組不太相同,但允許我們將訊號傳送給父處理程序(或主處理程序)及其所有子處理程序。在 perl 層級,這表示我們現在可以傳送負面 pid,如下所示
kill SIGKILL, -$pid;
傳送訊號給與 $pid
相同群組中的所有處理程序。
對於那些基於 CRTL 環境陣列的 %ENV
元素,我們在設定時始終保留大小寫,但僅在先將金鑰轉換為大寫後才進行查詢,這會導致遺失小寫或混合大小寫的項目。此問題已透過讓源自環境陣列的 %ENV
元素在查詢時區分大小寫,以及在儲存時保留大小寫來修正。
PERL5LIB
和 PERLLIB
的環境查詢以前僅考慮邏輯名稱,但現在會考慮 %ENV
的所有來源,如 PERL_ENV_TABLES
所決定,並如 perlvms 中的「%ENV」 所述。
現在支援的 VMS 最低版本為 2003 年發行的 v7.3-2。此變更的副作用是,VAX 不再受支援,因為 OpenVMS VAX 的終端版本為 2001 年的 v7.3。
已將新的建置選項 USE_NO_REGISTRY
新增至 makefile。此選項預設為關閉,表示預設為執行 Windows 註冊表查詢。此選項可阻止 Perl 在註冊表中尋找任何內容。有關註冊表中查詢的值,請參閱 perlwin32。在 C 中,此選項的內部名稱為 WIN32_NO_REGISTRY
。
Perl 使用 HKEY_CURRENT_USER\Software\Perl
和 HKEY_LOCAL_MACHINE\Software\Perl
來查詢特定值(包括以 PERL
開頭的 %ENV
變數)的行為已變更。以前,即使這兩個金鑰不存在,也會在 Perl 程序的整個生命週期中持續檢查是否有項目。基於效能考量,現在如果根金鑰(即 HKEY_CURRENT_USER\Software\Perl
或 HKEY_LOCAL_MACHINE\Software\Perl
)在程序啟動時不存在,則在 Perl 程序生命週期的剩餘時間內,將不會再次檢查是否有 %ENV
覆寫項目。這更接近 Unix 行為,因為環境會在啟動時複製或繼承,而且在父程序或其他程序中變更變數,或編輯 .bashrc,不會變更其他現有正在執行程序中的環境變數。
已移除每個 -X
或 stat
呼叫的 glob 擷取,無論是從 Perl 程式碼或 Perl 的 C 程式碼內部執行。查詢的 glob 是特殊變數 ${^WIN32_SLOPPY_STAT}
。這使得 -X
和 stat
稍微快一點。
在 miniperl 的處理程序啟動期間,在建置處理程序期間,4 至 8 個與處理程序啟動 .pl 和 buildcustomize.pl 檔案相關的 IO 呼叫已從開啟和執行第一個或第二個 .pl 檔案的程式碼中移除。
使用 Microsoft Visual C++ 2003 及更早版本建置不再產生「內部編譯器錯誤」訊息。[perl #126045]
Visual C++ 2013 建置現在會在 XP 及更高版本執行。先前它們只會在 Vista 及更高版本執行。
現在您可以使用 GNU Make 和 GCC 建置 perl。[perl #123440]
truncate($filename, $size)
現在適用於超過 4GB 大小的檔案。[perl #125347]
已將平行建置新增到 dmake makefile.mk
makefile。支援所有 Win32 編譯器。
使用 64 位元 GCC 但使用 32 位元 gmake 建置 64 位元 perl 會導致結果 perl 的 $Config{archname}
無效。[perl #127584]
Winsock 函數設定的錯誤現在會直接放入 $^E
,而相關的 WSAE*
錯誤碼現在會從 Errno 和 POSIX 模組匯出,以供測試。
先前將錯誤(自 Perl 5.20.0 起轉換為 POSIX 格式的 E*
錯誤碼)放入 $!
的行為有錯誤,原因是 Winsock 和 POSIX 錯誤常數同名但不同等,而這兩者之間的關係自 Perl 5.8.0 起不幸地以某種方式建立。
新的行為提供了一個更強大的解決方案,用於在可攜式軟體中檢查 Winsock 錯誤,而不會意外比對預計用於其他作業系統的 POSIX 測試,且可能對 Winsock 有不同的意義。
目前舊有行為仍保留,包含所有缺點,以維持向後相容性,但建議使用者變更任何測試 $!
與 E*
常數對應 Winsock 錯誤的程式碼,改為測試 $^E
與 WSAE*
常數。在適當的淘汰期間後,舊有行為可能會移除,讓 $!
在 Winsock 函式呼叫後保持不變,以避免在檢查哪個錯誤變數時產生任何可能的混淆。
ppc64el(Debian 為小端序 PowerPC 所取的名稱)的浮點數格式現在可以正確偵測。
perl 的內容堆疊系統及其內部 API 已大幅修改。請注意,並未對任何外部 API 進行重大變更,但依賴於此類內部詳細資料的 XS 程式碼可能需要修正。主要變更如下:
PUSHBLOCK()
、POPSUB()
等巨集已替換為靜態內嵌函式,例如 cx_pushblock()
、cx_popsub()
等。這些函式使用函式引數,而非隱含依賴於 gimme
和 newsp
等可用之區域變數。此外,其功能也已變更:特別是,cx_popblock()
不再遞減 cxstack_ix
。涉及 cx_popblock()
、cx_popsub()
等函式的 pp_leave*
函式中步驟的順序已變更。請參閱新的文件,perlguts 中的「動態範圍和內容堆疊」,以取得如何使用這些函式的詳細資料。
已新增各種巨集,它們現在都一致地具有 CX_ 前置詞
CX_CUR(), CX_LEAVE_SCOPE(), CX_POP()
或已重新命名
CX_POP_SAVEARRAY(), CX_DEBUG(), CX_PUSHSUBST(), CX_POPSUBST()
cx_pushblock()
現在會儲存 PL_savestack_ix
和 PL_tmps_floor
,因此 pp_enter*
和 pp_leave*
不再會執行此動作
ENTER; SAVETMPS; ....; LEAVE
cx_popblock()
現在也會還原 PL_curpm
。
在每種類型的 dounwind()
中,現在會在彈出每個內容之前處理目前的儲存堆疊架構;以前僅對類似子內容的架構執行此動作。此動作已從 cx_popsub()
中移除,並放置到其自己的巨集中,即 CX_LEAVE_SCOPE(cx)
,必須在 cx_popsub()
等之前呼叫此巨集。
dounwind()
現在也會對最後彈出的架構執行 cx_popblock()
(以前它只對每個架構執行 cx_popsub()
等動作)。
現在會在範圍結束時釋放暫存堆疊;以前,在區塊最後一個陳述式期間建立的暫存不會在區塊後的下一個 nextstate
之前釋放(除了現有的駭客手法,可針對標量內容中的遞迴子執行此動作);而在類似 f(g())
的情況中,以前會等到 f()
回傳後的陳述式才會釋放 g()
中最後一個陳述式建立的暫存。
現在會將範圍進入時儲存在儲存堆疊上的大多數值儲存在內容結構中適當的新欄位中,並由 cx_pushfoo()
和 cx_popfoo()
直接儲存和還原,此方法快很多。
已新增、移除或修改各種內容結構欄位。
已大幅整理 cx_pushsub()
和 cx_popsub()
中 @_
的處理方式,包括從內容結構中移除 argarray
欄位,並將一些常見(但很少使用)的程式碼擷取到一個獨立函式 clear_defarray()
中。此外,已將 cx_popsub()
中有用子集(已在 pp_goto
等位置展開)收集到新的函式 cx_popsub_args()
和 cx_popsub_common()
中。
pp_leavesub
和 pp_leavesublv
現在使用與其他 pp_leave*
相同的函式來處理傳回引數。
已新增 CXp_FOR_PAD
和 CXp_FOR_GV
旗標,並將 CXt_LOOP_FOR
分割成 CXt_LOOP_LIST
、CXt_LOOP_ARY
。
已移除一些先前由 dMULTICALL
宣告(但未記載)的變數。
已移除模糊的 PL_timesbuf
變數,它實際上是 Perl 1 的遺跡。它在 Perl 5.20 中記載為已棄用,並聲明將在 5.21.x 系列的早期移除;現在終於實現了。 [GH #13632]
已移除 Perl_newATTRSUB_x()
中不必要的斷言。如果已看到具有原型的存根子程式定義,則任何後續具有屬性的相同子程式的存根(或定義)都會因為空指標而導致斷言失敗。 [GH #15081]
::
已在 ExtUtils::ParseXS
中被 __
取代,就像它在參數/回傳值中所做的那樣。這更一致,且簡化了將 C++ 類別包裝成巢狀 Perl 命名空間的 XS 程式碼寫作(它只需要一個 Foo__Bar
的 typedef,而不是兩個,一個是 Foo_Bar
,另一個是 Foo::Bar
)。
to_utf8_case()
函式現已棄用。請改用 toUPPER_utf8
、toTITLE_utf8
、toLOWER_utf8
和 toFOLD_utf8
。(請參閱 http://nntp.perl.org/group/perl.perl5.porters/233287。)
Perl 核心程式碼和執行緒擴充套件已加上註解,因此,如果 Perl 被設定為使用執行緒,那麼在編譯時期,clang(3.6 或更新版本)將會對可疑的互斥鎖使用發出警告。請參閱 http://clang.llvm.org/docs/ThreadSafetyAnalysis.html 以取得更多資訊。
signbit()
模擬已增強。這將有助於較舊和/或較特別的平台或設定檔。
核心中的大多數 EBCDIC 特定程式碼已與非 EBCDIC 程式碼統一,以避免重複並使維護更輕鬆。
$^X
的 MSWin32 程式碼已從 win32 目錄移至 caretx.c,其他作業系統會在那裡設定該變數。
sv_ref()
現在是 API 的一部分。
perlapi 中的「sv_backoff」 已將其回傳類型從 int
變更為 void
。自 Perl 5.000 穩定版以來,它以前總是回傳 0
,但這沒有記載在文件當中。儘管 sv_backoff
標記為公開 API,但預期不會影響 XS 程式碼,因為適當的 API 呼叫會透過公開 API sv_setsv(sv, &PL_sv_undef)
、準公開 SvOOK_off
或非公開 SvOK_off
呼叫進行,而 sv_backoff
的回傳值以前是一個無意義的常數,可以改寫為 (sv_backoff(sv),0)
。
已改善 EXTEND
和 MEXTEND
巨集,以避免各種與整數截斷和換行相關的問題。特別是,已移除巨集中以前使用的某些強制轉型。這表示例如傳遞未簽署的 nitems
參數現在可能會引發編譯器警告(它一直記載在文件當中,需要有簽署值;以前是 int,最近是 SSize_t)。
已移除 PL_sawalias
和 GPf_ALIASED_SV
。
已移除 GvASSIGN_GENERATION
和 GvASSIGN_GENERATION_set
。
現在可以正確指定使用者定義的屬性,例如
qr/\p{mypkg1::IsMyProperty}/i
使用 /i
不分大小寫的比對、明確的套件名稱,以及在模式編譯時未定義 IsMyProperty。
Perl 的 memcpy()
、memmove()
、memset()
和 memcmp()
回調現在與原始版本更相容。[perl #127619]
修正了 s///r
) 與 -DPERL_NO_COW 嘗試修改原始 SV 的問題,導致程式終止。[perl #127635]
修正僅限 EBCDIC 平台的情況,在該情況下,模式可能無法配對。當目標配對字串為 UTF-8 時,此情況會發生在配對 C1 控制項組中的字元時。
縮小 strict.pm 和 warnings.pm 中的檔名檢查範圍。先前,它假設如果檔名(不含 .pmc? 副檔名)與套件名稱不同,則為拼寫錯誤的 use 陳述式(例如 use Strict
而不是 use strict
)。我們現在檢查是否真的發生大小寫錯誤,而不是其他問題。
在剖析正規表示式時,將斷言轉換為更友善的失敗訊息。[perl #127599]
在嘗試編譯具有未終止字元類別且有尾隨反斜線的模式時,正確引發錯誤。[perl #126141]。
caller()
不再將大於 2**31-1 但小於 2**32 的行號傳回為負數。[perl #126991]
當語法警告已啟用時,unless ( assignment )
現在會適當地發出警告。[perl #127122]
將 ISA
glob 設定為陣列參考,現在會適當地將 isaelem
magic 新增到任何現有元素。先前修改此類元素不會更新 ISA 快取,因此方法呼叫會呼叫錯誤的函式。由於 5.23.7 中新增的新程式碼會嘗試從元素中釋放 isaelem
magic,因此如果 ISA
glob 已毀損,Perl 也會崩潰。[perl #127351]
如果在解析另一個運算子時發現 here-doc,而解析器已讀取檔案結尾,且 here-doc 未終止,perl 可能會產生斷言或區段錯誤。現在會可靠地抱怨未終止的 here-doc。[perl #125540]
untie()
有時會傳回 UNTIE()
處理常式傳回的最後一個值以及其正常值,搞亂堆疊。[perl #126621]
修正運算子優先順序問題,當 castflags & 2
為 true 時。[perl #127474]
快取 DESTROY 方法可能會導致非指標或非 STASH 儲存在 stash 的 SvSTASH()
槽中,中斷 B STASH()
方法。DESTROY 方法現在快取在 stash 的 MRO 元資料中。[perl #126410]
現在在搜尋 DESTROY 方法時會呼叫 AUTOLOAD 方法,並正確設定 $AUTOLOAD
。[perl #124387] [perl #127494]
在處理沒有檔名的 #line
指令時,避免解析超出緩衝區結尾。[perl #127334]
Perl 現在會在正規表示式模式看起來像應該包含 POSIX 類別(例如 qr/[[:alpha:]]/
)時,但其規格中有一些小瑕疵,導致它反而被當作一般的括號字元類別來處理,就會提出警告。一個範例是像這樣在上述範例中遺漏第二個冒號:qr/[[:alpha]]/
。這會編譯成比對兩個字元的序列。第二個字元是 "]"
,而第一個字元可以是下列任一個:"["
、":"
、"a"
、"h"
、"l"
或 "p"
。這不太可能是預期的意思,現在會提出警告。除非規格非常接近 14 個合法的 POSIX 類別之一,否則不會提出警告。(請參閱 "POSIX 字元類別" in perlrecharclass。)[perl #8904]
某些包含反向括號字元類別中補集 POSIX 類別的正規表示式模式,以及比對其他東西(可選)會不當失敗。一個可能會失敗的範例是 qr/_?[^\Wbar]\x{100}/
。這已經修正了。[perl #127537]
Perl 5.22 新增了對 C99 十六進位浮點數表示法的支援,但有時會錯誤地剖析十六進位浮點數。這已經修正了。[perl #127183]
一個回歸已修正,允許雜湊鍵中的未宣告裸字詞在嚴格限制下運作。 [GH #15099]
在找不到 import()
或 unimport()
方法時,內部使用的佔位符 &PL_sv_yes
的呼叫現在會正確地處理純量內容。 [GH #14902]
當我們在預期看到運算子的地方看到陣列時,報告更多內容,並避免斷言失敗。 [GH #14472]
修改先前為套件 @ISA
的陣列不再會導致斷言失敗或崩潰。 [GH #14492]
在純粹和 DEBUGGING perl 建置中保留二進位相容性。 [GH #15122]
在 darwin 上設定 $ENV{foo}
時避免記憶體外洩。 [GH #14955]
/...\G/
不再會在 utf8 字串上崩潰。當 \G
是正規表示法開頭的固定字元數時,perl 需要從目前的 pos()
位置往回計算這麼多字元,並從那裡開始比對。然而,它計算的是位元組而不是字元,這可能會導致 utf8 字串恐慌。
在某些情況下,傳回整數的運算子會將負整數傳回為正整數。 [GH #15049]
pipe()
運算子會在 DEBUGGING 建置中斷言,而不是產生正確的錯誤訊息。斷言的條件會被偵測並正確報告,而無需斷言,因此已移除斷言。 [GH #15015]
在某些情況下,無法解析 here-doc 會嘗試使用已釋放的記憶體。這是因為指標未正確還原所致。 [GH #15009]
@x = sort { *a = 0; $a <=> $b } 0 .. 1
在還原 *a 的 SV 槽位之前,不再釋放 *a 的 GP。 [GH #14595]
已修正新十六進位浮點 printf 格式 %a
的多個問題: [GH #15032]、 [GH #15033]、 [GH #15074]
在 leave_scope()
中呼叫 mg_set()
不再會發生記憶體外洩。
已修正 Perl v5.20 中的回歸問題,其中正規表達式編譯的偵錯輸出錯誤。(模式已正確編譯,但顯示的內容錯誤。)
\b{sb}
的運作大幅改善。在 Perl v5.22.0 中,此新結構似乎未提供預期的結果,但通過了 Unicode 提供的廣泛套件中的所有測試。結果發現,這是因為輸入字串很短,而失敗與較長的輸入有關。
"perlrecharclass 中的「擴充方括號字元類別」 中的特定語法錯誤會造成恐慌,而不是顯示適當的錯誤訊息。此問題現已修正。 [perl #126481]
Perl 5.20 在正規表達式中量詞無用時新增訊息,但接著讓解析器略過它;這會導致多餘的量詞被靜默略過,而不是擲回錯誤。此問題現已修正。 [perl #126253]
在 win32/makefile.mk 中最後建立非 XS 模組的切換(作為變更的一部分,設計為啟用平行建立)導致 POSIX 的建立因版本模組的問題而中斷。這現在已修復。
改進十六進位浮點常數的剖析。
修正 pack
的問題,其中 pack "H"
(和 pack "h"
)在給定非 utf8 來源和 utf8 目標時可能會讀取來源之後的內容。[perl #126325]
修正 perl 會因分段錯誤或 C 層級斷言而中斷的幾個案例。[perl #126615]、[perl #126602]、[perl #126193]。
在正規表示式模式中,有些地方不允許註解((?#...)
),但應該允許。這現在已修復。[GH #12755]
已修正 Perl 5.20 的一些回歸,其中正規表示式模式中的 (?[...])
建構中的一些語法錯誤可能會導致分段錯誤,而不是適當的錯誤訊息。[GH #14933] [GH #14996]
已修正 (?[...])
建構的另一個問題,其中像 \c]
之類的東西可能會導致恐慌。[GH #14934]
已修正嘗試將 perl 堆疊延伸至約 2G 或 4G 項目的部分問題。這特別是針對建立為使用 64 位元整數的 32 位元 perl 的問題,而且使用清單重複運算子時很容易注意到,例如:
@a = (1) x $big_number
以前 perl 可能會崩潰,具體取決於 $big_number
的確切值;現在它通常會引發例外狀況。[GH #14880]
在正規表示式條件式 (?(condition)yes-pattern|no-pattern)
中,如果條件為 (?!)
,則 perl 會直接失敗比對,而不是比對 no-pattern。這已修復。[GH #14947]
特殊的回溯控制動詞 (*VERB:ARG)
現在都允許一個可選引數,並適當地設定 REGERROR
/REGMARK
。 [GH #14937]
幾個錯誤,包括一個區段錯誤,已使用界線檢查建構(在 Perl 5.22 中引入)\b{gcb}
、\b{sb}
、\b{wb}
、\B{gcb}
、\B{sb}
和 \B{wb}
修復。所有 \B{}
現在都比對一個空字串;沒有任何 \b{}
這樣做。 [GH #14976]
複製一個已關閉的檔案處理序以寫入不再建立一個類似 GLOB(0xXXXXXXXX) 的檔名。 [perl #125115]
在回溯堆疊時現在忽略警告致命性。這防止了無限遞迴,當現在的致命錯誤也導致堆疊回溯時。 [perl #123398]
在 perl v5.22.0 中,在分析 -C 選項的數字參數時邏輯改變,使得成功分析的數字如果分析到引數的結尾,就不會儲存為選項值。 [perl #125381]
PadlistNAMES 巨集再次成為一個 l 值。
零 -DPERL_TRACE_OPS 記憶體用於子執行緒。
perl_clone_using()
遺漏了 PL_op_exec_cnt[] 的零初始化。這導致了執行緒化 -DPERL_TRACE_OPS 建置中的子執行緒在銷毀時會吐出極大的 op 計數。這些計數會將 %x 印成 "ABABABAB",這明顯是一個記憶體中毒值。
XS 型別對應表中的漏洞導致每次將 FILE *
或 PerlIO *
OUTPUT:
到 Perl 或匯入 Perl 時,就會洩漏一個純量,此問題自 Perl 5.000 以來就存在。這些特定的型別對應表項目被認為極少被 XS 模組使用。[perl #124181]
如果引數為負數,alarm()
和 sleep()
現在會發出警告並傳回 undef。以前,它們會將負值傳遞給底層 C 函式,而這可能會設定一個具有驚人值的計時器。
Perl 現在可以使用任何 Unicode 版本進行編譯。這以前(大多數時候)都能運作,但在 v5.18 到 v5.20 之間遺失了。Name_Alias
屬性在 Unicode 5.0 之前不存在。Unicode::UCD 錯誤地表示它存在。此問題已修正。
正則表示式中非常大的碼點(超出 Unicode)在轉換為 UTF-8 時,在某些情況下不再會導致緩衝區溢位。[GH #14858]
清單內容中的範圍運算子 (...) 的整數溢位檢查現在可以正確處理範圍大小大於位址空間的情況。這可能會發生在 32 位元系統上,且 -Duse64bitint。 [GH #14843]
已修正 %::=(); J->${\"::"}
的崩潰問題。 [GH #14790]
qr/(?[ () ])/
不再會發生區段錯誤,而是會傳回語法錯誤訊息。[perl #125805]
正則表示式所有格量詞 v5.20 回歸問題已修正。qr/
PAT{
min,max}+
/
應該與 qr/(?>
PAT{
min,max})/
具有相同的行為。自 v5.20 以來,如果 min 和 max 相等,此功能就不會運作。[perl #125825]
BEGIN <>
不再分段錯誤,並正確產生錯誤訊息。[perl #125341]
在 tr///
中,非法向後範圍,例如 tr/\x{101}-\x{100}//
,並未總是偵測到,因而產生不正確的結果。這已修正。
Perl 5.24.0 代表自 Perl 5.24.0 以來約 11 個月的開發時間,並包含來自 75 位作者、橫跨 1,800 個檔案的約 360,000 行變更。
不包含自動產生的檔案、文件和發行工具,約有 250,000 行變更至 1,200 個 .pm、.t、.c 和 .h 檔案。
Perl 持續在第三個十年蓬勃發展,這要歸功於使用者和開發人員的活躍社群。已知以下人員貢獻了成為 Perl 5.24.0 的改進
Aaron Crane、Aaron Priven、Abigail、Achim Gratz、Alexander D'Archangel、Alex Vandiver、Andreas König、Andy Broad、Andy Dougherty、Aristotle Pagaltzis、Chase Whitener、Chas. Owens、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Collins、Daniel Dragan、David Golden、David Mitchell、Doug Bell、Dr.Ruud、Ed Avis、Ed J、Father Chrysostomos、Herbert Breunung、H.Merijn Brand、Hugo van der Sanden、Ivan Pozdeev、James E Keenan、Jan Dubois、Jarkko Hietaniemi、Jerry D. Hedden、Jim Cromie、John Peacock、John SJ Anderson、Karen Etheridge、Karl Williamson、kmx、Leon Timmermans、Ludovic E. R. Tolhurst-Cleaver、Lukas Mai、Martijn Lievaart、Matthew Horsfall、Mattia Barbon、Max Maischein、Mohammed El-Afifi、Nicholas Clark、Nicolas R.、Niko Tyni、Peter John Acklam、Peter Martini、Peter Rabbitson、Pip Cet、Rafael Garcia-Suarez、Reini Urban、Ricardo Signes、Sawyer X、Shlomi Fish、Sisyphus、Stanislaw Pusep、Steffen Müller、Stevan Little、Steve Hay、Sullivan Beck、Thomas Sibley、Todd Rinaldo、Tom Hukins、Tony Cook、Unicode Consortium、Victor Adam、Vincent Pit、Vladimir Timofeev、Yves Orton、Zachary Storer、Zefram。
以上清單幾乎肯定不完整,因為它是自動從版本控制記錄中產生的。特別是,它不包括向 Perl 錯誤追蹤器回報問題的(非常感謝的)貢獻者的姓名。
此版本中包含的許多變更源自於 Perl 核心所包含的 CPAN 模組。我們感謝整個 CPAN 社群協助 Perl 蓬勃發展。
如需取得 Perl 所有歷史貢獻者的更完整清單,請參閱 Perl 原始程式碼散佈中的 AUTHORS 檔案。
如果您發現您認為是錯誤的問題,您可以查看最近張貼到 comp.lang.perl.misc 新聞群組的文章和 https://rt.perl.org/ 上的 perl 錯誤資料庫。Perl 主頁 http://www.perl.org/ 上也可能有相關資訊。
如果您認為您發現一個未回報的錯誤,請執行您的發行版本附帶的 perlbug 程式。務必將您的錯誤簡化為一個小巧但足夠的測試案例。您的錯誤回報,連同 perl -V
的輸出,將會傳送至 perlbug@perl.org,供 Perl 移植團隊分析。
如果您回報的錯誤有安全性影響,不適合傳送至公開封存的郵件清單,請參閱 "perlsec 中的安全性漏洞聯絡資訊",以取得如何回報問題的詳細資訊。
Changes 檔案,說明如何檢視已變更內容的詳盡詳細資料。
INSTALL 檔案,說明如何建置 Perl。
README 檔案,說明一般事項。
Artistic 和 Copying 檔案,說明著作權資訊。