perl5260delta - Perl v5.26.0 的新特性
本文件描述了 5.24.0 版本與 5.26.0 版本之間的差異。
此版本包含三個具有廣泛影響的更新
"."
不再在 @INC
中
出於安全原因,當前目錄 ("."
) 不再默認包含在模組搜索路徑 (@INC
) 的末尾。這可能對模組的構建、測試和安裝以及腳本的執行產生廣泛影響。詳細信息請參見 "從 @INC
中刪除當前目錄 ("."
)" 部分。
do
現在可能會發出警告
當 do
無法加載文件時,現在會發出一個不推薦的警告,而如果當前目錄 ("."
) 在 @INC
中,它本來會加載該文件。
在正則表達式模式中,文字左大括號 "{"
應該進行轉義
在v5.18中引入的lexical_subs
功能不再發出警告。禁用先前該功能使用的experimental::lexical_subs
警告類別的現有代碼將繼續運行。lexical_subs
功能沒有影響;所有Perl代碼都可以使用詞彙子例程,而不管當前範圍內的功能聲明是什麼。
這新增了一個新的修飾符"~"
,告訴解析器它應該尋找/^\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 中的「將參考指定給參考」。
更改清單請參閱 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 中的「腳本」。
某些平台在 UTF-8 語言環境中原生支援合理的排序和排序。Perl 現在與這些平台配合工作。為了可移植性和完全控制,仍建議使用 Unicode::Collate,但現在您可能不需要特別進行任何操作就可以獲得足夠好的結果,具體取決於您的應用。參閱 perllocale 中的「類別 LC_COLLATE
:排序:文本比較和排序」。
NUL
字符的字符串在具有多級字符權重的語言環境中,現在會忽略較高優先級的 NUL
字符。但是某些字符串仍然存在一些問題。參閱 perllocale 中的「包含嵌入 NUL
字符的字符串排序」。
CORE
子例程在CORE
命名空間中,哈希和數組函數(keys
、each
、values
、push
、pop
、shift
、unshift
和splice
)現在可以使用符號語法(&CORE::keys(\%hash
)和通過引用調用(my $k = \&CORE::keys; $k->(\%hash)
)。以前它們只能在內聯時使用。
我們已經切換到混合式哈希函數,以更好地平衡短鍵和長鍵的性能。
對於短鍵(16 個位元組及以下),我們使用了 One At A Time Hard 的優化變體,而對於更長的鍵,我們使用了 Siphash 1-3。對於非常長的鍵,這在性能上是一個很大的改進。對於較短的鍵,則有一個適度的改進。
@INC
中移除當前目錄("."
)perl 二進位檔包含一組預設路徑在@INC
中。從歷史上看,它還包括了當前目錄("."
)作為最後一個項目,除非啟用了污點模式(perl -T
)。雖然方便,但這對安全性有影響:例如,當腳本嘗試在其當前目錄不受信任(如/tmp)時加載可選模塊時,它可能會從該目錄下加載並執行代碼。
從 v5.26 開始,"."
將始終被預設移除,而不僅僅是在使用污點時。這對於安裝模塊和執行腳本有著重大的影響。
以下新功能已添加以幫助緩解這些問題。
Configure -Udefault_inc_excludes_dot
有一個新的Configure
選項,default_inc_excludes_dot
(默認啟用),它會建構一個不包含"."
的 perl 可執行檔;使用-U
取消此選項將使 perl 回復到舊的行為。這可能修復您的路徑問題,但會重新引入所有安全顧慮,因此除非您確定您的環境中不存在此類問題,否則不要構建這樣的 perl 可執行檔。
PERL_USE_UNSAFE_INC
perl 解譯器識別的新環境變量。如果此變量在 perl 解譯器啟動時具有值 1,則"."
將自動附加到@INC
(除了在使用污點時)。
這允許您按情況恢復舊的 perl 解譯器行為。但請注意,這旨在作為一個臨時支撐,這個功能可能會在將來的某個 perl 版本中被移除。目前它由cpan
實用工具和Test::Harness
設置,以便輕鬆安裝尚未更新以處理沒有點的 CPAN 模塊。再次強調,除非您確定這不會重新引入任何安全顧慮,否則請不要使用此功能。
一則由do
發出的新的停用警告。
雖然眾所周知use
和require
使用@INC
搜索要加載的文件,但許多人並不意識到do "file"
如果文件是相對路徑,也會搜索@INC
。由於移除了"."
,簡單的do "file.pl"
將無法從當前目錄讀取並執行file.pl
。由於這是常見的預期行為,現在每當do
無法加載文件時,如果點在@INC
中,將發出新的停用警告。
這是一些腳本和模組作者可能需要在新的制度下使其軟件正常運作的事情。
腳本作者
如果問題出在你自己的代碼內部(而不是在包含的模塊內部),那麼你有兩個主要選擇。首先,如果你確信你的腳本只會在一個受信任的目錄下運行(你預期會找到受信任的文件和模塊),那麼將"."
添加回路徑中;例如
BEGIN {
my $dir = "/some/trusted/directory";
chdir $dir or die "Can't chdir to $dir: $!\n";
# safe now
push @INC, '.';
}
use "Foo::Bar"; # may load /some/trusted/directory/Foo/Bar.pm
do "config.pl"; # may load /some/trusted/directory/config.pl
另一方面,如果你的腳本打算從不受信任的目錄(例如/tmp)運行,那麼你的腳本突然無法加載文件可能表明存在安全問題。你很可能需要將任何相對路徑替換為完整路徑;例如
do "foo_config.pl"
可能會變成
do "$ENV{HOME}/foo_config.pl"
如果你絕對確定想要你的腳本從當前目錄加載和執行一個文件,那麼使用./
前綴;例如
do "./foo_config.pl"
安裝和使用 CPAN 模塊
如果你使用像cpan
這樣的自動工具安裝 CPAN 模塊,那麼這個工具將在構建和測試模塊時設置PERL_USE_UNSAFE_INC
環境變量,這可能足以安裝一個未更新為點感知的發行版。如果你想手動安裝這樣的模塊,那麼你需要將傳統的調用替換為類似於
perl Makefile.PL && make && make test && make install
的東西
(export PERL_USE_UNSAFE_INC=1; \
perl Makefile.PL && make && make test && make install)
請注意,這僅有助於構建和安裝未修復的模塊。測試可能通過(因為它們在PERL_USE_UNSAFE_INC=1
下運行),但模塊本身在生產中執行時可能無法正常運作。在這種情況下,你可能需要暫時修改你的腳本,直到修復版本的模塊被釋出。例如
use Foo::Bar;
{
local @INC = (@INC, '.');
# assuming read_config() needs '.' in @INC
$config = Foo::Bar->read_config();
}
這僅在極少數情況下才預期需要。再次,如果這樣做,請先評估產生的風險。
模塊作者
如果你維護一個 CPAN 分發,它可能需要更新以在無點環境中運行。儘管cpan
和其他類似的工具目前在模塊構建期間設置PERL_USE_UNSAFE_INC
,這是一個暫時性的解決方案,適用於依賴"."
在安裝和測試過程中的模塊集合,這可能掩蓋了更深層次的問題。這可能導致通過測試並安裝的模塊在運行時失敗。
在建置、測試和安裝期間,通常情況下任何 perl 程序都會直接在解壓後的分發根目錄中執行,或者是該目錄的已知子目錄,例如 t/。很可能 Makefile.PL 或 t/foo.t 會嘗試使用它們直接的相對文件名來包含本地模塊和配置文件,這將會失敗。
然而,如上所述,自動工具如 cpan 目前會設置 PERL_USE_UNSAFE_INC
環境變量,這在建置期間引入了點。
這使得您現有的建置和測試代碼很可能會工作,但這可能掩蓋了在安裝後使用時才會出現的代碼問題。最好嘗試使用該變量明確禁用運行您的建置過程。
(export PERL_USE_UNSAFE_INC=0; \
perl Makefile.PL && make && make test && make install)
這更有可能顯示出模塊建置過程中的任何潛在問題,甚至是模塊本身的問題。修復此類問題將確保您的模塊可以再次手動安裝,並且在 PERL_USE_UNSAFE_INC
支持消失後仍然可以建置。
在修復由於從 @INC
中刪除點而導致的測試問題時,應該謹慎重新將點插入到 @INC
中,因為這也可能會抑制您的運行時代碼中的真實錯誤。鼓勵您在可能的情況下,使用明確的絕對/相對路徑進行上述方法,或將所需文件移到子目錄中,然後將該子目錄插入到 @INC
中。
如果您的運行時代碼在無點的 @INC
下存在問題,那麼上面關於如何為腳本作者修復的評論在這裡也基本適用。請記住,模塊全局添加點到 @INC
被認為是不良做法,因為它既引入了安全風險,又隱藏了在 @INC
中意外需要點的問題,如上所述。
在 Unix 系統上,Perl 在啟動新進程時將 PATH
環境變量中的任何相對路徑視為受污染的。以前,它允許反斜杠來逃脫冒號(與操作系統不同),因此如果 PATH 設置為類似 /\:.
的內容,則會將相對路徑視為安全的。該檢查已被修正為在該示例中將 "."
視為受污染。
-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::Encoding或encoding的Filter
選項等源代碼過濾器。
POSIX::tmpnam()
基本上不安全的tmpnam()
接口已於Perl 5.22中被棄用,現已被刪除。您可以使用例如File::Temp接口來替代它。
以前,require ::Foo::Bar
將嘗試讀取/Foo/Bar.pm。現在,任何以雙冒號開頭的裸字要求都會中止。
變量名不再能夠包含字面控制字符,無論在什麼情況下都是如此。在ASCII平台上,這些以前是允許的單字符名稱,但自Perl 5.20以來已在那裡被棄用。這影響像$\cT
這樣的東西,其中\cT是源代碼中的字面控制(例如NAK
或NEGATIVE ACKNOWLEDGE
字符)。
NBSP
在\N{...}
中已不再被允許自Perl 5.22以來,字符的名稱不再可以包含不可斷行的空格。這已經被棄用。
為了讓Perl最終允許字符串定界符為Unicode字形簇(看起來像單個字符,但可能是幾個字符的序列),我們必須停止允許不是字形獨立的單個字符定界符。這些在實際代碼中不太可能存在,因為它們通常會顯示為附加在它們前面的字符上。
\cX
對應到可打印字符的情況不再被棄用這意味著我們沒有計劃刪除此功能。它仍然會引發警告,但僅在啟用語法警告時。該功能最初旨在表示沒有助記符的不可打印字符(\t
和\n
是兩個不可打印字符的助記符,但大多數不可打印字符沒有助記符)。但是該功能也可用於指定一些可打印字符,儘管這些字符更清晰地表示為可打印字符本身。參見http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html。
布林上下文中的哈希現在有時會更快,例如
if (!%h) { ... }
這已經被特別處理過,但有些情況被忽略了(例如grep %$_, @AoH
),即使沒有被忽略的情況也已經得到了改進。
64位版本上的新更快哈希函數
對於短鍵和長鍵,我們使用不同的哈希函數。這應該會提高性能和安全性,特別是對於長鍵。
readline更快
使用readline()
或<>
從文件逐行讀取應該會更快,因為對下一個換行字符進行搜索的代碼實現更好了。
在某些情況下,將一個引用分配給另一個引用,例如$ref1 = $ref2
,已經被優化。
移除了一些例外情況以創建 Copy-on-Write 字串。字串緩衝區增長算法已稍作調整,以減少遇到無法進行 COW 的字串的可能性。
優化了陣列和哈希賦值:當陣列或哈希出現在列表賦值的左側時,例如 (..., @a) = (...);
,速度可能會更快,特別是當涉及清空陣列/哈希時。例如,這段代碼與 Perl 5.24.0 相比運行速度大約快了三分之一。
my @a;
for my $i (1..10_000_000) {
@a = (1,2,3);
@a = ();
}
將單個數字字符串轉換為數字現在速度大幅提高。
在許多情況下,內置的 split
現在稍微更快:特別是對於兩個特別處理的形式。
my @a = split ...;
local @a = split ...;
對於實驗性子例程簽名功能的實現相當緩慢,已經大大加快;現在與傳統的 my ($a, $b, @c) = @_
速度相當。
現在允許裸字常量字符串參與常量折疊。最初它們在 1999 年 8 月的 Perl 5.6 開發期間被豁免不受常量折疊的影響,以確保 use strict "subs"
仍然適用於裸字常量。現在已通過不同的方式實現了這一點,因此與其他常量一樣,裸字現在也獲得了常量折疊的性能優勢。
這也意味著對裸字常量表達式的空上下文警告現在報告折疊的常量操作數,而不是操作;這與非裸字常量的行為匹配。
IO::Compress 已從版本 2.069 升級到 2.074。
Archive::Tar 已從版本 2.04 升級到 2.24。
arybase 已從版本 0.11 升級到 0.12。
attributes 已從版本 0.27 升級到 0.29。
對於 :unique
和 :locked
屬性的棄用消息現在提到它們將在 Perl 5.28 中消失。
B 已從版本 1.62 升級到 1.68。
B::Concise 已從版本 0.996 升級到 0.999。
現在其輸出對於 op_private
標誌更具描述性。
B::Debug 已從版本 1.23 升級到 1.24。
B::Deparse 已從版本 1.37 升級到 1.40。
B::Xref 已從版本 1.05 升級到 1.06。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
base 已從版本 2.23 升級到 2.25。
bignum 已從版本 0.42 升級到 0.47。
Carp 已從版本 1.40 升級至 1.42。
charnames 已從版本 1.43 升級至 1.44。
Compress::Raw::Bzip2 已從版本 2.069 升級至 2.074。
Compress::Raw::Zlib 已從版本 2.069 升級至 2.074。
Config::Perl::V 已從版本 0.25 升級至 0.28。
CPAN 已從版本 2.11 升級至 2.18。
CPAN::Meta 已從版本 2.150005 升級至 2.150010。
Data::Dumper 已從版本 2.160 升級至 2.167。
XS 實現現在支援 Deparse。
DB_File 已從版本 1.835 升級至 1.840。
Devel::Peek 已從版本 1.23 升級至 1.26。
Devel::PPPort 已從版本 3.32 升級至 3.35。
Devel::SelfStubber 已從版本 1.05 升級至 1.06。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
diagnostics 已從版本 1.34 升級至 1.36。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
Digest 已從版本 1.17 升級至 1.17_01。
Digest::MD5 已從版本 2.54 升級至 2.55。
Digest::SHA 已從版本 5.95 升級至 5.96。
DynaLoader 已從版本 1.38 升級至 1.42。
Encode 已從版本 2.80 升級至 2.88。
encoding 已從版本 2.17 升級至 2.19。
此模組的預設模式不再受支援。現在在被導入時會中止,除非正在使用 Filter
選項。
encoding::warnings 已從版本 0.12 升級至 0.13。
此模組不再受支援。它會發出相應的警告,然後不執行任何操作。
Errno 已從版本 1.25 升級至 1.28。
現在文件指示自動載入 Errno。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
ExtUtils::Embed 已從版本 1.33 升級至 1.34。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
ExtUtils::MakeMaker 已從版本 7.10_01 升級至 7.24。
ExtUtils::Miniperl 已從版本 1.05 升級至 1.06。
ExtUtils::ParseXS 已從版本 3.31 升級至 3.34。
ExtUtils::Typemaps 已從版本 3.31 升級至 3.34。
feature 已從版本 1.42 升級至 1.47。
File::Copy 已從版本 2.31 升級至 2.32。
File::Fetch 已從版本 0.48 升級至 0.52。
File::Glob 已從版本 1.26 升級至 1.28。
現在對 File::Glob::glob()
發出了不建議使用的訊息。
File::Spec 已從版本 3.63 升級至 3.67。
FileHandle 已從版本 2.02 升級至 2.03。
Filter::Simple 已從版本 0.92 升級至 0.93。
現在不再將 use MyFilter
後立即跟隨 no MyFilter
視為檔案結尾。 [GH #11853]
Getopt::Long 已從版本 2.48 升級至 2.49。
Getopt::Std 已從版本 1.11 升級至 1.12。
Hash::Util 已從版本 0.19 升級至 0.22。
HTTP::Tiny 已從版本 0.056 升級至 0.070。
現在內部 599 系列錯誤包括了重新導向歷史。
I18N::LangTags 已從版本 0.40 升級至 0.42。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
IO 已從版本 1.36 升級至 1.38。
IO::Socket::IP 已從版本 0.37 升級至 0.38。
IPC::Cmd 已從版本 0.92 升級至 0.96。
IPC::SysV 已從版本 2.06_01 升級至 2.07。
JSON::PP 已從版本 2.27300 升級至 2.27400_02。
lib 已從版本 0.63 升級至 0.64。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
List::Util 已從版本 1.42_02 升級至 1.46_02。
Locale::Codes 已從版本 3.37 升級至 3.42。
Locale::Maketext 已從版本 1.26 升級至 1.28。
Locale::Maketext::Simple 已從版本 0.21 升級至 0.21_01。
Math::BigInt 已從版本 1.999715 升級至 1.999806。
Math::BigInt::FastCalc 已從版本 0.40 升級至 0.5005。
Math::BigRat 已從版本 0.260802 升級至 0.2611。
Math::Complex 已從版本 1.59 升級至 1.5901。
Memoize 已從版本 1.03 升級至 1.03_01。
Module::CoreList 已從版本 5.20170420 升級至 5.20170530。
Module::Load::Conditional 已從版本 0.64 升級至 0.68。
Module::Metadata 已從版本 1.000031 升級至 1.000033。
mro 已從版本 1.18 升級至 1.20。
Net::Ping 已從版本 2.43 升級至 2.55。
現在支援IPv6地址和AF_INET6
sockets,以及其他幾項增強功能。
NEXT已從版本0.65升級至0.67。
Opcode已從版本1.34升級至1.39。
open已從版本1.10升級至1.11。
OS2::Process已從版本1.11升級至1.12。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
overload已從版本1.26升級至1.28。
編譯速度略有改善。
parent已從版本0.234升級至0.236。
perl5db.pl已從版本1.50升級至1.51。
現在在非Unix系統中忽略/dev/tty。[GH #12244]
Perl::OSType已從版本1.009升級至1.010。
perlfaq已從版本5.021010升級至5.021011。
PerlIO已從版本1.09升級至1.10。
PerlIO::encoding已從版本0.24升級至0.25。
PerlIO::scalar已從版本0.24升級至0.26。
Pod::Checker已從版本1.60升級至1.73。
Pod::Functions已從版本1.10升級至1.11。
Pod::Html已從版本1.22升級至1.2202。
Pod::Perldoc已從版本3.25_02升級至3.28。
Pod::Simple已從版本3.32升級至3.35。
Pod::Usage已從版本1.68升級至1.69。
POSIX已從版本1.65升級至1.76。
修復了一些使其符號可匯出的缺陷。[GH #15260]
已移除POSIX::tmpnam()
介面,請參閱"已移除POSIX::tmpnam()"。
已移除以下已棄用的函數
POSIX::isalnum
POSIX::isalpha
POSIX::iscntrl
POSIX::isdigit
POSIX::isgraph
POSIX::islower
POSIX::isprint
POSIX::ispunct
POSIX::isspace
POSIX::isupper
POSIX::isxdigit
POSIX::tolower
POSIX::toupper
現在在導入時嘗試導入沒有真實實現的POSIX子例程(例如POSIX::atend()
)會在導入時失敗,而不是等到運行時。
re已從版本0.32升級至0.34
增加了對新的/xx
正則表達式模式修飾符的支援,以及對use re 'strict'
實驗性功能的更改。啟用re 'strict'
時,現在對於所有正則表達式模式中(在括號字符類之外)直接使用的兩個字符"}"
和"]"
將產生警告,這使它們更符合始終是元字符的")"
字符,除非進行了轉義。元字符只有在某些情況下才是元字符,具體取決於距離上的動作,這可能會導致默默地使模式意味著與預期完全不同的事情,而re 'strict'
模式旨在最小化這種情況。
Safe已從版本2.39升級至2.40。
Scalar::Util已從版本1.42_02升級至1.46_02。
Storable 已從版本 2.56 升級至 2.62。
修復 [GH #15714]。
Symbol 已從版本 1.07 升級至 1.08。
Sys::Syslog 已從版本 0.33 升級至 0.35。
Term::ANSIColor 已從版本 4.04 升級至 4.06。
Term::ReadLine 已從版本 1.15 升級至 1.16。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
Test 已從版本 1.28 升級至 1.30。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
Test::Harness 已從版本 3.36 升級至 3.38。
Test::Simple 已從版本 1.001014 升級至 1.302073。
Thread::Queue 已從版本 3.09 升級至 3.12。
Thread::Semaphore 已從版本 2.12 升級至 2.13。
新增了 down_timed
方法。
threads 已從版本 2.07 升級至 2.15。
threads::shared 已從版本 1.51 升級至 1.56。
Tie::Hash::NamedCapture 已從版本 0.09 升級至 0.10。
Time::HiRes 已從版本 1.9733 升級至 1.9741。
現在可在具有 C++11 編譯器的系統上構建(例如 G++ 6 和 Clang++ 3.9)。
現在使用 clockid_t
。
Time::Local 已從版本 1.2300 升級至 1.25。
Unicode::Collate 已從版本 1.14 升級至 1.19。
Unicode::UCD 已從版本 0.64 升級至 0.68。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
version 已從版本 0.9916 升級至 0.9917。
VMS::DCLsym 已從版本 1.06 升級至 1.08。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
warnings 已從版本 1.36 升級至 1.37。
XS::Typemap 已從版本 0.14 升級至 0.15。
XSLoader 已從版本 0.21 升級至 0.27。
修復了一個安全漏洞,該漏洞允許從 @INC
外部路徑加載二進制文件。
現在使用 3-arg open()
而不是 2-arg open()
。 [GH #15721]
此文件記錄了所有即將被棄用的功能,以及已經被移除的一些被棄用功能。此文件的目的是雙重的:一方面記錄將要消失的功能及其版本,另一方面為處理在升級 Perl 後不再運作的代碼的人提供指南。
我們已嘗試更新文檔以反映本文檔中列出的更改。如果您發現我們漏掉了任何內容,請發送電子郵件至 perlbug@perl.org。
此外,所有對 Usenet 的引用已被刪除,並對以下選定的更改進行了修改
刪除了有關應該在早期刪除時已被刪除的聚合物上關於 defined()
的過時文本。
修正了關於 eval()
和 evalbytes()
的文檔。
澄清了 seek()
、tell()
和 sysseek()
的文檔,強調位置以字節而非字符計算。[GH #15438]
澄清了有關 sort()
中變量 $a
和 $b
的文檔。
在 split()
中指出了某些模式修飾符是合法的,並警告在 Perl v5.11 之前的版本中使用它的注意事項。
刪除了關於 study()
的過時文檔,指出它現在是一個空操作。
指出當字符串包含代碼點高於 255 的字符時,vec()
的工作效果不佳。
增加了關於對 Size_t
和 SSize_t
的操作數進行格式化打印的建議。
澄清要使用哪種編輯器定位停止規則,並指出我們正在從使用制表符遷移,將其替換為一系列的空格字符。
提供使用 cBOOL
將表達式轉換為布林值的另一個理由。
請注意,巨集 TRUE
和 FALSE
可用於表示布林值。
perlinterp 已擴展,以提供如何在解析器中搜尋特定運算子處理方式的更詳細範例。
一些地域設置與 Perl 不兼容。請注意,這些可能導致核心崩潰。
新增了各種澄清說明。
更新了網站鏡像列表。
新增了使用完整限定名稱調用方法的章節。
不要阻止手動 @ISA
。
更多地提及 Moo
。
請注意,如果定界符是單詞字符(即符合 \w
),則必須使用空格來引用運算子。
澄清在由單引號定界的正則表達式模式中,不會進行變量插值。
第一部分已大幅重寫,以納入早期版本中提到的各種基本要點,這些要點在某種程度上是在第8版正則表達式的附錄中提到的。
請注意,通常會使用 /x
修飾符並忘記這意味著必須逃避 "#"
。
新增了入門材料。
請注意,發生在無法意味著的上下文中的元字符會失去其元字符特性,並匹配文字上。 use re 'strict'
可以捕捉其中的一些。
修正了關於 Unicode 字節順序標記處理的文字。
更新了與 Unicode UTS#18 中關於正則表達式和 Perl 兼容性的變更相對應的文字。
文件 @ISA
。它在其他地方有文件記錄,但未在perlvar中有文件記錄。
(A) 您意外地將腳本通過bash或其他Shell運行,而不是Perl。檢查#!
行,或手動將您的腳本餵給Perl。文件頂部的#!
行可能是這樣的
#!/usr/bin/perl
(A) 您意外地將腳本通過zsh或其他Shell運行,而不是Perl。檢查#!
行,或手動將您的腳本餵給Perl。文件頂部的#!
行可能是這樣的
#!/usr/bin/perl
(F) 要聲明對變量的引用,如my \%x
,必須首先啟用該功能
no warnings "experimental::declared_refs";
use feature "declared_refs";
參見"聲明對變量的引用"。
在另一個正則表達式的代碼塊內使用空模式(重新執行最後成功匹配的模式),如/(?{ s!!new! })/
,以前一直會導致段錯誤。現在會產生此錯誤。
正則表達式模式中的一些上下文中現在不允許未轉義的左大括號。在其他上下文中,它們仍然只是被棄用的;它們將在Perl 5.30中變為非法。
(F) 解析器找到了以<<<<<<<
、>>>>>>>
或=======
開頭的行。這些可能是由版本控制系統留下的,在合併操作失敗後標記衝突。
(S experimental::declared_refs)此警告在您在my()
、state()
、our()
或local()
的右側使用引用構造函數時發出。如果要使用該功能,則只需抑制警告,但請注意,這樣做可能存在使用實驗性功能的風險,該功能可能會在未來的 Perl 版本中更改或移除
no warnings "experimental::declared_refs";
use feature "declared_refs";
$fooref = my \$foo;
參見"聲明對變量的引用"。
由於現在將"."
默認從@INC
中移除,do
現在將觸發一個警告,建議修正do
語句。
File::Glob::glob()
將在 Perl 5.30 中消失。請改用File::Glob::bsd_glob()
。
當require
失敗時,當require
是針對文件而不是模塊時,我們現在不提供@INC
。
當@INC
未掃描require
調用時,為了避免混淆,我們不再顯示@INC
。
屬性 "locked" 已廢棄,並將在 Perl 5.28 中消失
在此版本中,已經添加了“並將消失”文字的現有警告。
屬性 "unique" 已廢棄,並將在 Perl 5.28 中消失
在此版本中,已經添加了“並將消失”文字的現有警告。
呼叫 POSIX::%s() 已被廢棄
此警告已被刪除,因為已從 POSIX 中刪除了已廢棄的函數。
來自可能在其他地方修改的詞法變數的常數已被廢棄。這將不允許在 Perl 5.32 中。
在此版本中,已經添加了“這將不允許”文字的現有警告。
在虛假條件中廢棄了my()
的使用。這將在 Perl 5.30 中成為致命錯誤
在此版本中,已經添加了“這將成為致命錯誤”文字的現有警告。
dump()
最好寫為CORE::dump()
。dump()
將在 Perl 5.30 中不再可用
在此版本中,已經添加了“不再可用”文字的現有警告。
此消息現在後面跟著更有幫助的文本。[GH #15291]
實驗性 "%s" 函式未啟用
此警告已被刪除,因為詞法函式現在不再是實驗性的。
擁有多於一個/%c正則表達式修飾符已被廢棄
這個廢棄警告已被刪除,因為/xx
現在具有新的意義。
%s() 已被棄用於 :utf8
處理。在 Perl 5.30 中將會是致命錯誤。 .
其中 "%s" 是 sysread
, recv
, syswrite
, 或 send
之一。
在此版本中,已經添加了“這將成為致命錯誤”文字的現有警告。
此警告現在已經預設啟用,因為所有 deprecated
類別的警告都應該如此。
此現有的警告在此版本中已新增了 其使用將會是致命的 文字。
此現有的警告在此版本中已新增了 其使用將會是致命的 文字。
關於確切問題的詳細資訊已添加在此訊息的末尾。
此警告以前曾警告關於 require
,即使實際上是執行的是 do
。現在它會得到正確的操作名稱。
在 charnames 別名定義中使用的 NO-BREAK SPACE 已被棄用
此警告已被移除,因為此行為現在是一個錯誤。
此警告現在包含有違規子程式的名稱。
開啟的目錄控制器 %s 同時也作為檔案。在 Perl 5.28 中將會是致命錯誤。
在此版本中,已經添加了“這將成為致命錯誤”文字的現有警告。
開啟的檔案控制器 %s 同時也作為目錄。在 Perl 5.28 中將會是致命錯誤。
在此版本中,已經添加了“這將成為致命錯誤”文字的現有警告。
panic: ck_split, 類型=%u
panic: pp_split, pm=%p, s=%p
這些 panic 錯誤已經被移除。
將格式錯誤的 UTF-8 傳遞給 "%s" 已被棄用
此警告已更改為致命的 "%s" 中的格式錯誤的 UTF-8 字串
將 $/
設定為對 %s 的參考作為一種吸收的形式已被棄用,將被視為未定義。在 Perl 5.28 中將會是致命錯誤。
此現有的警告在此版本中已新增了 這將是致命的 文字。
${^ENCODING}
不再支援。在 Perl 5.28 中將會是致命錯誤。
此警告曾是:"設定 ${^ENCODING}
是已棄用的"。
變數 ${^ENCODING}
的特殊動作曾用於實現 encoding
pragma。從 Perl 5.26 開始,不再被棄用,將賦值給此變數現在除了發出警告之外不再有任何效果。
此警告現在包含有違規子程式的名稱。
此警告現在包含有違規子程式的名稱。
在這裡的正則表達式中未轉義的左大括號已被棄用(並在 Perl 5.30 中將會是致命的),在正則表達式中傳遞; 在 m/%s/ 中被標記 <-- HERE
此現有的警告在此版本中已新增了 這裡(將會是致命...) 文字。
未知的字元名 '' 已被廢棄。在 Perl 5.28 中使用將會導致致命錯誤。
此現有的警告在此版本中已新增了 其使用將會是致命的 文字。
使用裸露的 << 來表示 <<"" 已被廢棄。在 Perl 5.28 中使用將會導致致命錯誤。
此現有的警告在此版本中已新增了 其使用將會是致命的 文字。
使用代碼點 0x%s 已被廢棄;允許的最大值為 0x%s。這將會在 Perl 5.28 中導致致命錯誤。
此現有的警告在此版本中已新增了 這將是致命的 文字。
使用無逗號的變數列表已被廢棄。在 Perl 5.28 中使用將會導致致命錯誤。
此現有的警告在此版本中已新增了 其使用將會是致命的 文字。
對於非方法 %s(),繼承的 AUTOLOAD
的使用已被廢棄。這將會在 Perl 5.28 中導致致命錯誤。
此現有的警告在此版本中已新增了 這將是致命的 文字。
將代碼點超過 0xFF 的字串用於 %s 運算子的參數已被廢棄。這將會在 Perl 5.28 中導致致命錯誤。
在此版本中,已經添加了“這將成為致命錯誤”文字的現有警告。
這些舊的工具早已被 h2xs 取代,現在已經從發行版中移除。
移除不必要的可執行位。
考慮到 DOS 文件結尾的可能性。
許多改進。
整理文件,重新命名一些符號。
用 \w
替換不明確的字符範圍。
當測試失敗時嘗試更加有用。
避免枚舉的無限循環。
現在,郵件正文中的長行被包裝在 900 個字符,以保持在 SMTP 郵件傳輸代理所施加的 1000 個字符限制內。對於 Configure 的參數列表尤其重要,如果例如它命名了幾個非默認的安裝路徑,則很容易超出限制。此更改還為 perlbug 添加了第一個單元測試。 [perl #128020]
-Ddefault_inc_excludes_dot
已添加,並默認啟用。
dtrace
構建過程進一步變化 [GH #15718]
如果可用,請使用-xnolibs
以在FreeBSD監獄內建立一個
對於構建
在FreeBSD 10.x上添加
如果
您現在可以通過配置perl並使用-Accflags=NO_PERL_HASH_ENV
來禁用perl對PERL_HASH_SEED
和PERL_PERTURB_KEYS
環境變量的使用。
您現在可以通過配置perl並使用-Accflags=-DNO_PERL_HASH_SEED_DEBUG
來禁用perl對PERL_HASH_SEED_DEBUG
環境變量的使用。
Configure現在在計算80位NaN
和Inf
的字節時將對齊字節清零,以使構建更具再現性。 [GH #15725]
自v5.18以來,為了測試目的,我們已包含對使用各種非標準和非推薦哈希函數構建perl的支持。由於我們不建議使用這些函數,我們已將它們及其對應的構建選項刪除。具體來說,這包括以下構建選項
PERL_HASH_FUNC_SDBM
PERL_HASH_FUNC_DJB2
PERL_HASH_FUNC_SUPERFAST
PERL_HASH_FUNC_MURMUR3
PERL_HASH_FUNC_ONE_AT_A_TIME
PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
PERL_HASH_FUNC_MURMUR_HASH_64A
PERL_HASH_FUNC_MURMUR_HASH_64B
刪除“警告:perl出現在您的路徑中”
這個安裝警告更多或多少已經過時,因為大多數平台已經由操作系統提供了類似的/usr/bin/perl或類似的。
減少make install.man
的冗長性
以前,每個手冊頁都會發出兩個進度消息:一個是由installman自身發出的,另一個是由它調用的install_lib.pl中的函數發出的,以實際安裝文件。在每個案例中禁用第二個可以節省超過750行無用的輸出。
清理以支持clang -Weverything
的支持。 [GH #15683]
Configure:signbit掃描假設太多,停止假設負0。
已消除各種編譯器警告。
已經進行了一些較小的更改,以消除在C++11下編譯的障礙。
使用USE_PAD_RESET
構建現在可以正常工作;這種配置已經過時。
在Configure中添加了一個用於檢查gai_strerror()
例程是否可用並可用於將getaddrinfo()
返回的錯誤代碼轉換為人類可讀字符串的探針。
現在如果要求同時使用-Duselongdouble
和-Dusequadmath
,Configure將中止。 [GH #14944]
修復了一個bug,即使已經存在,Configure仍可能將-quadmath
附加到archname。 [GH #15423]
已修復使用-DPERL_GLOBAL_STRUCT
或-DPERL_GLOBAL_STRUCT_PRIVATE
的Clang構建(通過禁用這些配置的線程安全分析)。
當沒有文件需要更新時,make_ext.pl不再更新模塊的pm_to_blib文件。這可能導致不必要地重建依賴項,特別是perlmain.c。 [GH #15060]
perl -V
的輸出已重新格式化,以便每個配置和編譯時選項現在每行列出一個,以提高可讀性。
現在如果使用-Dusecrosscompiler
但不使用-Dtargethost=somehost
調用Configure,將構建miniperl
和generate_uudmap
。這意味著您可以提供目標平台的config.sh
,生成標頭並繼續構建交叉目標perl。 [GH #15126]
使用-Accflags=-DPERL_TRACE_OPS
構建的Perl現在僅在環境變量PERL_TRACE_OPS
設置為非零整數時才轉傾運算符計數。這使得make test
可以在這種構建上通過。
在使用GCC 6和鏈接時優化(對gcc
使用-flto
選項)時,Configure將所有探測的符號視為系統上存在的,而不管它們是否實際存在。已修復此問題。 [GH #15322]
內部測試Perl自身時使用t/test.pl庫,並且也被幾個CPAN模塊複製。其中一些模塊必須在舊版本的Perl上工作,因此t/test.pl必須反避免新的Perl功能。一段時間以來,與Perl 5.8的兼容性不慎被刪除;現已恢復。 [GH #15302]
構建過程不再在構建每個“簡單”擴展(僅具有*.pm和*.pod文件的擴展)之前發出額外的空行。
新增了測試並更改了這個版本中的其他新增和更改的反映。此外,進行了以下實質性的更改
添加了一個新的測試腳本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]
Perl 現在可以在 VAX 機器上的 NetBSD 下編譯。然而,該平台無法實現與大多數現代系統相容的浮點無窮大和 NaN,這些系統實現了 IEEE-754 浮點標準。十六進制浮點數(0x...p[+-]n
文字,printf %a
)也沒有實現。 make test
通過 98% 的測試。
測試修復和小更新。
考慮到對 inf
、nan
和 -0.0
支持的缺乏。
不要將 -Dprefix=/usr
視為特殊:相反地,要求使用額外的選項 -Ddarwin_distribution
以產生相同的結果。
OS X El Capitan 不實現 clock_gettime()
或 clock_getres()
API;必要時模擬它們。
macOS 10.12 上已棄用 syscall(2)
。
已更新多個測試以在 EBCDIC 平台上工作(或跳過)。
現在在 HP-UX 上跳過 Net::Ping 的 UDP 測試。
已改善 Hurd 的提示,啟用 malloc wrap 並報告使用的 GNU libc(以前在報告時是空字符串)。
現在在 NetBSD 上支援 VAX 浮點格式。
在 Unix shell 下運行時,PERL5LIB
和 PERLLIB
環境項目的路徑分隔符現在是冒號(":"
)。在 DCL 下運行時不變(仍然是 "|"
)。
configure.com 現在識別 VSI 品牌的 C 編譯器,不再識別 "DEC" 品牌的 C 編譯器(因為這種情況已經有 15 年以上了)。
已添加使用 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 的 a.out 可執行格式。Linux 已經使用 ELF 超過二十年。
OpenBSD 6 仍然不支援使用 SA_SIGINFO
返回 pid
、gid
或 uid
。請確保考慮到這一點。
t/uni/overload.t:在 FreeBSD 上跳過懸掛測試。
DragonFly BSD 現在支援 setproctitle()
。[GH #15703]。
新的 API 函數 sv_setpv_bufsize()
允許同時設置 SV
中的長度和分配的大小,在必要時增加緩衝區大小。
新的 API 宏 SvPVCLEAR()
將其 SV
參數設置為空字符串,就像 Perl 空間中的 $x = ''
,但具有幾個優化。
已向 API 中添加了幾個新的宏和函數,用於處理 Unicode 和 UTF-8 編碼的字符串,以及對現有函數功能的一些更改(詳細信息請參見 perlapi 中的 "Unicode 支持")。
已添加了新版本的 API 宏,如 isALPHA_utf8
和 toLOWER_utf8
,每個宏都帶有後綴 _safe
,如 isSPACE_utf8_safe
。這些宏接受額外的參數,指定安全讀取字符串的上限。使用舊版本可能會導致嘗試讀取超出輸入緩衝區末尾的內容,如果 UTF-8 不符合標準,則現在會發出棄用警告。詳細信息請參見 perlapi 中的 "字符分類"。
如果檢測到其輸入的 UTF-8 格式不正確,像 isALPHA_utf8
和 toLOWER_utf8
這樣的宏現在會中止。自 Perl 5.18 以來,已發出了棄用警告。
用於分析 utf8 序列的有效性的幾個新宏。這些是
UTF8_GOT_ABOVE_31_BIT
UTF8_GOT_CONTINUATION
UTF8_GOT_EMPTY
UTF8_GOT_LONG
UTF8_GOT_NONCHAR
UTF8_GOT_NON_CONTINUATION
UTF8_GOT_OVERFLOW
UTF8_GOT_SHORT
UTF8_GOT_SUPER
UTF8_GOT_SURROGATE
UTF8_IS_INVARIANT
UTF8_IS_NONCHAR
UTF8_IS_SUPER
UTF8_IS_SURROGATE
UVCHR_IS_INVARIANT
isUTF8_CHAR_flags
isSTRICT_UTF8_CHAR
isC9_STRICT_UTF8_CHAR
所有擴展自is_utf8_string_*()
函數的功能,對被識別為有效的 UTF-8 應用各種限制
is_strict_utf8_string
、is_strict_utf8_string_loc
、is_strict_utf8_string_loclen
,
is_c9strict_utf8_string
、is_c9strict_utf8_string_loc
、is_c9strict_utf8_string_loclen
,
is_utf8_string_flags
、is_utf8_string_loc_flags
、is_utf8_string_loclen_flags
,
is_utf8_fixed_width_buf_flags
、is_utf8_fixed_width_buf_loc_flags
、is_utf8_fixed_width_buf_loclen_flags
。
is_utf8_invariant_string
。is_utf8_valid_partial_char
。is_utf8_valid_partial_char_flags
。
函數utf8n_to_uvchr
及其衍生函數的行為已有幾次更改。
在 DEBUGGING 構建中,現在會對它們進行斷言,而在其他情況下,則返回Unicode REPLACEMENT CHARACTER。如果沒有要解碼的內容,則不應調用解碼函數。
現在,如果使用允許的輸入參數調用帶有過度長度變形的 UTF-8,則會返回Unicode REPLACEMENT CHARACTER。該變形是指UTF-8在語法上看起來有效,但存在一個較短的序列,可以產生相同的代碼點。自Unicode版本3.1以來,此變形已被禁止。
它們現在接受一個輸入標誌,以允許溢出變形。此變形是指UTF-8在語法上可能有效,但所表示的代碼點無法在平台上的字長中表示。在這種情況下,“允許”的含義是函數不返回錯誤,它將解析指針前進到該UTF-8之後,但它將Unicode REPLACEMENT CHARACTER作為代碼點的值返回(因為真實值無法表示)。
它們不再在遇到第一個變形時放棄搜索其他變形。因此,對這些函數的調用可能會產生多個診斷,而不僅僅是一個。
valid_utf8_to_uvchr()
已添加到API中(儘管它早在核心中就存在)。類似於utf8_to_uvchr_buf()
,但假定下一個字符是格式良好的。謹慎使用。
新增了一個新的功能,utf8n_to_uvchr_error
,供需要了解 UTF-8 異常情況的模塊使用,不僅能通過成功或失敗來獲取信息,還能獲取更詳細的細節。以前,要知道序列為何不正確,只能捕獲和解析生成的診斷信息,或進行自己的分析。
現在有一個更安全的 utf8_hop() 版本,稱為 utf8_hop_safe()
。與 utf8_hop() 不同,utf8_hop_safe() 不會在提供的緩衝區之前或之後導航。
新增了兩個新功能,utf8_hop_forward()
和 utf8_hop_back()
,類似於 utf8_hop_safe()
,但是用於知道您希望前進的方向時。
新增了兩個返回有用的 utf8 字節序列的宏
Perl 現在默認啟用了 PERL_OP_PARENT
編譯器定義。要禁用它,請使用 PERL_NO_OP_PARENT
編譯器定義。此標誌會更改在 OP
結構中如何使用 op_sibling
字段,自從 Perl 5.22 以來可選使用。
詳細了解此生成選項的內容,請參閱 "perl5220delta" 中的 "Internal Changes"。
新增了三個新的 op,OP_ARGELEM
、OP_ARGDEFELEM
和 OP_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 通常分配為 OP
或 UNOP
;而 op_class()
將返回適當的 OPclass_BASEOP
或 OPclass_UNOP
。
內部的所有部分現在都一致地將 sassign op 視為 BINOP
;以前它在 regen/opcodes 中被列為 BASEOP
,這意味著內部的幾個部分必須特殊處理才能容納它。這個怪異的原始動機是為了處理像 $x ||= 1
這樣的代碼;現在以更簡單的方式處理。
op_dump()
函數(由 perl -Dx
使用)的輸出格式已更改:它現在顯示一個“ASCII 藝術”樹狀結構,並顯示有關每個 op 的更多低級細節,如其地址和類別。
PADOFFSET
類型已從無符號更改為有符號,並且幾個與填充相關的變數,如 PL_padix
,已從類型 I32
更改為類型 PADOFFSET
。
正規表達式編譯和執行的 DEBUGGING
模式輸出已得到增強。
已消除幾個不常見的 SV 標誌,有時與操作它們的宏一起消除: SVpbm_VALID
、SVpbm_TAIL
、SvTAIL_on
、SvTAIL_off
、SVrepl_EVAL
、SvEVALED
。
已消除 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]
修复了 chop
和 chomp
的断言失败,这可能会由 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"
在 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
分配給。以前它對某些上下文有效,但對其他上下文無效。
將陣列或哈希分配給vec
或substr
的列表,其第一個參數在過去可能導致崩潰或在運行時產生“無法強制轉換”錯誤消息,而不像標量賦值,標量賦值會在編譯時產生錯誤。現在列表賦值也會在編譯時產生錯誤。 [GH #15370]
在某些情況下,包含&&
或||
運算符(或它們的同義詞and
和or
)的表達式被編譯時會出現錯誤。如果左邊包含否定的裸字常量或包含常量表達式的否定do {}
塊,右邊包含不可折疊表達式,則其中一個否定將被忽略。在if
和unless
語句修飾符中也是如此,只是左邊和右邊的表達式被交換了。這個長期存在的錯誤現在已經被修復。 [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 *_; shift
或 undef *_; pop
在子程序內,若 shift
或 pop
沒有參數,自 Perl 5.14 開始崩潰,但現已修復。
"string$scalar->$*"
現在正確地優先使用串接運算子重載而不是字串重載,如果 $scalar->$*
返回一個重載對象,使其與 $$scalar
保持一致。
/@0{0*->@*/*0
及類似的扭曲在過去可能會崩潰,但現在不再崩潰,僅會產生語法錯誤。 [GH #15333]
do
或 require
的參數是一個引用或型別全局符號時,當該參數被字符串化包含空字符時,自 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 文件以獲取一般信息。
查看 Artistic 和 Copying 文件以獲取版權信息。