perl589delta - perl v5.8.9 的新功能
本文件描述了 5.8.8 版本與 5.8.9 版本之間的差異。
5.8.9 版本將是 5.8.x 系列的最後一個重要版本。未來的 5.8.x 版本可能只會用於處理安全問題和平台構建失敗。因此,如果您還沒有開始,您應該考慮遷移到 5.10.x。請參見“已知問題”以獲取更多信息。
在 C++ 中編寫的擴展源代碼中可能需要更改特定的構造。有關詳細信息,請參見“已更改的內部結構”。所有用 C 編寫的擴展,大多數用 C++ 編寫的擴展,以及所有現有的編譯擴展都不受影響。這是為了改進 C++ 支援。
除此之外,沒有故意與 5.8.8 不兼容的更改。如果有任何存在,它們就是錯誤,歡迎報告。
Perl 5.8 中所包含的 Unicode 字符數據庫副本已從 4.1.0 更新至 5.1.0。請參閱 http://www.unicode.org/versions/Unicode5.1.0/#NotableChanges 以查看重要更改。
現在可以在目錄處理程序上調用 stat
和 -X
文件狀態運算符。由於目錄和文件處理程序都是裸字,因此可能會導致有關所需處理程序的歧義。在這些情況下,將優先考慮文件處理程序語義。兩者還將 *FILE{IO}
文件處理程序視為 *FILE
文件處理程序。
現在可以通過在鉤子返回的文件處理程序上添加源碼過濾器來增強 @INC 中的子程序鉤子機制。這個功能早就計劃好了,但直到現在才真正發揮作用。有關詳細信息,請參見 "require" in perlfunc。(Nicholas Clark)
常量折疊例程現在包裹在異常處理程序中,如果折疊引發異常(例如試圖評估 0/0),perl 現在會保留當前的 optree,而不是中止整個程序。沒有這個更改,如果程序中有產生異常的表達式,則它們在運行時永遠不會被執行,那些程序將無法編譯。(Nicholas Clark,Dave Mitchell)
no VERSION
現在可以使用 no
後跟版本號來指定您要使用比指定版本舊的 perl 版本。
用於緩存字符串中字符偏移量的計算的代碼已被重寫。已經定位並消除了幾個錯誤,現在該代碼更好地利用了它所擁有的信息,因此應該更快。特別是,它不會在計算字符串內的偏移量之前掃描字符串的末尾,這應該加快對長字符串的某些操作。現在可以在運行時禁用緩存代碼,以驗證它是否不是懷疑問題的原因。
現在支援使用Configure在執行時建立可重新定位的 Perl 樹。請參閱"可重新定位的安裝"。
${^CHILD_ERROR_NATIVE}
此變數提供最後一次管道關閉、反引號命令、成功調用wait
或waitpid
,或從system
運算子返回的本機狀態。有關詳細信息,請參閱perlvar。(由 Gisle Aas 貢獻。)
${^UTF8CACHE}
此變數控制內部 UTF-8 偏移緩存代碼的狀態。1 表示啟用(默認值),0 表示禁用,-1 表示通過對所有結果進行線性掃描來調試緩存代碼,並在任何差異時恐慌。
readpipe
現在可以被覆寫內置函數readpipe
現在可以被覆寫。覆寫它也允許覆寫其運算子對應物,qx//
(也稱為``
)。
Perl 5.8.9(以及 5.10.0 後續版本)現在提供了一些宏來在 XS 模塊中進行非常基本的例外處理。如果您調用可能會croak
的代碼,但需要在將控制權返回給 Perl 之前進行一些清理,則可以使用這些宏。有關更多詳細信息,請參閱perlguts 中的“例外處理”。
-Dq
可壓制在-D
下運行時的EXECUTING...消息
-Dl
記錄 runops 循環的進入和退出,以及跳轉級別的彈出
-Dv
在跟踪輸出中顯示進程 ID。
某些正則表達式引擎正在使用的純 Perl 代碼以加快執行速度重新實現為 XS。這些代碼用於檢索 Unicode 屬性和轉換映射。(SADAHIRO Tomoyuki)
解釋器內部現在支援一種更加節省內存的內嵌常量形式。將對常量值的引用存儲在符號表中等同於一個完整的引用常量子程序,但使用的內存約少 400 個字節。如果必要,此代理常量子程序將自動升級為具有子程序的真實符號表。所採取的方法類似於用於子程序存根聲明的現有空間優化,其存儲為普通純量,而不是完整的符號表。
然而,為了幫助現有代碼的向後兼容性,該特性(錯誤地)不期望在符號表中除了類型糾結之外的任何東西,核心中沒有使用此功能,除了回歸測試。
從5.005開始,原型化子程式的存根已經以純字符串形式存儲在符號表中,而未原型化的子程式的存根則為-1,因此假設核心只在符號表中放置類型糾結的代碼已經做出了超過10年的錯誤假設。
新增編譯支持:
DragonFlyBSD
MidnightBSD
MirOS BSD
RISC OS
Cray XT4/Catamount
Module::Pluggable
是一個簡單的框架,用於創建接受可插拔子模組的模組。打包版本為3.8
Module::CoreList
是一個哈希的哈希,以perl版本(如$]
中所示)為鍵。打包版本為2.17
Win32API::File
現在在Microsoft Windows上的核心中可用。打包版本為0.1001_01
Devel::InnerPackage
查找單個文件定義的所有包。它是Module::Pluggable
分發的一部分。打包版本為0.3
attributes
升級到版本0.09
AutoLoader
升級到版本5.67
AutoSplit
升級到1.06
autouse
升級到版本1.06
B
從1.09_01升級到1.19
提供了新的與pad相關的抽象宏B::NV::COP_SEQ_RANGE_LOW
、B::NV::COP_SEQ_RANGE_HIGH
、B::NV::PARENT_PAD_INDEX
、B::NV::PARENT_FAKELEX_FLAGS
,它在5.10.0及以後的版本中隱藏了存儲的差異。
提供了B::sub_generation
,它暴露了PL_sub_generation
提供了B::GV::isGV_with_GP
,在pre-5.10版本的perl中始終返回true。
添加了新類型B::HE
,具有方法VAL
、HASH
和SVKEY_force
當代理常量子程序被導入時,現在正確設置了B::GVf_IMPORTED_CV
標誌。
修復了對PMOP
的處理中的錯誤。
B::BM::PREVIOUS
現在返回U32
,而不是U16
。B::CV::START
和B:CV::ROOT
現在在XSUB上返回NULL
,B::CV::XSUB
和B::CV::XSUBANY
在非XSUB上返回0。
B::C
升級到1.05
B::Concise
升級到0.76
新選項 -src
導致每個語句(從下一個狀態 OP 開始)的渲染在其生成之前都會加上生成它的源代碼的第一行。
新選項 -stash="somepackage"
,require
"somepackage",然後渲染其命名空間中定義的每個函數。
現在有詳細提示符號的文檔。
B::Debug
升級到版本 1.05
B::Deparse
升級到版本 0.87
正確地反編譯 print readpipe $x, $y
。
現在正確處理 ''->()
,::()
,sub :: {}
,等 [RT #43010]。解析這些類型語法的所有錯誤都已修復
perl -MO=Deparse -e '"my %h = "->()'
perl -MO=Deparse -e '::->()'
perl -MO=Deparse -e 'sub :: {}'
perl -MO=Deparse -e 'package a; sub a::b::c {}'
perl -MO=Deparse -e 'sub the::main::road {}'
不反編譯 $^H{v_string}
,該變量由內部自動設置。
B::Lint
升級到版本 1.11
B::Terse
升級到版本 1.05
base
升級到版本 2.13
通過 base.pm 載入模塊將屏蔽該模塊中的全局 $SIG{__DIE__}
。
一次將所有類推送到 @ISA
中
Benchmark
升級到版本 1.10
bigint
升級到版本 0.23
bignum
升級到版本 0.23
bigrat
升級到版本 0.23
blib
升級到版本 0.04
Carp
升級到版本 1.10
參數回溯代碼現在將 undef
顯示為 undef
,而不是字符串 "undef"。
CGI
升級到版本 3.42
charnames
升級到版本 1.06
constant
升級到版本 1.17
CPAN
升級到版本 1.9301
Cwd
升級到版本 3.29,具有一些特定平台的改進(包括 VMS)。
Data::Dumper
升級到版本 2.121_17
修復了純 Perl 版本的哈希迭代器當前位置 [RT #40668]
性能增強,在重複調用 C 的 realloc()
較慢的平台上效果最顯著,如 Win32。
DB_File
升級到版本 1.817
DB_Filter
升級到版本 0.02
Devel::DProf
升級到版本 20080331.00
Devel::Peek
升級到版本 1.04
Devel::PPPort
升級到版本 3.14
診斷
已升級至版本 1.16
摘要
已升級至版本 1.15
摘要::MD5
已升級至版本 2.37
DirHandle
已升級至版本 1.02
現在在關閉目錄處理前區域化 $.
, $@
, $!
, $^E
和 $?
,以防止洩漏已經關閉的目錄處理的任何警告的副作用。
DynaLoader
已升級至版本 1.09
DynaLoader
現在可以動態載入具有非默認文件擴展名的文件中的可加載對象。
編碼
已升級至版本 2.26
編碼::別名
包含對在 Solaris 上編碼 "646"(更為人所知的 ASCII)的修復。
英文
已升級至版本 1.03
Errno
已升級至版本 1.10
出口商
已升級至版本 5.63
ExtUtils::Command
已升級至版本 1.15
ExtUtils::Constant
已升級至版本 0.21
ExtUtils::Embed
已升級至版本 1.28
ExtUtils::Install
已升級至版本 1.50_01
ExtUtils::Installed
已升級至版本 1.43
ExtUtils::MakeMaker
已升級至版本 6.48
支持 INSTALLSITESCRIPT
和 INSTALLVENDORSCRIPT
配置。
ExtUtils::Manifest
已升級至版本 1.55
ExtUtils::ParseXS
已升級至版本 2.19
致命
已升級至版本 1.06
允許在 CORE::GLOBAL
中的內建函數設置為致命。
Fcntl
已升級至版本 1.06
字段
已升級至版本 2.12
File::Basename
已升級至版本 2.77
FileCache
已升級至版本 1.07
File::Compare
已升級至版本 1.1005
File::Copy
已升級至版本 2.13
現在使用三個參數的開放。
File::DosGlob
已升級至版本 1.01
File::Find
已升級至版本 1.13
File::Glob
已升級至版本 1.06
修復了大括號內部括號的不實結果。
File::Path
已升級至版本 2.07_02
File::Spec
已升級至版本 3.29
對壞參數的處理得到改進。
一些特定平台的改進(包括 VMS 和 Cygwin),在處理相對參數時對 abs2rel
進行了優化。
File::stat
已升級至版本 1.01
File::Temp
已升級至版本 0.20
檔案測試
已升級至版本 1.02
Filter::Util::Call
升級至版本 1.07
Filter::Simple
升級至版本 0.83
FindBin
升級至版本 1.49
GDBM_File
升級至版本 1.09
Getopt::Long
升級至版本 2.37
Getopt::Std
升級至版本 1.06
Hash::Util
升級至版本 0.06
if
升級至版本 0.05
IO
升級至版本 1.23
減少對 IO::Socket
中 getpeername
的呼叫次數
IPC::Open
升級至版本 1.03
IPC::Open3
升級至版本 1.03
IPC::SysV
升級至版本 2.00
lib
升級至版本 0.61
避免關於載入 .par 檔案的警告。
libnet
升級至版本 1.22
List::Util
升級至版本 1.19
Locale::Maketext
升級至版本 1.13
Math::BigFloat
升級至版本 1.60
Math::BigInt
升級至版本 1.89
Math::BigRat
升級至版本 0.22
實作新的 as_float
方法。
Math::Complex
升級至版本 1.54。
Math::Trig
升級至版本 1.18。
NDBM_File
升級至版本 1.07
改善使用 GDBM 相容性標頭的系統中的 g++ 處理。
Net::Ping
升級至版本 2.35
NEXT
升級至版本 0.61
修復了幾個與 NEXT
相關的錯誤,當與 AUTOLOAD
、eval
區塊以及在重載的字符串化中使用時。
ODBM_File
升級至版本 1.07
open
升級至版本 1.06
ops
升級至版本 1.02
PerlIO::encoding
升級至版本 0.11
PerlIO::scalar
升級至版本 0.06
[RT #40267] PerlIO::scalar
不尊重唯讀性。
PerlIO::via
升級至版本 0.05
Pod::Html
升級至版本 1.09
Pod::Parser
升級至版本 1.35
Pod::Usage
升級至版本 1.35
POSIX
升級至版本 1.15
POSIX
常數與 Fcntl
中的常數重複時,現在從 Fcntl
中導入並重新導出,而不是由 POSIX
重複。
POSIX::remove
可以刪除空目錄。
POSIX::setlocale
多次呼叫更安全。
POSIX::SigRt
添加,它在支持的系統上提供對 POSIX 實時信號功能的訪問。
re
升級至版本 0.06_01
Safe
升級至版本 2.16
Scalar::Util
升級至版本 1.19
SDBM_File
升級至版本 1.06
SelfLoader
升級至版本 1.17
Shell
升級至版本 0.72
sigtrap
升級至版本 1.04
Socket
升級至版本 1.81
修復了對 gethostbyname
的樂觀使用
Storable
升級至版本 2.19
Switch
升級至版本 2.13
Sys::Syslog
升級至版本 0.27
Term::ANSIColor
升級至版本 1.12
Term::Cap
升級至版本 1.12
Term::ReadLine
升級至版本 1.03
Test::Builder
升級至版本 0.80
Test::Harness
升級至版本 2.64
現在能夠處理換行符號。
Test::More
升級至版本 0.80
Test::Simple
升級至版本 0.80
Text::Balanced
升級至版本 1.98
Text::ParseWords
升級至版本 3.27
Text::Soundex
升級至版本 3.03
Text::Tabs
升級至版本 2007.1117
Text::Wrap
升級至版本 2006.1117
Thread
升級至版本 2.01
Thread::Semaphore
升級至版本 2.09
Thread::Queue
升級至版本 2.11
新增了對於複雜結構(例如哈希的哈希)添加到隊列的功能。
新增了一次從隊列中出隊多個項目的功能。
新增了用於檢視和操作隊列的新方法:peek
、insert
和 extract
Tie::Handle
升級至版本 4.2
Tie::Hash
升級至版本 1.03
Tie::Memoize
升級至版本 1.1
Tie::Memoize::EXISTS
現在正確地緩存其結果。
Tie::RefHash
升級至版本 1.38
Tie::Scalar
升級至版本 1.01
Tie::StdHandle
升級至版本 4.2
Time::gmtime
升級至版本 1.03
Time::Local
升級至版本 1.1901
Time::HiRes
升級至版本 1.9715,包括各種構建改進(包括 VMS)和輕微的特定平台的錯誤修復(包括 HP-UX 11 ia64)。
threads
升級至版本 1.71
新增了線程狀態信息方法:is_running
、is_detached
和 is_joinable
。 list
方法增強以返回運行或可加入的線程。
新增了線程信號方法:kill
新增了指定線程堆棧大小的功能。
新增了控制線程退出行為的功能。新增了一個新的 exit
方法。
threads::shared
升級至版本 1.27
更小更快的實現,消除了一個內部結構和相應的間接層級。
現在以更安全的方式存儲用戶鎖。
新功能 shared_clone
創建了一個對象的副本,保留共享元素並深度克隆非共享元素。
新增了新的 is_shared
方法。
Unicode::Normalize
升級至版本 1.02
Unicode::UCD
升級至版本 0.25
warnings
升級至版本 1.05_01
Win32
升級至版本 0.38
新增了新功能 GetCurrentProcessId
,可以返回當前進程的常規 Windows 進程識別符,即使在 fork 內調用也可以。
XSLoader
升級至版本 0.10
XS::APItest
和 XS::Typemap
僅供內部使用,因此不再安裝。在 XS::APItest
中添加了更多測試。
Andreas König 貢獻了兩個功能,用於保存和加載調試器歷史記錄。
NEXT::AUTOLOAD
在調試器下不再發出警告。
調試器現在應該能夠在 OS X 10.5 和 VMS 上正確找到 tty 設備,即使程序進行 fork
。
LVALUE 子程序現在可以在調試器內正常工作。
Perl 5.8.9 新增了一個新的實用工具 perlthanks,這是 perlbug 的一個變體,用於向 Perl 的作者和維護者發送非錯誤報告。只收到錯誤報告可能會讓人感到有點沮喪 - 我們將看看這是否會改變情況。
perlbug 現在會檢查您是否在報告非核心模塊,並建議您將其報告給 CPAN 作者。
不會將空字符串定義為常量 [RT #25366]
有關 h2xs -X
的示例
現在試圖合理處理 #include
語句中 ""
和 <>
引號之間路徑影響的差異。
現在為 #if defined A || defined B
生成正確的代碼 [RT #39130]
像往常一樣,文檔進行了修正、澄清和其他小修復。為索引添加了更多 標籤。
perlunitut 是由 Juerd Waalboer 撰寫的關於 Unicode 相關術語以及如何在 Perl 腳本中正確處理 Unicode 的教程。
perlunicode 在用戶定義屬性部分進行了更新。
perluniintro 在檢測特定編碼中無效數據的示例中進行了更新。
perlcommunity 提供了 Perl 社區的概述以及更多資源。
CORE 文檔是關於 Perl 核心例程的虛擬命名空間的。
perlglossary 新增了已棄用的模組和功能以及待捨棄的模組。
perlhack 已更新並新增了關於煙測的資源。
Perl 常見問題(perlfaq1..perlfaq9)已更新。
perlcheat 更新了有關\w
、\d
和\s
的詳細資訊。
perldebug 更新了有關如何調用除錯器的資訊。
perldiag 文件更新了對於 exists
和 delete
的參數為具有和符號的子程式的說明,並且還更新了有關警告的一些術語。
perlfork 文件記載了偽進程內部 exec
的限制。
在 caller
和 pop
部分修正了文件。
在 alarm
函數中現在提到了優先使用 Time::HiRes::ualarm
而不是 select
。
關於-X
中的優先順序,檔案測試運算子與一元運算子相同,但解析和括號不同(由Eirik Berg Hanssen發現)。
reverse
函數文件新增了標量上下文的示例。
perllocale 文件調整了數字本地化和 POSIX::setlocale
,以修復 Debian bug #379463。
perlmodlib 已更新包括 CPAN::API::HOWTO
和 Sys::Syslog::win32::Win32
perlre 文件更新以反映 [[:xxxxx:]]
和 \p{IsXxxxx}
匹配之間的差異。還新增了關於 /g
和 /c
修飾符的部分。
perlreguts 描述了正則表達式引擎的內部結構。由Yves Orton提供。
perlrebackslash 描述了所有 perl 正則表達式反斜線和逸出序列。
perlrecharclass 描述了 Perl 正則表達式中字符類的語法和用法。
perlrun 更新以澄清雜湊種子 PERL_HASH_SEED。還有有關選項 -x
和 -u
的更多資訊。
perlsub 中的範例已更新以使用 opendir
語法的詞法變數。
perlvar 修正了關於實際 GID $(
和有效 GID $)
的混淆。
在 "Queues: Passing Data Around" in perlthrtut 和 perlthrtut 中修正了 Perl 线程教程的範例。
perlhack 文件由Jarkko Hietaniemi和其他人大幅改善。
perltoot 提供了修改 @UNIVERSAL::ISA
的資訊。
perlport 文件擴展了在 Windows 上不同 kill(-9, ...)
語義的說明。它也清楚地指出在 Win32 和 cygwin 上不支援 dump
。
INSTALL 已更新並現代化。
自從 Perl 5.000 起,perl 的默認行為是在每個新的 typeglob 中創建一個空的 scalar。由於越來越多地使用 lexical 變量,現在大多數情況下都是未使用的。感謝 Nicholas Clark 的努力,Perl 現在可以編譯時使用 -DPERL_DONT_CREATE_GVSV
選項來避免創建這些空的 scalars。這將顯著減少所有配置所分配的 scalars 數量,以及創建 ithread 時需要複製的 scalars 數量。雖然此選項與現有的 perl 安裝具有二進制兼容性,但它確實改變了一個長期以來的內部假設,因此默認情況下未啟用,因為某些第三方代碼可能依賴於舊的行為。
我們建議在部署新的 perl 時使用此配置進行測試,特別是對於多線程服務器,以查看所有第三方代碼是否與其兼容,因為此配置可能會帶來有用的性能改進。對於現有的安裝,我們不建議在部署之前進行徹底測試的情況下更改為此配置。
diagnostics
不再使用 $&
,這對於所有使用它的代碼中的 regexp 匹配都會帶來很大的加速。
現在,單個字符的正則表達式類被視為與字符直接使用相同,這意味著使用 char-classes 作為轉義機制的代碼將會加速。(Yves Orton)
創建匿名數組和哈希引用(即 []
和 {}
)現在不再比創建匿名列表或哈希引用具有更多的開銷。 Nicholas Clark 提供的更改節省了兩個 ops 和一個堆棧推送,對於這些操作,這被測量為稍微好於 5% 的改進。
許多對 strlen()
的調用已被消除,要么是因為長度已知,要么是通過採用或增強傳遞長度的 API。這得益於採用了一個 my_sprintf()
包裝器,它返回正確的 C89 值 - 格式化字符串的長度。之前,我們無法依賴於 sprintf()
的返回值,因為在一些古老但現有的平台上它仍然返回 char *
。
如果搜索字符串存儲在 UTF-8 中但僅包含拉丁-1 範圍的字符,那麼現在 index
將更快。
正則表達式引擎內的 Unicode 範圍緩存現在正在使用。(自初始實現以來一直存在的查找密鑰不匹配)。[RT #42839]
現在有 Configure 支持用於創建可重定位的 perl 樹。如果您使用 -Duserelocatableinc
進行 Configure,那麼 @INC
中的路徑(以及 %Config
中的所有其他內容)可以選擇通過 perl 執行文件的路徑來定位。
在開始時間時,如果 @INC
或 Config
中的任何路徑被 Configure 標記為可重定位(通過以 ".../"
開頭),則它們將被前置到 $^X
的目錄。這允許可以按目錄設置重定位,儘管使用 -Duserelocatableinc
默認情況下一切都會被重定位。初始安裝是在原始配置的前綴下完成的。
Configure 現在更善於刪除臨時文件。Tom Callaway(來自紅帽公司)還貢獻了完善傳遞給編譯器和鏈接器的標誌集合的補丁,特別是現在在 Linux 上啟用了 -fPIC
。當您的 /dev/null 不是設備時,它也會拋出異常。
一個新的配置變量 d_pseudofork
已添加到 Configure 中,並在 Config
模塊中可用作 $Config{d_pseudofork}
。這將真實的 fork
支持與在 Windows 平台上使用的偽分叉仿真區分開來。
Config.pod 和 config.sh 現在正確放置以用於交叉編譯。
$Config{useshrplib}
現在在使用共享 perl 库時為 'true' 而不是 'yes'。
並行製作現在應該正常工作,儘管如果指示 make test
並行運行仍可能存在問題。
已清理許多編譯警告。在六次嘗試後,S_emulate_eaccess()
中的一個非常頑固的編譯器警告已被解決。特別為 FreeBSD 調整了 g++ 支持。
mkppport 已集成,並且核心中的所有 ppport.h 文件現在將在構建時自動生成(並在清理期間刪除)。
installman 現在與 -Duserelocatableinc
和 DESTDIR
一起工作。
installperl 不再安裝
在使用共享 perl 库時,不再安裝靜態鏈接擴展的靜態庫文件。(它們是不需要的。參見下面的 "Windows")。
SIGNATURE 和 PAUSE*.pub(CPAN 文件)
NOTES 和 PATCHING(ExtUtils 文件)
perlld 和 ld2(Cygwin 文件)
對於 AIX、Cygwin、DEC/OSF、FreeBSD、HP/UX、Irix 6 Linux、MachTen、NetBSD、OS/390、QNX、SCO、Solaris、SunOS、System V Release 5.x(UnixWare 7、OpenUNIX 8)、Ultrix、UMIPS、uts 和 VOS,都有改進的提示。
如果主要的整數類型使用long long
,則在 FreeBSD 6.2(可能也包括其他版本)中,系統標頭文件未聲明一些 perl 需要的函數,因此刪除-std=c89
和-ansi
。
從 Solaris 10 開始,我們不希望使用版本化的共享庫,因為這些通常表示僅供私人使用的庫。當安裝了 Berkeley DB(SUNWbdb)時,這些問題通常會觸發。因此,如果檢測到 Solaris 10,則設置ignore_versioned_solibs=y
。
在 OpenVMS I64 上允許取消選擇 IEEE 數學(但它仍然是默認值)。
在config.h
中記錄 IEEE 使用情況。
在構建munchconfig.exe
時,使用ccflags
來幫助較舊的 VMS 編譯器。
當選擇了-Duseithreads
時,不要嘗試在 VMS 上構建舊的Thread
擴展。
將原始字符串"NaN"傳遞給nawk會導致核心轉儲-因此字符串已更改為"*NaN*"。
t/op/stat.t測試現在將在 VMS 上測試硬連結(如果支持)。
使用共享 perl 库時,installperl不再安裝靜態庫文件、導入庫文件和導出庫文件(靜態鏈接的擴展)以及空的啟動文件(動態鏈接的擴展)。這修復了在 Win32 上使用 perl 的 debug 构建構建 PAR-Packer 時出現的問題。
對 win32 构建過程進行了各種改進,包括對 Visual C++ 2005 Express Edition(又名 Visual C++ 8.x)的支持。
perl.exe現在將具有圖標,如果使用 MinGW 或 Borland 構建。
對 perl-static.exe 构建過程進行了改進。
添加 Win32 makefile 選項以將所有擴展鏈接為靜態。
WinCE目錄已合併到Win32目錄中。
對 Windows XP 以後重新啟用了setlocale
測試。
已經修復了許多與內部 Unicode 實現(UTF-8)相關的錯誤。特別是,已解決了與通過tie
、重載或$@
返回 Unicode 相關的長期存在的錯誤,其中一些從未報告過。
unpack
將在數字類型上內部將字符串從 UTF-8 轉換回來。這是在 5.10 中完全一致性與當前行為之間的一個妥協,當前行為通常被用作字符串類型的“功能”。
使用:crlf
和UTF-16
IO 層一起現在可以運作。
修正了split
,Unicode /\s+/
和 / \0/
的問題。
修正了 RT #40641 號錯誤 - 正則表達式中 Unicode 字元的編碼。
修正了在正則表達式中使用特定模式導致恐慌的錯誤。[RT #45337]
如果區域設置的字符不是 UTF-8,Perl 將不再因內部無限遞歸而崩潰。[RT #41442]
use open ':locale';
print STDERR "\x{201e}"; # „
已修復 PerlIO 使用的參考計數不一致問題,用於跟踪 Unix 文件描述符的 API 以及 XS 代碼用於獲取和釋放FILE *
s。
已修復 Magic 中的一些錯誤,該內部系統用於實現 tie、污染和線程共享等功能。
對於綁定數組,現在正確調用CLEAR
方法。
一些位操作未在使用之前檢查其參數是否具有魔法。[RT #24816]
表達式\&$x
不再兩次調用 Magic。
解決了分配大數字和污染的錯誤。[RT #40708]
在 MAGIC vtable 中添加了一個新條目 - svt_local
。這在 local
過程中將魔法復制到新值時使用,從而解決了本地化共享變量的某些問題。
有關實現細節,請參見“perlguts”中的“魔法虛擬表”。
內部上,perl 對象性是在引用上,而不是在參考上,儘管方法只能通過參考調用。然而,重載的原始實現存儲了與重載有關的標誌,這些標誌是基於引用的,依賴於在引用被複製時將標誌複製,或者在創建新引用時設置。這表現在一個錯誤中 - 如果從具有重載的類重新賦予對象到不具有重載的類,則任何其他現有引用認為它們(仍然)指向一個已重載的對象,選擇這些 C 代碼路徑,然後拋出錯誤。類似地,當其他引用存在時賦予一個重載的類將導致它們不使用重載。
實作已經在 5.10 版本中修復,但這個修正改變了標誌位元的語義,因此不是二進位相容的,因此無法應用於 5.8.9 版本。然而,5.8.9 版本有一個解決方法,實現了相同的錯誤修復。如果參照物具有多個引用,則會定位並更正所有其他引用。在可能的情況下,通過從當前子程序和參數堆疊向外掃描詞彙,來避免進行全面搜索。
某個眾所周知的 Linux 供應商對他們的 /usr/bin/perl 應用了此錯誤修復的不完整版本,然後在未諮詢上游的情況下,提前關閉了關於性能問題的 bug 報告。這還不夠,他們隨後又忽略了對這些未發布的更改進行必要修復,直到長期付費客戶施加了巨大壓力,這些失敗被放在一個知名博客和 Slashdot 上。
strict
現在正確地傳播到字串評估中在 5.8.8 及之前的版本中
$ perl5.8.8 -e 'use strict; eval "use foo bar" or die $@'
Can't locate foo.pm in @INC (@INC contains: ... .) at (eval 1) line 2.
BEGIN failed--compilation aborted at (eval 1) line 2.
在 5.8.9 及之後的版本中
$ perl5.8.9 -e 'use strict; eval "use foo bar" or die $@'
Bareword "bar" not allowed while "strict subs" in use at (eval 1) line 1.
這可能會導致解析錯誤訊息並依賴於錯誤行為的程式出現問題。
分詞器不再將 =cute
(以及其他以 =cut
開頭的字詞)視為 =cut
的同義詞。
調用 CORE::require
當 CORE::require
和 CORE::do
被覆蓋時,它們總是被解析為 require
和 do
。現在這個問題已經修復。
在長 /etc/groups 輸入時停止記憶體洩漏。
while (my $x ...) { ...; redo }
不應該 undef $x
。
在 while()
、until()
或 for(;;)
迴圈的條件中存在 my
的情況下,我們現在會在主體中添加額外的範圍,以便 redo
不會導致詞彙被 undef
。
encoding
pragma 現在正確地忽略在 LC_ALL
和 LANG
環境變量中的 @
字元後面的任何內容。[RT # 49646]
解決了一個在某些 gcc 3.3 優化中觀察到的段錯誤。
解決了在標量上下文中使用帶有 ()
群組的 unpack
可能導致的一個可能的段錯誤。[RT #50256]
解決了在 system
呼叫被信號處理程序中斷時可能導致 $!
被更改的問題。
修復了 bug RT #37886,即使在受到 use strict 'refs'
影響下,也允許在 defined
的參數中進行符號解引用。
修復了 bug RT #43207,在 sort
內部使用 lc
/uc
影響返回值的問題。
修正了錯誤 RT #45607,其中 *{"BONK"} = \&{"BONK"}
未正確運作。
修正了錯誤 RT #35878,從通過 goto &xsub
呼叫的 XSUB 中鳴叫會損壞 perl 內部。
修正了錯誤 RT #32539,DynaLoader.o 被移動到 libperl.so 中,以避免需要將 DynaLoader 靜態鏈接到存根 perl 可執行文件中。有了這個 libperl.so,提供了運行功能嵌入式 perl 解釋器所需的一切。
修正了錯誤 RT #36267,以便將值分配給 tied hash 不會改變底層的 hash。
修正了錯誤 RT #6006,使用大的替換變量進行正則替換有時會失敗,即 當替換包含類似 ${10}
(注意括號)而不僅僅是 $10
。
修正了錯誤 RT #45053,Perl_newCONSTSUB()
現在是線程安全的。
對 64 位構建進行了各種改進。
在 PerlIOStdio_close()
中添加了互斥鎖保護,以避免競爭條件。希望這可以修復線程測試 free.t 和 blocks.t 中的失敗。
在調試器中添加了分叉終端支持,具有更新窗口標題的功能。
修正了使用 USE_MULTI
和 USE_ITHREADS
但沒有 USE_IMP_SYS
指定的構建問題。
OS2::REXX
升級到版本 1.04
對 cc 和 gcc 的對齊浮點構建策略進行了調整。
重新審查了來自 5.6.1 版本的 RH7.2 的 Intel 的 icc 的補丁 [RT #7916],添加了對 $Config{gccversion}
的額外檢查。
在使用 64 位整數時使用 -DPTR_IS_LONG
修正了 PerlIO::Scalar
內存文件的記錄式讀取。
進程退出時管道關閉現在應該更加穩健。
修復了由 Test::Harness
2.64 觸發的 VMS 退出處理中的錯誤。
在 configure.com 中修正了 fcntl()
鎖定能力測試。
在 VMS 上用 useshrplib='true'
替換了 shrplib='define'
。
File::Find
在目標目錄是裸驅動器字母且 no_chdir
為 1(默認為 0)時以前會失敗。[RT#41555]
修正了使用 USE_MULTI
和 USE_ITHREADS
但沒有 USE_IMP_SYS
指定的構建問題。
在某些 Windows 平台上,進程 ID 不再截斷為 16 位元( http://bugs.activestate.com/show_bug.cgi?id=72443 )
在 perlio.c 中修正了 RT#54828 中的 bug,其中在 Win32 和 Cygwin 上調用 binmode
可能會導致分段錯誤。
現在在使用 nomethod
時可以重載 eq
。
修正了使用 64 位整數時的各種問題。
PerlIO
文件描述符的引用計數現在得到了正確處理。
在 VMS 上,轉換為 Unix 語法時會保留逃脫點。
keys %+
不再引發 'ambiguous'
警告。
使用 #!perl -d
可能會觸發斷言,已修復。
在調用 require
時,不要將 @INC
中的綁定代碼引用字符串化。
當使用 __FILE__
時,@INC
中的代碼引用報告正確的文件名。
sprintf 中的寬度和精度未正確處理大於 255 的字符。[RT#40473]
索引超出範圍的列表切片現在更一致地工作。[RT#39882]
與 perl 5.8.1 引入的更改破壞了形式為 -foo=bar
的參數的解析,-s
在 <#!> 行上。這已被修復。參見 http://bugs.activestate.com/show_bug.cgi?id=43483
tr///
現在是線程安全的。以前它將一個 swash 存儲在其 OP 內,而不是在一個 pad 內。
pod2html 更一致地標記錨點並更好地處理嵌套定義列表。
threads
清理否決已擴展到包括 perl_free()
和 perl_destruct()
在某些系統上,對 $ENV{TZ}
的更改不一定始終會被底層對 localtime_r()
的調用所尊重。Perl 現在強制在這些系統上檢查環境。
使用 (?{...})
構造執行正則表達式時,特殊變量 $^R
現在設置得更一致。特別是,即使使用反向引用或可選子模式 (?:...)?
,它仍將被設置。
當 C 程序 Perl_sv_chop()
被傳遞了不在純量字符串緩衝區內的位置時,將會出現此新的致命錯誤。這是由於有缺陷的 XS 代碼引起的,目前無法恢復。
當 perl 進程由於過多的待處理信號而不得不中止時,會發生這個新的致命錯誤,這將阻止 perl 能夠安全處理進一步的信號。
當 ACL 版本文件測試操作符在當前平台上不可用時,會發生這個新的致命錯誤。先前的檢查意味著這應該是不可能發生的。
新的錯誤表明綁定的數組聲稱擁有負數個元素。
以前來自 SV 升級代碼的內部錯誤較不具信息性,現在它報告了當前的內部類型以及所請求的新類型。
如果向 exists
提供了無效的參數,則會拋出此錯誤,現在正確地包括了「或一個子例程」。[RT#38955]
Fatal
中的此錯誤以前不顯示所討論的內建函數的名稱(現在由上面的 %s 表示)。
這個錯誤以前沒有說明列。
現在,這也可以由使用 PerlIO::scalar
的文件處理程序上的 seek
生成。
新錯誤,作為修復 RT#40641 的一部分引入,以處理正則表達式註釋中的 Unicode 字符的編碼。
在 Win32 和 Cygwin 上調用 dump
時發出更多信息的致命錯誤。(鑑於 dump
的目的是通過核心轉儲中止,而這些平台上無法生成核心轉儲,這比靜默退出更有用。)
現在可以使用 C++ 編譯器而不是 C 編譯器編譯 perl 源代碼。一個必要的實現細節是,在 C++ 中,用於定義 XSUBs 的宏 XS
現在包括一個 extern "C"
定義。這樣做的副作用是,使用此結構的 C++ 代碼
typedef XS(SwigPerlWrapper);
現在需要
typedef XSPROTO(SwigPerlWrapper);
使用新的 XSPROTO
宏來編寫,以便編譯。 C 擴展不受影響,儘管建議 C 擴展也使用 XSPROTO
。這個改變已經存在於 perl 的 5.10.0 版本中,因此任何已經使用此結構的活躍維護的代碼應該已經適應。需要更改的代碼將在編譯時失敗並產生編譯錯誤。
對於將魔法變量本地化/分配的 set
魔法現在只會觸發 容器魔法,即對 %ENV
或 %SIG
,但不會對 $#array
。
新的 API 宏 newSVpvs()
可以用於替代 newSVpvn("ISA", 3)
等結構。它接受一個字符串常量,在 C 編譯時確定其長度。
新的 API 函数 Perl_newSV_type()
可以用作常見習慣的更有效替代
sv = newSV(0);
sv_upgrade(sv, type);
同樣,Perl_newSVpvn_flags()
可以用於將 Perl_newSVpv()
與 Perl_sv_2mortal()
或等效的 Perl_sv_newmortal()
與 Perl_sv_setpvn()
結合使用
添加了兩個新的宏 mPUSHs()
和 mXPUSHs()
,以使將可死亡的 SV 推送到堆棧變得更容易。然後,它們用於修復了幾個堆棧中的值尚未死亡的錯誤。
添加了一個 Perl_signbit()
函數來測試 NV
的符號。當系統提供時,它映射到系統中的一個。
Perl_av_reify()
、Perl_lex_end()
、Perl_mod()
、Perl_op_clear()
、Perl_pop_return()
、Perl_qerror()
、Perl_setdefout()
、Perl_vivify_defelem()
和 Perl_yylex()
現在對擴展可見。這是允許 Data::Alias
在 Windows 上工作所必需的。
Perl_find_runcv()
現在對 perl 核心擴展可見。這是允許 Sub::Current
在 Windows 上工作所必需的。
在非線程 perl 中現在可以使用 ptr_table*
函數。 Storable
利用了這一點。
內部進行了許多小的清理。特別是,Perl_sv_upgrade()
大幅簡化,使用直通代碼路徑,通過 memset()
和 memcpy()
初始化新主體,而不是通過多個臨時變量進行賦值。它還從簡化和去重的競技場管理代碼中受益。
由於 Coverity 靜態代碼分析器的報告,代碼庫中進行了許多小的改進。
修正了 Perl_gv_stashpv()
、Perl_gv_stashpvn()
、Perl_gv_stashsv()
函數的使用和文檔 (最後一個參數是位掩碼,而不是布爾值)。
PERL_SYS_INIT
、PERL_SYS_INIT3
和 PERL_SYS_TERM
宏已更改為函數。
PERLSYS_TERM
不再需要上下文。現在在沒有上下文的情況下調用 PerlIO_teardown()
,並且此函數中的調試輸出已被禁用,因為這要求解釋器存在,這是一個無效的假設。
所有影響二進制兼容性的編譯時選項已經被分組到一個全局變量中 (PL_bincompat_options
)。
PERL_REVISION
、PERL_VERSION
和 PERL_SUBVERSION
的值現在嵌入到全局變量中(因此也嵌入到任何共享的 Perl 库中)。此外,在 MULTIPLICITY
下,perl 可執行文件現在記錄解釋器結構的大小(總大小,以及本版本的大小)。配合 PL_bincompat_options
,這將允許 5.8.10(以及更高版本),當編譯使用共享 Perl 库時,在 main()
中執行健全性檢查,以驗證共享庫確實與二進制兼容。
符號引用現在可以包含嵌入的 NULs。如果必須處理它們,則可以在擴展中使用新的公共函數 Perl_get_cvn_flags()
。
核心代碼和不在 CPAN 上雙重存在的 XS 代碼已不再使用宏 PL_na
、NEWSV()
、Null()
、Nullav
、Nullcv
、Nullhv
等等。在新代碼中不建議使用它們,特別是 PL_na
,這對性能有輕微影響。
許多從 CPAN 更新的模塊都包含新的測試。添加了一些核心特定的測試。
DynaLoader
模塊的測試。
編譯時常量摺疊的測試。
從5.10.0中引入的測試,檢查內部類型PVBM
和PVGV
之間是否有意外的交互作用。
常量子程序的新形式的測試。
Attribute::Handlers
的測試。
dbmopen
的測試。
在首次綁定@INC
之後調用t/op/inccode.t中的所有測試。
來自@INC
中代碼引用的源代碼過濾器的測試。
RT #30970的測試。
RT #41484的測試。
qr//
構造的測試。
另一個正則表達式內部的qr//
構造的測試。
qr//
構造的測試。
RT #32840的測試。
對綁定到標量的study
的測試。
在-T
模式下運行的subst
的測試。
對綁定到子程序或方法的符號表條目的undef
和delete
的測試。
Perl_sv_upgrade()
的測試。
isa
和包別名的MRO測試。
兩次調用Pod::Parser
的測試。
測試在exec
(close-on-exec)中跨文件描述符繼承的測試。
UTF-8緩存代碼的測試。
確保奇怪的編碼不會干擾Perl_pp_chr()
。
RT #40641的測試。
RT #40641的測試。
從重載的值返回Unicode的測試。
從綁定變量返回Unicode的測試。
目前沒有已知的新錯誤。
然而,依賴已經修復的錯誤的程序將會遇到問題。此外,許多在5.10.0中修復的錯誤無法回溯到5.8.x分支,因為它們需要不相容的二進制更改,或者因為代碼更改太大而太危險,無法納入其中。
我們只有有限的志願者勞動力,而維護負擔正在變得越來越複雜。因此,這將是5.8.x系列的最後一個重要發布版本。未來的5.8.x版本可能只用於處理安全問題和平台構建失敗。因此,如果尚未開始,您應該考慮遷移到5.10.x。或者,如果商業需求限制您繼續使用5.8.x,您可能希望考慮從ActiveState等公司獲得商業支持。
readdir()
,cwd()
,$^X
和@INC
現在如果長名稱在當前代碼頁之外則使用替代(短)文件名(Jan Dubois)。
Win32
升級到版本0.38。現在GetOSName
從WinVista回應,IsAdminUser
支持Vista的特權提升。支持路徑名中的Unicode字符。改進了cygwin和Win64的兼容性。
Win32API
更新到0.1001_01
在MSWin32
中添加了對killpg()
的支持(Jan Dubois)。
File::Spec::Win32
已升級至版本 3.2701
OS2::Process
已升級至 1.03 版
Ilya Zakharevich 已添加並記錄了幾個 Window*
和 Clipbrd*
函數。
OS2::REXX::DLL
、OS2::REXX
已升級至版本 1.03
DCLsym
已升級至版本 1.03
Stdio
已升級至版本 2.4
VMS::XSSymSet
已升級至 1.1 版。
Nick Ing-Simmons,長期的 Perl 駭客,Tk
和 Encode
模組的作者,核心中的 perlio.c,以及 5.003_02 的 pumpking,在 2006 年 9 月 25 日心臟病發作去世。他將被惦念。
這個版本的一些工作是由 TPF 資助的。
Steve Hay 在幕後工作,找出核心模組、它們的 CPAN 發布以及先前核心版本之間差異的原因,以及糾正它們的最佳方法。他不想再次做這件事。我理解這種感覺,我很高興他這次做了,而不是我。
Paul Fenwick 組建了一個由 18 名志願者組成的團隊,他們完成了這份文件的大部分工作。特別是,Bradley Dean、Eddy Tan 和 Vincent Pit 提供了團隊一半的貢獻。
Schwern 核對了更新模組版本的清單,更正了我(和所有其他人)錯過的許多錯誤,包括錯誤聲明的模組版本和未列出的更改模組。
位於柏林的 QA 團隊 Andreas König 和 Slaven Rezic 不辭辛勞地重建快照,對幾乎所有 CPAN 進行測試,然後識別導致任何模組回歸的更改,確保在第一個發布候選版本之前解決了幾個阻止發布的致命錯誤。
其他核心貢獻者貢獻了大部分變更,並應用了由《AUTHORS》中列出的數百名貢獻者發送的大部分補丁。
當然,沒有 Larry Wall,我們就不會有 Perl。
如果您發現了您認為是錯誤的內容,您可以檢查最近在 comp.lang.perl.misc 新聞組和 perl 錯誤數據庫 http://bugs.perl.org 張貼的文章。也許在 http://www.perl.org,Perl 的主頁上也有相關資訊。
如果您認為自己有未報告的錯誤,請執行隨附於您的版本的 perlbug 程式。請務必將您的錯誤簡化為一個小而足夠的測試案例。您的錯誤報告將連同 perl -V
的輸出一起發送到 perlbug@perl.org,以便由 Perl 移植團隊進行分析。您可以在 http://bugs.perl.org/ 瀏覽和搜索 Perl 5 的錯誤。
如果您報告的錯誤具有安全影響,使其不適合發送到公開存檔的郵件列表,那麼請將其發送到 perl5-security-report@perl.org。這將指向一個已關閉訂閱未存檔的郵件列表,其中包括所有核心提交者,他們將能夠幫助評估問題的影響,找出解決方案,並協調釋出補丁以減輕或修復跨所有 Perl 支持的平台上的問題。請只在 Perl 核心中使用此地址來報告安全問題,而不是獨立分佈在 CPAN 上的模塊。
有關詳細更改的 Changes 檔案。
有關如何構建 Perl 的 INSTALL 檔案。
一般資訊的 README 檔案。
版權資訊的 Artistic 和 Copying 檔案。