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
filestat 运算符。由于目录句柄和文件句柄都是裸字,因此可能会出现歧义,无法确定要使用哪个。在这些情况下,优先使用文件句柄语义。两者都将*FILE{IO}
文件句柄视为*FILE
文件句柄。
可以通过在钩子打开并返回的文件句柄之上添加源代码过滤器来增强 @INC 中子例程钩子的机制。此功能计划已久,但直到现在才开始运作。有关详细信息,请参阅 "require" in perlfunc。(Nicholas Clark)
常量折叠例程现在被包装在一个异常处理程序中,如果折叠抛出异常(例如尝试计算 0/0),perl 现在会保留当前的 optree,而不是中止整个程序。如果没有此更改,如果程序包含可能在运行时永远无法到达的代码中的表达式,即使这些表达式恰好会生成异常,程序也无法编译。(Nicholas Clark,Dave Mitchell)
no VERSION
现在可以使用 no
后跟版本号来指定要使用比指定版本更旧的 perl 版本。
用于缓存字符串中字符偏移量的计算 UTF-8 字节偏移量的代码已重写。已找到并消除了一些错误,并且代码现在更好地利用了它拥有的信息,因此应该更快。特别是,它不会在计算字符串内的偏移量之前扫描到字符串的末尾,这应该会加快对长字符串的一些操作。现在可以在运行时禁用缓存代码,以验证它是否不是疑似问题的原因。
现在有Configure支持创建在运行时可重定位的 perl 树。请参阅 "Relocatable installations"。
${^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。
正则表达式引擎用于检索 Unicode 属性和音译映射的一些纯 Perl 代码已在 XS 中重新实现,以实现更快的执行。(SADAHIRO Tomoyuki)
解释器内部现在支持一种更节省内存的内联常量形式。在符号表中存储对常量值的引用等效于完整的 typeglob 引用常量子例程,但使用大约 400 字节更少的内存。此代理常量子例程会在必要时自动升级为具有子例程的真实 typeglob。所采用的方法类似于现有子例程存根声明的空间优化,这些声明存储为符号表中的普通标量,而不是完整的 typeglob。
但是,为了帮助现有代码的向后兼容性(错误地)不期望符号表中除了 typeglob 之外的任何内容,核心中的任何内容都不会使用此功能,除了回归测试。
从 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
提供新的与垫片相关的抽象宏 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
,它在 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版
diagnostics
升级到1.16版
Digest
升级到1.15版
Digest::MD5
升级到2.37版
DirHandle
升级到1.02版
现在在关闭目录句柄之前本地化$.
、$@
、$!
、$^E
和$?
,以抑制关于它已经关闭的警告的任何副作用。
DynaLoader
升级到1.09版
DynaLoader
现在可以从具有非默认文件扩展名的文件中动态加载可加载对象。
Encode
升级到2.26版
Encode::Alias
包含了在 Solaris(更广为人知的 ASCII)上对编码“646”的修复。
English
升级到 1.03 版本。
Errno
升级到 1.10 版本。
Exporter
升级到 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 版本。
Fatal
升级到 1.06 版本。
允许将 CORE::GLOBAL
中的内置函数设置为致命错误。
Fcntl
升级到 1.06 版本。
fields
升级到 2.12 版本。
File::Basename
升级到 2.77 版本。
FileCache
升级到 1.07 版本。
File::Compare
升级到 1.1005 版本。
File::Copy
升级到 2.13 版本。
现在使用 3 个参数的 open 函数。
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 版本。
filetest
升级到 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 实时信号功能的系统上提供对 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 错误 #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 $)
的混淆。
Perl 线程教程示例已在"perlthrtut 中的队列:传递数据" 和 perlthrtut 部分修复。
perlhack 文档由 Jarkko Hietaniemi 和其他人进行了大量改进。
perltoot 提供了有关修改@UNIVERSAL::ISA
的信息。
perlport 文档已扩展,包括 Windows 上不同的 kill(-9, ...)
语义。它还明确说明 dump
在 Win32 和 cygwin 上不受支持。
INSTALL 已更新和现代化。
自 perl 5.000 以来,perl 的默认行为是为每个新的类型全局创建空标量。词法变量的使用增加意味着大多数现在未使用。感谢 Nicholas Clark 的努力,Perl 现在可以编译 -DPERL_DONT_CREATE_GVSV
来避免创建这些空标量。这将显着减少为所有配置分配的标量数量,以及为 ithread 创建而需要复制的标量数量。虽然此选项与现有 perl 安装二进制兼容,但它确实改变了关于内部机制的长期假设,因此默认情况下未启用,因为某些第三方代码可能依赖于旧的行为。
我们建议在 perl 的新部署中使用此配置进行测试,特别是对于多线程服务器,以查看所有第三方代码是否与其兼容,因为此配置可能会带来有用的性能改进。对于现有安装,我们不建议更改为此配置,除非在部署之前进行彻底测试。
diagnostics
不再使用 $&
,这导致所有使用它的代码中正则表达式匹配速度大幅提升。
现在,单个字符的正则表达式类被视为与使用字符作为字面量相同,这意味着使用字符类作为转义机制的代码将看到速度提升。(Yves Orton)
创建匿名数组和哈希引用(即 []
和 {}
)现在不会比创建匿名列表或哈希产生更多开销。Nicholas Clark 提供了更改,节省了两个操作和一个堆栈推送,这被测量为这些操作的性能略微提高了 5% 以上。
许多对 strlen()
的调用已被消除,要么是因为长度已知,要么是通过采用或增强传递长度的 API。这得益于采用了 my_sprintf()
包装器,它返回正确的 C89 值 - 格式化字符串的长度。以前我们不能依赖 sprintf()
的返回值,因为在一些古老但现存的平台上,它仍然返回 char *
。
index
现在更快了,如果搜索字符串存储在 UTF-8 中,但只包含拉丁-1 范围内的字符。
正则表达式引擎中的 Unicode 色样缓存现在被使用。(查找存在一个键不匹配,从最初的实现开始就存在)。[RT #42839]
现在有Configure 支持创建可重定位的 perl 树。如果你使用 -Duserelocatableinc
Configure,那么 @INC
中的路径(以及 %Config
中的任何其他内容)可以选择通过perl 可执行文件的路径来定位。
在启动时,如果 @INC
或 Config
中的任何路径被Configure 标记为可重定位(通过以 ".../"
开头),那么它们将被 $^X
的目录前缀。这允许在每个目录的基础上配置重定位,尽管使用 -Duserelocatableinc
的默认设置是所有内容都被重定位。初始安装是在原始配置的前缀中完成的。
Configure 现在更擅长删除临时文件。Tom Callaway(来自 RedHat)还贡献了补丁,这些补丁完成了传递给编译器和链接器的标志集,特别是 -fPIC
现在在 Linux 上被启用。它还会在你的/dev/null 不是设备时发出警告。
一个新的配置变量 d_pseudofork
已添加到Configure 中,并在 Config
模块中作为 $Config{d_pseudofork}
可用。这区分了真正的 fork
支持和在 Windows 平台上使用的伪 fork 模拟。
Config.pod 和 config.sh 现在被正确地放置用于交叉编译。
$Config{useshrplib}
现在是 'true' 而不是 'yes',当使用共享 perl 库时。
并行 make 现在应该可以正常工作了,尽管如果 make test
被指示并行运行,仍然可能存在问题。
许多编译警告已被清理。S_emulate_eaccess()
中一个非常顽固的编译器警告在六次尝试后被消灭。g++ 支持已经被调整,特别是针对 FreeBSD。
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
作为主要整数类型,则删除 -std=c89
和 -ansi
,否则在 FreeBSD 6.2(以及其他版本)中,系统头文件不会声明 perl 所需的某些函数。
从 Solaris 10 开始,我们不希望使用版本化的共享库,因为这些库通常表示仅供私人使用的库。当安装 SUNWbdb(Berkeley DB)时,这些问题通常会被触发。因此,如果检测到 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 的调试版本构建 PAR-Packer 时出现的问题。
win32 构建过程的各种改进,包括对 Visual C++ 2005 Express Edition(又名 Visual C++ 8.x)的支持。
如果使用 MinGW 或 Borland 构建,perl.exe 现在将有一个图标。
对 perl-static.exe 构建过程的改进。
添加 Win32 makefile 选项以静态链接所有扩展。
WinCE 目录已合并到 Win32 目录中。
setlocale
测试已重新启用,适用于 Windows XP 及更高版本。
修复了许多与内部 Unicode 实现 (UTF-8) 相关的错误。特别是,长期存在的与通过 tie
返回 Unicode、重载或 $@
相关的错误现在已消失,其中一些从未被报告过。
unpack
将在内部将字符串从 UTF-8 转换回数字类型。这是在 5.10 中完全一致性和当前行为之间的一种折衷方案,当前行为通常被用作字符串类型的“特性”。
现在可以使用 :crlf
和 UTF-16
IO 层。
修复了 split
、Unicode /\s+/
和 / \0/
的问题。
修复了错误 RT #40641 - 正则表达式中 Unicode 字符的编码。
修复了在正则表达式中使用某些模式会导致 panic 的错误。[RT #45337]
如果区域设置的字符不是 UTF-8,Perl 不会再出现段错误(由于无限的内部递归)。[RT #41442]
use open ':locale';
print STDERR "\x{201e}"; # „
修复了 PerlIO 使用的引用计数不一致性,用于跟踪 Unix 文件描述符,以及 XS 代码用于管理获取和释放 FILE *
的 API。
修复了 Magic 中的几个错误,Magic 是用于实现 tie
、污染和线程共享等功能的内部系统。
undef @array
在绑定数组上现在会正确调用 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 中应用了此错误修复的不完整版本,然后在未咨询上游的情况下过早地关闭了有关性能问题的错误报告。这还不够,他们随后继续忽略对这些未发布更改的必要修复长达 11 个月,直到他们饱受折磨的付费客户施加了巨大压力,而这种压力是由这些缺陷在知名博客和 Slashdot 上的曝光所引发的。
strict
现在可以正确地传播到字符串 eval 中在 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
编译指示现在可以正确地忽略 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
会影响返回值。
修复了 bug RT #45607,其中 *{"BONK"} = \&{"BONK"}
无法正常工作。
修复了 bug RT #35878,通过 goto &xsub
调用的 XSUB 中的 croaking 会破坏 perl 内部。
修复了 bug RT #32539,DynaLoader.o 被移到 libperl.so 中,以避免将 DynaLoader 静态链接到 stub perl 可执行文件。有了这个,libperl.so 提供了运行功能嵌入式 perl 解释器所需的一切。
修复了 bug RT #36267,以便为绑定哈希赋值不会改变底层哈希。
修复了 bug RT #6006,使用大型替换变量的正则表达式替换有时会失败,例如 当替换包含类似 ${10}
(注意括号)而不是 $10
的内容时。
修复了 bug 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 上将 shrplib='define'
替换为 useshrplib='true'
。
当目标目录是裸驱动器盘符且 no_chdir
为 1 时,File::Find
以前会失败(默认值为 0)。[RT #41555]
已修复指定 USE_MULTI
和 USE_ITHREADS
但没有 USE_IMP_SYS
的构建问题。
进程 ID 在某些 Windows 平台上不再被截断为 16 位(http://bugs.activestate.com/show_bug.cgi?id=72443)。
修复了 perlio.c 中的错误 RT #54828,在 Win32 和 Cygwin 上调用 binmode
可能导致段错误。
现在可以使用 nomethod
重载 eq
。
修复了使用 64 位整数与 overload
相关的各种问题。
现在正确处理了 PerlIO
文件描述符的引用计数。
在 VMS 上,转义的点在转换为 Unix 语法时将被保留。
keys %+
不再抛出 'ambiguous'
警告。
使用 #!perl -d
可能触发断言,现已修复。
在调用 require
时,不再将 @INC
中的绑定代码引用字符串化。
@INC
中的代码引用在使用 __FILE__
时报告正确的文件名。
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
的目的是通过核心转储中止,而核心转储无法在这些平台上生成,因此这比静默退出更有用。)
Perl 源代码现在可以使用 C++ 编译器而不是 C 编译器进行编译。一个必要的实现细节是,在 C++ 下,用于定义 XSUB 的宏 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()
,以便更轻松地将 mortal SV 推送到堆栈上。然后,它们被用来修复几个错误,这些错误是在堆栈上的值没有被设置为 mortal。
添加了一个名为 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 上工作。
ptr_table*
函数现在在非线程化的 Perl 中可用。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()
中执行健全性检查,以验证共享库是否确实与二进制兼容。
符号引用现在可以包含嵌入的 NUL。如果必须处理它们,扩展可以使用新的公共函数 Perl_get_cvn_flags()
。
核心代码以及 ext 中不在 CPAN 上双重生存的 XS 代码不再使用 PL_na
、NEWSV()
、Null()
、Nullav
、Nullcv
、Nullhv
、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
(关闭执行)继承文件描述符的测试。
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
killpg()
支持添加到 MSWin32
(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 的负责人,于 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) 的文章。Perl 主页 (https://www.perl5.cn) 上也可能有一些信息。
如果您认为您遇到了未报告的错误,请运行您发布版本中包含的 perlbug 程序。请务必将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。您可以在 http://bugs.perl.org/ 浏览和搜索 Perl 5 错误。
如果您要报告的错误存在安全隐患,不适合发送到公开存档的邮件列表,请将其发送到 [email protected]。此地址指向一个封闭的订阅未存档邮件列表,其中包含所有核心提交者,他们可以帮助评估问题的影响,找出解决方案,并帮助协调跨所有支持 Perl 平台的补丁发布以减轻或修复问题。请仅将此地址用于 Perl 核心中的安全问题,不要用于 CPAN 上独立分发的模块。
有关更改的详细信息,请参阅 Changes 文件。
有关如何构建 Perl 的说明,请参阅 INSTALL 文件。
有关一般信息,请参阅 README 文件。
有关版权信息,请参阅 Artistic 和 Copying 文件。