perl5101delta - perl v5.10.1 的新增功能
本文檔說明 5.10.0 和 5.10.1 版本之間的差異。
如果您要從較早的版本(例如 5.8.8)升級,請先閱讀 perl5100delta,其中說明了 5.8.8 和 5.10.0 之間的差異
given
/when
switch 陳述式增強了對複雜表達式的處理。有兩個新情況,when
現在會將其參數解釋為布林值,而不是用於智慧比對的表達式
..
和 ...
flip-flop 運算子現在會在布林值脈絡中評估,遵循其慣用語意;請參閱 perlop 中的「範圍運算子」。
請注意,就像在 perl 5.10.0 中,when (1..10)
無法用來測試給定值是否為 1 到 10 之間的整數;您應該改用 when ([1..10])
(請注意陣列參考)。
然而,與 5.10.0 相反,在布林值脈絡中評估 flip-flop 運算子可確保它現在可以在 when()
中使用,特別是實作雙穩態條件,例如
when (/^=begin/ .. /^=end/) {
# do something
}
包含 defined-or 運算子的複合表達式,例如 when (expr1 // expr2)
,如果第一個表達式為布林值,將會被視為布林值。(這只是擴充套件套用於一般 or 運算子的現有規則,例如 when (expr1 || expr2)
。)
下一節詳細說明對智慧比對運算子語意的更多變更,這些變更自然也會修改隱含使用智慧比對的 switch 陳述式的行為。
智慧比對運算子 ~~
不再是可交換的。智慧比對的行為現在主要取決於其右運算元的類型。此外,其語意已調整,在多種情況下更一致或更有用。雖然維持了整體向後相容性,但必須注意以下變更
具有空原型碼參考不再被特別處理。它們會像其他程式碼參考一樣傳遞參數(即使它們選擇忽略參數)。
%hash ~~ sub {}
和 @array ~~ sub {}
現在會測試子常式是否對雜湊的每個鍵(或陣列的元素)傳回真值,而不是將整個雜湊或陣列作為參考傳遞給子常式。
由於可交換性中斷,當出現在 ~~
算子左側時,程式碼參考不再被特別處理,而是像任何一般純量一樣。
undef ~~ %hash
永遠為假(因為 undef
無法成為雜湊中的鍵)。不會進行隱式轉換為 ""
(如同 perl 5.10.0 中的情況)。
$scalar ~~ @array
現在會永遠將智慧比對分佈到陣列的元素中。如果 @array 中有一個元素驗證 $scalar ~~ $element
,則為真。這是舊有行為的概括,舊有行為會測試陣列是否包含純量。
智慧比對算子的完整調度表在 perlsyn 中的「智慧比對詳細資料」 中提供。
根據基於最右邊引數類型進行調度的規則,當重載 ~~
的物件出現在算子的右側時,重載常式會永遠被呼叫(第 3 個引數設定為真值,請參閱 重載)。不過,當物件出現在左側時,只有當最右邊的引數是簡單純量時,才會呼叫重載常式。這樣一來,智慧比對在陣列中的可分配性就不會中斷,而其他與複雜類型(程式碼參考、雜湊、正規表示式)的行為也不會中斷。因此,智慧比對的重載常式撰寫者大多只需要擔心與純量進行比較,以及可能與字串化重載進行比較;其他常見案例會自動以一致的方式處理。
~~
現在會拒絕處理未重載它的物件(為了避免依賴物件的底層結構)。(不過,如果物件重載字串化或數字化算子,而且重載備援處於啟用狀態,則會像往常一樣改用備援。)
use feature :5.10*
的語意已略有變更。請參閱 「模組和語用」 以取得更多資訊。
現在使用智慧比對算子 ~~
與未定義重載的物件會產生執行時期錯誤。(這樣一來,~~
就無法透過與物件的內部表示形式(作為參考)進行比對來中斷封裝。)
用於開發 perl 詮釋器的版本控制系統已從 Perforce 切換為 git。這主要是一個內部問題,只會影響積極處理 perl 核心的人員;但它可能會有一些次要的外部可見性,例如在 perl -V
輸出的部分詳細資料中。請參閱 perlrepository 以取得更多資訊。
perl 原始碼中 ext/
目錄的內部結構已重新整理。一般而言,原始碼儲存在 ext/Foo/Bar/ 中的模組 Foo::Bar
現在位於 ext/Foo-Bar/ 中。此外,一些模組已從 lib/ 移至 ext/。這純粹是原始碼 tarball 變更,而且不應對 perl 的編譯或安裝造成任何差異,除非您有明確依賴此結構或硬式編碼 Configure 參數 nonxs_ext
的高度自訂建置程序。特別是,此變更並不會預設變更最終安裝中任何檔案的位置。
作為 Test::Harness
2.x 到 3.x 升級的一部分,實驗性的 Test::Harness::Straps
模組已移除。有關更多詳細資訊,請參閱 "已更新的模組"。
作為 ExtUtils::MakeMaker
升級的一部分,ExtUtils::MakeMaker::bytes
和 ExtUtils::MakeMaker::vmsish
模組已從此發行版中移除。
Module::CoreList
不再包含 %:patchlevel
hash。
這項變更實際上是在 5.10.0 中引入的,但遺漏在該版本的 perldelta 中,因此在此提及。
與處理 /m
修飾詞和 qr
相關的錯誤修正導致 5.8.x 和 5.10.0 之間的行為改變
# matches in 5.8.x, doesn't match in 5.10.0
$re = qr/^bar/; "foo\nbar" =~ /$re/m;
包含在 Perl 5.10.1 中的 Unicode 字元資料庫副本已從 5.0.0 更新到 5.1.0。有關顯著變更,請參閱 http://www.unicode.org/versions/Unicode5.1.0/#Notable_Changes。
從 Perl 5.10.1 開始,有一個新的介面可用於插入和使用除預設值(線性深度優先搜尋)之外的方法解析順序。在 5.10.0 中新增的 C3 方法解析順序已重新實作為外掛程式,而不會變更其 Perl 空間介面。有關更多資訊,請參閱 perlmroapi。
overloading
pragma此 pragma 允許您針對部分或全部運算詞彙法地停用或啟用重載。(Yuval Kogman)
核心發行版現在可以在類 Unix 平台上並行執行其回歸測試。請勿執行 make test
,而是將環境中的 TEST_JOBS
設定為要並行執行的測試數量,並執行 make test_harness
。在類 Bourne 的 shell 中,可以這樣做
TEST_JOBS=3 make test_harness # Run 3 tests in parallel
使用環境變數,而不是並行 make 本身,因為 TAP::Harness 本身需要能夠排程個別非衝突的測試指令碼,而且沒有標準介面可供 make
工具程式與其工作排程器互動。
請注意,目前有些測試指令碼在並行執行時可能會失敗(最顯著的是 ext/IO/t/io_dir.t
)。如有必要,請再次循序執行失敗的指令碼,並查看失敗是否消失。
已新增一些 DTrace 支援。請參閱 INSTALL 中的「DTrace 支援」。
configure_requires
CPAN
和 CPANPLUS
現在都支援大多數最新 CPAN 發行版中包含的 META.yml
中繼資料檔案中的 configure_requires
關鍵字。這允許發行版作者指定在執行 Makefile.PL 或 Build.PL 之前必須安裝的組態先決條件。
請參閱 ExtUtils::MakeMaker
或 Module::Build
的文件,以進一步瞭解在為 CPAN 建立發行版時如何指定 configure_requires
。
autodie
這是 Fatal
模組的新的詞彙範圍替代方案。已套件版本為 2.06_01。請注意,在此版本中,在 autodie
生效時使用字串 eval 可能會導致 autodie 行為外洩到周圍的範圍。請參閱 autodie 中的「BUGS」 以取得更多詳細資料。
Compress::Raw::Bzip2
已新增至核心(版本 2.020)。
parent
此實用程式在編譯時建立與基底類別的 ISA 關係。它提供 base
的主要功能,但沒有功能蔓延。
Parse::CPAN::Meta
已新增至核心(版本 1.39)。
attributes
已從版本 0.08 升級至 0.09。
attrs
已從版本 1.02 升級至 1.03。
base
已從版本 2.13 升級至 2.14。請參閱 parent 以取得替代方案。
bigint
已從版本 0.22 升級至 0.23。
bignum
已從版本 0.22 升級至 0.23。
bigrat
已從版本 0.22 升級至 0.23。
charnames
已從版本 1.06 升級至 1.07。
已新增 Unicode NameAliases.txt 資料庫檔案。這會新增一些額外的 \N
字元名稱,這些名稱以前無法辨識;例如,"\N{LATIN CAPITAL LETTER GHA}"
。
constant
已從版本 1.13 升級至 1.17。
feature
:5.10
和 :5.10.X
功能套件的意義已略有變更。最後一個元件(如果有的話,即 X
)會直接略過。此舉預設新的功能通常不會新增至維護版本。因此,:5.10
和 :5.10.X
具有相同的效果。這是對 5.10.0 所記載行為的變更。
fields
已從版本 2.13 升級至 2.14(這只是版本升級;沒有任何功能變更)。
lib
已從版本 0.5565 升級至 0.62。
open
已從版本 1.06 升級至 1.07。
overload
已從版本 1.06 升級至 1.07。
overloading
請參閱上方的「overloading
pragma」。
version
已從版本 0.74 升級至 0.77。
Archive::Extract
已從版本 0.24 升級至 0.34。
Archive::Tar
已從版本 1.38 升級至 1.52。
Attribute::Handlers
已從版本 0.79 升級至 0.85。
AutoLoader
已從版本 5.63 升級至 5.68。
AutoSplit
已從版本 1.05 升級至 1.06。
B
已從版本 1.17 升級至 1.22。
B::Debug
已從版本 1.05 升級至 1.11。
B::Deparse
已從版本 0.83 升級至 0.89。
B::Lint
已從版本 1.09 升級至 1.11。
B::Xref
已從版本 1.01 升級至 1.02。
Benchmark
已從版本 1.10 升級至 1.11。
Carp
已從版本 1.08 升級至 1.11。
CGI
已從版本 3.29 升級至 3.43。(也包含 3.45 中的「popup_menu() 的預設值」修正程式)。
Compress::Zlib
從版本 2.008 升級至 2.020。
CPAN
從版本 1.9205 升級至 1.9402。CPAN::FTP
有個本機修正,可避免下載失敗時過於冗長。
CPANPLUS
從版本 0.84 升級至 0.88。
CPANPLUS::Dist::Build
從版本 0.06_02 升級至 0.36。
Cwd
從版本 3.25_01 升級至 3.30。
Data::Dumper
從版本 2.121_14 升級至 2.124。
DB
已從版本 1.01 升級至 1.02。
DB_File
從版本 1.816_1 升級至 1.820。
Devel::PPPort
從版本 3.13 升級至 3.19。
Digest::MD5
從版本 2.36_01 升級至 2.39。
Digest::SHA
從版本 5.45 升級至 5.47。
DirHandle
從版本 1.01 升級至 1.03。
Dumpvalue
從版本 1.12 升級至 1.13。
DynaLoader
從版本 1.08 升級至 1.10。
Encode
從版本 2.23 升級至 2.35。
Errno
已從版本 1.10 升級至 1.11。
Exporter
從版本 5.62 升級至 5.63。
ExtUtils::CBuilder
從版本 0.21 升級至 0.2602。
ExtUtils::Command
從版本 1.13 升級至 1.16。
ExtUtils::Constant
從 0.20 升級至 0.22。(請注意,這兩個版本都不在 CPAN 上提供。)
ExtUtils::Embed
從版本 1.27 升級至 1.28。
ExtUtils::Install
從版本 1.44 升級至 1.54。
ExtUtils::MakeMaker
從版本 6.42 升級至 6.55_02。
請注意,ExtUtils::MakeMaker::bytes
和 ExtUtils::MakeMaker::vmsish
已從此發行版本中移除。
ExtUtils::Manifest
從版本 1.51_01 升級到 1.56。
ExtUtils::ParseXS
從版本 2.18_02 升級到 2.2002。
Fatal
從版本 1.05 升級到 2.06_01。另請參閱新的 pragma autodie
。
File::Basename
從版本 2.76 升級到 2.77。
File::Compare
從版本 1.1005 升級到 1.1006。
File::Copy
從版本 2.11 升級到 2.14。
File::Fetch
從版本 0.14 升級到 0.20。
File::Find
從版本 1.12 升級到 1.14。
File::Path
從版本 2.04 升級到 2.07_03。
File::Spec
從版本 3.2501 升級到 3.30。
File::stat
從版本 1.00 升級到 1.01。
File::Temp
從版本 0.18 升級到 0.22。
FileCache
從版本 1.07 升級到 1.08。
FileHandle
從版本 2.01 升級到 2.02。
Filter::Simple
從版本 0.82 升級到 0.84。
Filter::Util::Call
從版本 1.07 升級到 1.08。
FindBin
從版本 1.49 升級到 1.50。
GDBM_File
從版本 1.08 升級到 1.09。
Getopt::Long
從版本 2.37 升級到 2.38。
Hash::Util::FieldHash
從版本 1.03 升級到 1.04。這修正了一個記憶體外洩問題。
I18N::Collate
從版本 1.00 升級到 1.01。
IO
從版本 1.23_01 升級到 1.25。
這讓非封鎖模式可以在 IO::Socket::INET
[CPAN #43573] 中於 Windows 上運作。
IO::Compress::*
從版本 2.008 升級至 2.020。
IO::Dir
已從版本 1.06 升級至 1.07。
IO::Handle
從版本 1.27 升級至 1.28。
IO::Socket
從版本 1.30_01 升級到 1.31。
IO::Zlib
從版本 1.07 升級到 1.09。
IPC::Cmd
從版本 0.40_1 升級到 0.46。
IPC::Open3
從版本 1.02 升級到 1.04。
IPC::SysV
從版本 1.05 升級到 2.01。
lib
已從版本 0.5565 升級至 0.62。
List::Util
從版本 1.19 升級到 1.21。
Locale::MakeText
從版本 1.12 升級至 1.13。
Log::Message
從版本 0.01 升級到 0.02。
Math::BigFloat
從版本 1.59 升級到 1.60。
Math::BigInt
從版本 1.88 升級到 1.89。
Math::BigInt::FastCalc
從版本 0.16 升級到 0.19。
Math::BigRat
從版本 0.21 升級到 0.22。
Math::Complex
從版本 1.37 升級到 1.56。
Math::Trig
從版本 1.04 升級到 1.20。
Memoize
從版本 1.01_02 升級到 1.01_03(僅為次要文件變更)。
Module::Build
從版本 0.2808_01 升級到 0.34_02。
Module::CoreList
從版本 2.13 升級到 2.18。此版本不再包含 %Module::CoreList::patchlevel
hash。
Module::Load
從版本 0.12 升級到 0.16。
Module::Load::Conditional
從版本 0.22 升級到 0.30。
Module::Loaded
從版本 0.01 升級到 0.02。
Module::Pluggable
從版本 3.6 升級到 3.9。
NDBM_File
從版本 1.07 升級到 1.08。
Net::Ping
從版本 2.33 升級到 2.36。
NEXT
從版本 0.60_01 升級到 0.64。
Object::Accessor
從版本 0.32 升級到 0.34。
OS2::REXX
從版本 1.03 升級到 1.04。
Package::Constants
從版本 0.01 升級到 0.02。
PerlIO
從版本 1.04 升級到 1.06。
PerlIO::via
從版本 0.04 升級到 0.07。
Pod::Man
從版本 2.16 升級到 2.22。
Pod::Parser
從版本 1.35 升級到 1.37。
Pod::Simple
從版本 3.05 升級到 3.07。
Pod::Text
從版本 3.08 升級到 3.13。
POSIX
已從版本 1.13 升級至 1.17。
Safe
從 2.12 升級到 2.18。
Scalar::Util
從版本 1.19 升級到 1.21。
SelectSaver
從 1.01 升級到 1.02。
SelfLoader
從 1.11 升級到 1.17。
Socket
從 1.80 升級到 1.82。
Storable
從 2.18 升級到 2.20。
Switch
從版本 2.13 升級到 2.14。請參閱 "已不建議使用"。
符號
已從版本 1.06 升級至 1.07。
Sys::Syslog
從版本 0.22 升級至 0.27。
Term::ANSIColor
從版本 1.12 升級至 2.00。
Term::ReadLine
從版本 1.03 升級到 1.04。
Term::UI
從版本 0.18 升級至 0.20。
Test::Harness
從版本 2.64 升級至 3.17。
請注意,從 2.x 升級至 3.x 的一個副作用是,實驗性的 Test::Harness::Straps
模組(及其支援的 Assert
、Iterator
、Point
和 Results
模組)已移除。如果您仍需要這些模組,它們可以在 CPAN 上的(未維護的)Test-Harness-Straps
套件中取得。
Test::Simple
從版本 0.72 升級至 0.92。
Text::ParseWords
從版本 3.26 升級至 3.27。
Text::Tabs
從版本 2007.1117 升級至 2009.0305。
Text::Wrap
從版本 2006.1117 升級至 2009.0305。
Thread::Queue
從版本 2.00 升級至 2.11。
Thread::Semaphore
從版本 2.01 升級至 2.09。
threads
從版本 1.67 升級至 1.72。
從版本 1.14 升級至 1.29。
Tie::RefHash
從版本 1.37 升級至 1.38。
Tie::StdHandle
此模組有文件變更,並首次指定版本:版本 4.2。
Time::HiRes
從版本 1.9711 升級至 1.9719。
Time::Local
從版本 1.18 升級至 1.1901。
Time::Piece
從版本 1.12 升級至 1.15。
Unicode::Normalize
已從版本 1.02 升級至 1.03。
Unicode::UCD
已從 0.25 版升級至 0.27 版。
charinfo()
現可處理新增至 Unicode 後續版本的統一 CJK 編碼點。
casefold()
已新增回傳欄位,提供更簡潔的介面和先前遺失的資訊。舊欄位已保留,以維持向後相容性。現已回傳有關突厥語系特定編碼點的資訊。
文件已修正並擴充。
UNIVERSAL
已從 1.04 版升級至 1.05 版。
Win32
已從 0.34 版升級至 0.39 版。
Win32API::File
已從 0.1001_01 版升級至 0.1101 版。
XSLoader
已從 0.08 版升級至 0.10 版。
現也會在 include-fixed
中尋找,這是 gcc 搜尋路徑最近新增的項目。
不再錯誤地將列舉值當成巨集處理 (Daniel Burr)。
現已在列舉中正確處理 C++ 風格常數 (//
)。(使用了 Rainer Weikusat 提供的修補程式;Daniel Burr 也提出了類似的修正建議)。
LVALUE
子程式現可在偵錯程式中運作。
偵錯程式現已正確處理代理常數子程式和子程式 stub。
Perl 5.10.1 新增了一個公用程式 perlthanks,這是 perlbug 的變體,但用於向 Perl 的作者和維護人員傳送非錯誤報告。只收到錯誤報告可能會令人有些沮喪:我們將看看這是否能改變現況。
其中包含如何為 Haiku 平台建置 perl 的說明。
其中說明了可插入方法解析順序的新介面。
這份文件由 Richard Foley 所撰寫,其中介紹了效能和最佳化技術的使用,特別是針對 perl 程式。
其中說明了如何使用 git 版本控制系統存取 perl 原始碼。
這說明新的 perlthanks 程式。
各種大型 Changes*
檔案(列出過去 18 年來對 perl 進行的每項變更)已被移除,並以一個小檔案取代,也稱為 Changes
,它僅說明如何從 git 版本控制系統中擷取相同的資訊。
Porting/patching.pod 檔案已被刪除,因為它主要是說明與舊的 Perforce 為基礎的儲存庫互動,而現在已過時。仍然相關的資訊已移至 perlrepository。
perlapi、perlintern、perlmodlib 和 perltoc 現在都在建置時產生,而不是作為發行的一部分發布。
新的內部快取表示 isa()
通常會更快。
在 use locale
下,與當地相關的資訊現在會快取在唯讀值中,例如 keys %hash
傳回的清單。這使得在 use locale
範圍內的運算,例如 sort keys %hash
,快上許多。
空的 DESTROY
方法不再被呼叫。
ext 中目錄的配置已進行修改。特別是,所有擴充功能現在都是扁平的,且位於頂層,路徑名稱中的 /
已由 -
取代,因此 ext/Data/Dumper/ 現在是 ext/Data-Dumper/,等等。指定給 Configure 的擴充功能名稱,以及 %Config::Config
在 dynamic_ext
、known_extensions
、nonxs_ext
和 static_ext
鍵下所報告的名稱並未變更,且仍使用 /
。因此,此變更在 perl 安裝後不會有任何影響。但是,Attribute::Handlers
、Safe
和 mro
現在已成為它們自己的擴充功能,因此如果您使用選項執行 Configure 以指定要建置的擴充功能的精確清單,則需要變更它來考量這一點。
對於 5.10.2,計畫將許多雙重生命週期的模組從 lib 移至 ext;這對已安裝的 perl 再次沒有影響,但如果您使用預先設定的擴充功能清單呼叫 Configure,則會有影響。
如果 vendorlib
和 vendorarch
相同,則只會將它們新增到 @INC
一次。
如果使用 -Dusedevel
建置 perl,則現在會定義 $Config{usedevel}
和 C 層級的 PERL_USE_DEVEL
。
如果編譯器支援,則 Configure 會啟用 -fstack-protector
的使用,以提供防範堆疊溢位攻擊的保護。
如果您使用 C++ 編譯器而非 C 編譯器,則 Configure 現在會判斷重新進入函式和 gconvert
的正確原型。
在 Unix 上,如果您從包含 git 儲存庫的樹狀結構建置,則組態程序會記錄您已簽出的提交雜湊,以顯示在 perl -v
和 perl -V
的輸出中。未推送到遠端的本機提交會自動新增到 perl -V
顯示的本機修補程式清單中。
作為 ext 扁平化的部分,所有平台上的所有擴充套件都是由 make_ext.pl 建置的。這取代了 Unix 專用的 ext/util/make_ext、VMS 專用的 make_ext.com 和 Win32 專用的 win32/buildext.pl。
已移除 AIX 5L 和 6.1 的 libbsd。libbsd 中只有使用 flock()。
已移除 AIX 5L 和 6.1 的 libgdbm。libgdbm 是作為 AIX Toolbox 的選用套件提供的。很不幸的是,64 位元版本已損毀。
提示變更表示 AIX 4.2 應該可以再次運作。
在 Cygwin 上,我們現在會從 DLL 中移除最後一個數字。這已成為 cygwin.com 建置多年的行為。提示檔案已更新。
提示檔案現在會識別 FreeBSD 7 和更新版本的正確執行緒函式庫。
我們現在會解決 Irix 6.5 編譯器中一個奇怪的預處理器錯誤:不幸的是,cc -E -
會進入 K&R 模式,但 cc -E file.c
卻不會。
已合併 Haiku 維護人員提供的修補程式。Perl 現在應該可以在 Haiku 上建置。
Perl 現在應可建置於 MirOS BSD 上。
提示現在支援版本 5.*。
已合併 Stratus 的各種變更。
現在支援 Symbian S60 3.2 SDK 和 S60 5.0 SDK。
改善的訊息視窗處理方式表示 alarm
和 kill
訊息將不再在競爭條件下遺失。
如果將 $/
設定為數字參考 (以表示記錄樣式讀取),從 PerlIO::scalar
的記憶體中暫存檔案讀取時會失敗。此問題現已修正。
VMS 現在支援 getgrgid
。
已對 VMS 檔案名稱處理和轉換程式碼進行許多改善和清理。
啟用 PERL_VMS_POSIX_EXIT
邏輯名稱現在會對 VMS 條件值編碼 POSIX 退出狀態,以與 GNV 的 bash shell 和依賴 POSIX 退出值的其它公用程式進行更好的互動。請參閱 "$?" in perlvms 以取得詳細資料。
5.10.0 無意間停用最佳化,這導致清單指派中出現可測量的效能下降,例如從 @_
指派函式參數時經常使用。最佳化已重新套用,效能回歸已修正。
修正 while (1) { map 1, 1 }
[RT #53038] 的記憶體外洩。
修正 PerlIO 中一些潛在的 core dump [RT #57322,54828]。
偵錯工具現在可與 lvalue 子常式一起使用。
偵錯工具的 m
指令在定義常數的模組上中斷 [RT #61222]。
crypt()
和字串補數可能會傳回未污染引數的污染值 [RT #59998]。
-i.suffix
命令列開關現在會使用受限權限重新建立檔案,然後再變更其模式以符合原始檔案。這消除了潛在的競爭條件 [RT #60904]。
在某些 Unix 系統上,即使子程式核心傾印,$?
中的值也不會設定最高位元 ($? & 128
)。
在某些情況下,$^R 可能會不正確地變成未定義 [RT #57042]。
(XS) 在各種雜湊函式中,當金鑰為 UTF-8 時傳遞預先計算的雜湊可能會導致不正確的查詢。
(XS) 在 perl.h 之前包含 XSUB.h 會產生編譯時間錯誤 [RT #57176]。
如果封包 Foo
不存在,$object->isa('Foo')
會回報 false,即使物件的 @ISA
包含 Foo
。
已經找到並修正了透過操作 @ISA
觸發的 5.10.0 mro 程式碼中各種錯誤。
對參考進行位元運算可能會使直譯器當機,例如 $x=\$y; $x |= "foo"
[RT #54956]。
包含交替的模式可能會對內部 UTF-8 表示敏感,例如
my $byte = chr(192);
my $utf8 = chr(192); utf8::upgrade($utf8);
$utf8 =~ /$byte|X}/i; # failed in 5.10.0
在 UTF8 編碼的 Perl 原始檔中(即 use utf8
生效時),如果 \xNN
、\0NNN
或 \N{}
後面跟著序數值大於 255 的字元字面值,雙引號字串字面值可能會損毀 [RT #59908]。
B::Deparse
無法正確地解析各種結構:readpipe STRING
[RT #62428]、CORE::require(STRING)
[RT #62488]、sub foo(_)
[RT #62484]。
不帶引數使用 setpgrp()
會損毀 perl 堆疊。
eval
的區塊形式現在可以由 Safe
和 ops
特別攔截。以前它被錯誤地視為字串 eval
。
在 5.10.0 中,兩個字元 [~
有時會被解析為智慧比對運算子 (~~
) [RT #63854]。
在 5.10.0 中,模式中的 *
量詞有時會被視為 {0,32767}
[RT #60034、#60464]。例如,這個比對會失敗
("ab" x 32768) =~ /^(ab)*$/
shmget
在 64 位元作業系統上限制為 32 位元區段大小 [RT #63924]。
不再使用 next
或 last
退出 given
區塊會產生像以下的虛假警告
Exiting given via last at foo.pl line 123
在 Windows 上,'.\foo'
和 '..\foo'
的處理方式與 do
和 require
中的 './foo'
和 '../foo'
不同 [RT #63492]。
將格式指定給 glob 會損毀格式;例如
*bar=*foo{FORMAT}; # foo format now bad
嘗試將型別 glob 轉換為字串或數字可能會導致斷言失敗。現在會產生正確的錯誤訊息,無法將 GLOB 轉換為 $type
。
在 use filetest 'access'
下,-x
使用錯誤的存取模式。此問題已修正 [RT #49003]。
length
在傳回 Unicode 值的繫結標量上第一次執行時不會正確。此問題已修正。
在陣列 tie
內使用陣列 tie
可能會造成 SEGV。此問題已修正。[RT #51636]
已識別並修正 PerlIOStdio_close()
內部的競爭條件。此問題過去會造成各種執行緒問題,包括 SEGV。
在 unpack
中,在標量內容使用 ()
群組會在內部將清單置於直譯器的堆疊中,並以各種方式表現出來,包括 SEGV。此問題現已修正 [RT #50256]。
在 substr
、\&$x
、tie $x, $m
和 chop
中,會兩次呼叫魔法。這些問題已全部修正。
已還原 5.10.0 最佳化,以清除 s///ge
隱式迴圈中的暫時堆疊,因為它會導致直譯器中看似無關部分出現不明顯的錯誤 [提交 ef0d4e17921ee3de]。
elsif
內部警告的行號現已正確。
..
算子現已正確地與範圍運作,其終點位於最小和最大整數的值或接近其值。
binmode STDIN, ':raw'
可能會在某些平台上導致分段錯誤。此問題已修正 [RT #54828]。
由於一項少算一個的錯誤,index $str, ...
實際上會執行為 index "$str\0", ...
。此問題已修正 [RT #53746]。
已修正與正規表示式中命名擷取相關的各種洩漏 [RT #57024]。
對雜湊的弱參考會洩漏。此問題會影響 DBI
[RT #56908]。
在正規表示式中使用 (?|) 可能會造成分段錯誤 [RT #59734]。
在封閉中使用 UTF-8 tr//
可能會造成分段錯誤 [RT #61520]。
呼叫 sv_chop()
或以其他方式升級 SV 可能會在 SPARC 架構上導致未對齊的 64 位元存取 [RT #60574]。
在 5.10.0 版本中,inc_version_list
會在 5.8.*
之後錯誤地列出 5.10.*
;這會影響 @INC
搜尋順序 [RT #67628]。
在 5.10.0 中,pack "a*", $tainted_value
會傳回非污染值 [RT #52552]。
在 5.10.0 中,printf
和 sprintf
在列印 UTF-8 字串時可能會產生致命錯誤 panic: utf8_mg_pos_cache_update
[RT #62666]。
在 5.10.0 版本中,動態建立的 AUTOLOAD
方法可能會遺失(方法快取問題)[RT #60220,60232]。
在 5.10.0 版本中,use feature
和 //ee
的組合可能會造成記憶體洩漏 [RT #63110]。
如果在命令列上也指定 -C
,則在 shebang (#!
) 行上使用 -C
再次被允許。如果 shebang 行上的 -C
沒有 在命令列上也指定,它過去會是靜默的無效操作,因此 perl 5.10.0 禁止它,這會中斷一些指令碼。現在 perl 會檢查它是否也在命令列上,並且只有在它不在時才會終止 [RT #67880]。
在 5.10.0 中,某些類型的重新進入正規表示式可能會崩潰,或導致以下斷言失敗 [RT #60508]
Assertion rx->sublen >= (s - rx->subbeg) + i failed
panic: sv_chop %s
當 C 常式 Perl_sv_chop()
傳遞一個不在標量字串緩衝區內的位址時,會發生這個新的致命錯誤。這可能是由有問題的 XS 碼造成的,此時無法復原。
找不到套件 %s 作為 %s 的父層
此警告已移除。通常,它只會與其他警告一起產生,而移除它可以新增 ISA 查詢最佳化。
v-字串在使用中/require 是非可攜的
此警告已移除。
對子常式 "%s" 進行深度遞迴
現在可以透過重新編譯 perl 二進位檔,將此警告的深度閾值從預設的 100 變更,方法是將 C 預處理器巨集 PERL_SUB_DEPTH_WARN
設定為所需的值。
C 原始檔開頭的 J.R.R. Tolkien 名言已檢查過,並新增正確的引文,感謝 Tom Christiansen 提供的修補程式。
vcroak()
現在接受空的第一個引數。此外,對「非 NULL」編譯器註解進行了完整的稽核,並修正了其他幾個內部函式的註解。
已新增新的巨集 dSAVEDERRNO
、dSAVE_ERRNO
、SAVE_ERRNO
、RESTORE_ERRNO
,以正式儲存 errno
變數的暫時儲存。
已新增函式 Perl_sv_insert_flags
以擴充 Perl_sv_insert
。
已新增函式 Perl_newSV_type(type)
,等同於 Perl_newSV()
後接 Perl_sv_upgrade(type)
。
已新增函式 Perl_newSVpvn_flags()
,等同於 Perl_newSVpvn()
,然後執行與旗標相關的動作。
目前支援兩個旗標位元。
SVf_UTF8
這會為您呼叫 SvUTF8_on()
。(請注意,這不會將 ISO 8859-1 字元序列轉換為 UTF-8)。可使用包裝函式 newSVpvn_utf8()
來執行此動作。
SVs_TEMP
在新的 SV 上呼叫 sv_2mortal()
。
還有一個包裝器接受常數字串,newSVpvs_flags()
。
函數 Perl_croak_xs_usage
已新增為 Perl_croak
的包裝器。
函數 PerlIO_find_layer
和 PerlIO_list_alloc
現在已匯出。
PL_na
已從核心程式碼中移除,改用區域性 STRLEN 暫存器或 *_nolen()
呼叫。這兩種方法都比 PL_na
快,後者在 ithreads 中會對解釋器結構進行指標解除參照,否則會是一個全域變數。
Perl_mg_free()
過去會讓已釋放的記憶體可透過標量上的 SvMAGIC() 存取。現在它會更新連結清單,移除每個已釋放的魔法。
在 ithreads 中,PL_reg_curpm
中的正規表示式現在是參考計數。這消除了許多因應它不是參考計數的權宜解決方法。
Perl_mg_magical()
有時會錯誤地開啟 SvRMAGICAL()
。此問題已修正。
如果字串值有尾隨「垃圾」,現在不會設定公開 IV 和 NV 旗標。此行為與在值超出類型範圍時不設定公開 IV 或 NV 旗標一致。
已將 SV 分配追蹤新增至由 -Dm
啟用的診斷中。如果在編譯 perl 二進位檔時已啟用,追蹤也可以透過 PERL_MEM_LOG
機制輸出。
核心程式碼和非雙重生命週期模組中已將 Nullav
、Nullcv
、Nullhv
、Nullop
、Nullsv
等的用法替換為 NULL
,因為 NULL
對不熟悉核心程式碼的人來說較為清楚。
已新增巨集 MUTABLE_PTR(p)
,在 (非吹毛求疵的) gcc 上,它不會捨棄 const
,傳回 void *
。巨集 MUTABLE_SV(av)
、MUTABLE_SV(cv)
等建立在這個巨集之上,轉換為 AV *
等,但不捨棄 const
。這允許在核心程式碼中適當地進行編譯時間審查,以確保 const
正確,並協助找出一些錯誤 (現在已修正)。
已新增巨集 mPUSHs()
和 mXPUSHs()
,用於將 SV 推入堆疊並將其轉為 mortal。
私人結構 mro_meta
的用法已略有變更。無論如何,核心程式碼以外的程式碼都不應直接存取這個結構。
已新增一個新工具 Porting/expand-macro.pl
,它允許您在編譯時檢視 C 預處理器巨集的擴充方式。這在嘗試解碼 perl 內部結構的巨集地獄時非常方便。
從 CPAN 更新的許多模組都包含新的測試。
如果失敗,幾個可能會永遠掛起的測試現在會納入「看門狗」功能,在逾時後將其終止,這有助於確保 make test
和 make test_harness
自動執行完畢。(Jerry Hedden)
已新增一些核心特定測試
檢查偵錯器是否可以保留來自 eval
的原始碼行。
檢查錯誤層會失敗。
檢查 PerlIO 層不會洩漏。
檢查某些特殊形式的 open 是否有效。
PerlIO 一般測試。
檢查內部類型 PVBM
和 PVGV
之間沒有意外互動。
檢查在別名套件存在的情況下,mro 是否正常運作。
dbmopen
和 dbmclose
的測試。
index
和執行緒互動的測試。
深奧模式和執行緒互動的測試。
測試 qr
沒有洩漏。
正則表達式遞迴和執行緒互動的測試。
模式和嵌入 qr//
以及執行緒互動的測試。
正則表達式中 Unicode 屬性的測試。
Unicode 屬性和執行緒互動的測試。
測試 Tie::Hash::NamedCapture
的綁定方法。
檢查 POSIX 字元類別是否行為一致。
檢查 universal.c 中可匯出的 re
函式是否有效。
檢查 setpgrp
是否運作正常。
測試 substr
和執行緒的互動。
檢查升級和指定純量是否運作正常。
檢查詞法分析器中的 Unicode 是否運作正常。
檢查 Unicode 和 tie
是否運作正常。
以下是部分重大未修復的錯誤清單,這些錯誤是從 5.10.0 或 5.8.x 回歸的。
List::Util::first
在存在詞法 $_
(通常由 my $_
導入或由 given
隱含導入)時會出現異常行為。每個反覆運算所設定的變數是套件變數 $_
,而不是詞法 $_
[RT #67694]。
類似問題可能會發生在其他提供函數的模組中,這些函數將區塊作為其第一個引數,例如
foo { ... $_ ...} list
當插補正規表示式時,charnames
實用程式可能會產生執行時期錯誤 [RT #56444]
use charnames ':full';
my $r1 = qr/\N{THAI CHARACTER SARA I}/;
"foo" =~ $r1; # okay
"foo" =~ /$r1+/; # runtime error
解決方法是在正規表示式外部產生字元
my $a = "\N{THAI CHARACTER SARA I}";
my $r1 = qr/$a/;
與編譯模式的執行緒相比,在子執行緒中執行時,某些正規表示式可能會執行得慢得多 [RT #55600]。
下列項目現已棄用。
Switch
有錯誤,應避免使用。從 Perl 5.11.0 起,預計任何使用此模組的核心版本都會發出警告,而此模組最終將從核心移除(可能在 Perl 5.14.0 中)。請參閱 perlsyn 中的「Switch 陳述式」以取得其替代方案。
suidperl
將在 5.12.0 中移除。這提供了一種機制,可以在不適當地支援它系統上模擬 setuid 權限位元。
此版本中的一些工作是由 TPF 補助金資助的。
Nicholas Clark 在 2008 年底正式退休,不再擔任維護 pumpking 的職務;然而,實際上他從那時起就投入了許多心力,協助讓 5.10.1 進入適合發布的狀態,包括撰寫了這份 perldelta 的相當一部分。
特別是 Steffen Mueller 和 David Golden 協助讓 CPAN 模組得到改善,並與其核心等效模組同步。
Craig Berry 不知疲倦地讓維護在 VMS 下執行,無論我們為他中斷了多少次。
其他核心提交者貢獻了大部分變更,並套用由列於 AUTHORS 中的數百位貢獻者所發送的大部分修補程式。
(對於所有我未指名的人,在此致歉)。
最後,感謝 Larry Wall,沒有他,這些都不會是必要的。
如果你發現你認為是錯誤的問題,你可以查看最近張貼到 comp.lang.perl.misc 新聞群組的文章和 http://rt.perl.org/perlbug/ 上的 perl 錯誤資料庫。Perl 首頁 http://www.perl.org/ 上也可能有資訊。
如果你相信你有一個未回報的錯誤,請執行發行版隨附的 perlbug 程式。務必將你的錯誤修剪成一個微小但足夠的測試案例。你的錯誤回報,連同 perl -V
的輸出,將會傳送至 perlbug@perl.org,供 Perl 移植團隊分析。
如果你回報的錯誤具有安全性影響,不適合傳送至公開封存的郵件清單,請將其傳送至 perl5-security-report@perl.org。這會指向一個封閉訂閱的未封存郵件清單,其中包括所有核心提交者,他們將能夠協助評估問題的影響、找出解決方案,並協助協調在 Perl 受支援的所有平台上發布修補程式以減輕或修正問題。請僅將此地址用於 Perl 核心中的安全性問題,而不是用於在 CPAN 上獨立發布的模組。
Changes 檔案,說明如何查看已變更內容的詳盡詳細資料。
INSTALL 檔案,說明如何建置 Perl。
README 檔案,提供一般資訊。
Artistic 和 Copying 檔案,提供版權資訊。