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
会将它的参数解释为布尔值,而不是用于智能匹配的表达式。
..
和 ...
翻转操作符现在在布尔上下文中进行评估,遵循它们通常的语义;参见 "perlop 中的范围操作符"。
请注意,与 perl 5.10.0 一样,when (1..10)
不会用于测试给定值是否为 1 到 10 之间的整数;您应该使用 when ([1..10])
代替(注意数组引用)。
但是,与 5.10.0 相反,在布尔上下文中评估翻转操作符确保它现在可以在 when()
中使用,特别是用于实现双稳态条件,例如:
when (/^=begin/ .. /^=end/) {
# do something
}
涉及定义或操作符的复合表达式,例如 when (expr1 // expr2)
,如果第一个表达式是布尔值,则将被视为布尔值。(这只是扩展了适用于常规或操作符的现有规则,例如 when (expr1 || expr2)
。)
下一节详细介绍了对智能匹配操作符语义的更多更改,这些更改自然也会修改 switch 语句的行为,其中隐式使用智能匹配。
智能匹配操作符 ~~
不再是可交换的。智能匹配的行为现在主要取决于其右侧参数的类型。此外,在某些情况下,它的语义已经调整以获得更大的一致性或实用性。虽然总体向后兼容性得到维护,但必须注意一些更改。
具有空原型代码引用的处理方式不再特殊。它们像其他代码引用一样传递参数(即使它们选择忽略它)。
%hash ~~ sub {}
和 @array ~~ sub {}
现在测试子程序是否为哈希的每个键(或数组的每个元素)返回真值,而不是将整个哈希或数组作为引用传递给子程序。
由于交换律的破坏,代码引用在出现在 ~~
运算符左侧时不再被特殊对待,而是像任何普通标量一样。
undef ~~ %hash
始终为假(因为 undef
不能是哈希中的键)。不会进行隐式转换为 ""
(如 perl 5.10.0 中的情况)。
$scalar ~~ @array
现在始终将智能匹配分布到数组的元素中。如果 @array
中的一个元素验证了 $scalar ~~ $element
,则为真。这是对旧行为的推广,旧行为测试数组是否包含标量。
智能匹配运算符的完整调度表在 "perlsyn 中的智能匹配详解" 中给出。
根据基于最右侧参数类型的调度规则,当重载 ~~
的对象出现在运算符的右侧时,重载例程将始终被调用(第三个参数设置为真值,参见 overload)。但是,当对象出现在左侧时,只有当最右侧参数是简单标量时才会调用重载例程。这样,智能匹配在数组上的分布性不会被破坏,其他复杂类型(代码引用、哈希、正则表达式)的行为也不会被破坏。因此,智能匹配重载例程的编写者主要只需要担心与标量的比较,以及可能与字符串化重载的比较;其他常见情况将被自动一致地处理。
~~
现在将拒绝在不重载它的对象上工作(为了避免依赖对象的底层结构)。(但是,如果对象重载了字符串化或数值化运算符,并且重载回退处于活动状态,它将像往常一样被使用。)
use feature :5.10*
的语义略有变化。有关更多信息,请参见 "模块和语义"。
现在,对没有定义重载的对象使用智能匹配运算符 ~~
将导致运行时错误。(这样,~~
不会通过匹配对象的内部表示(作为引用)来破坏封装。)
用于开发 perl 解释器的版本控制系统已从 Perforce 切换到 git。这主要是一个内部问题,只影响积极参与 perl 核心开发的人员;但它可能在外部可见,例如在 perl -V
输出的某些细节中。有关更多信息,请参见 perlrepository。
perl 源代码中 ext/
目录的内部结构已重新组织。通常,源代码存储在 ext/Foo/Bar/ 中的模块 Foo::Bar
现在位于 ext/Foo-Bar/ 中。此外,一些模块已从 lib/ 移动到 ext/。这纯粹是源代码包的更改,对 perl 的编译或安装应该没有影响,除非你的构建过程非常定制,并且明确依赖于此结构,或者硬编码了 nonxs_ext
Configure 参数。具体来说,此更改默认情况下不会更改最终安装中任何文件的路径。
作为 Test::Harness
2.x 到 3.x 升级的一部分,实验性的 Test::Harness::Straps
模块已被删除。有关更多详细信息,请参见 "已更新的模块"。
作为 ExtUtils::MakeMaker
升级的一部分,ExtUtils::MakeMaker::bytes
和 ExtUtils::MakeMaker::vmsish
模块已从此发行版中删除。
Module::CoreList
不再包含 %:patchlevel
哈希。
这实际上是 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
编译指示此编译指示允许您在词法范围内禁用或启用某些或所有操作的重载。(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 之前必须安装的配置先决条件。
有关在为 CPAN 创建发行版时如何指定 configure_requires
的更多信息,请参阅 ExtUtils::MakeMaker
或 Module::Build
的文档。
autodie
这是一个新的词法范围替代 Fatal
模块。捆绑版本为 2.06_01。请注意,在此版本中,当 autodie
生效时使用字符串 eval 会导致 autodie 行为泄漏到周围范围。有关更多详细信息,请参阅 autodie 中的“错误”。
Compress::Raw::Bzip2
已将其添加到核心(版本 2.020)。
parent
此 pragma 在编译时建立与基类的 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() 的 default_value”修复)。
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。
这使得非阻塞模式在 Windows 中的 IO::Socket::INET
[CPAN #43573] 上工作。
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
哈希。
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。请参阅 "弃用"。
Symbol
从版本 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
子例程现在可以在调试器下工作。
调试器现在可以正确处理代理常量子例程和子例程存根。
Perl 5.10.1 添加了一个新的实用程序 perlthanks,它是 perlbug 的变体,但用于向 Perl 的作者和维护者发送非错误报告。只收到错误报告可能会让人有点沮丧:我们将看看这是否会改变现状。
这包含有关如何为 Haiku 平台构建 perl 的说明。
这描述了可插拔方法解析顺序的新接口。
本文档由 Richard Foley 撰写,介绍了可用于 perl 程序的性能和优化技术的应用,特别是针对 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
一次。
如果 perl 使用 -Dusedevel
构建,则现在定义了 $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。只有 flock() 从 libbsd 中使用。
为 AIX 5L 和 6.1 删除了 libgdbm。libgdbm 作为 AIX 工具箱中的可选包提供。不幸的是,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 上构建。
Hints 现在支持 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]。
调试器现在可以与左值子例程一起使用。
调试器的 m
命令在定义常量的模块中已损坏 [RT #61222]。
crypt()
和字符串补码可能为未污染的参数返回污染的值 [RT #59998]。
-i.suffix
命令行开关现在使用受限权限重新创建文件,然后将其模式更改为与原始文件匹配。这消除了潜在的竞争条件 [RT #60904]。
在某些 Unix 系统上,即使子进程 core dump,$?
中的值也不会设置最高位($? & 128
)。
在某些情况下,$^R
可能错误地变为未定义 [RT #57042]。
(XS) 在各种哈希函数中,当键为 UTF-8 时,传递预先计算的哈希可能会导致错误的查找。
(XS) 在perl.h之前包含XSUB.h会导致编译时错误 [RT #57176]。
如果包Foo
不存在,即使对象的@ISA
包含Foo
,$object->isa('Foo')
也会返回假。
在5.10.0中新引入的mro代码中,通过操作@ISA
触发的各种错误已经被发现并修复。
对引用进行按位运算可能会导致解释器崩溃,例如$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)*$/
在64位操作系统上,shmget
被限制为32位段大小 [RT #63924]。
使用next
或last
退出given
块不再产生类似以下的虚假警告
Exiting given via last at foo.pl line 123
在Windows上,'.\foo'
和'..\foo'
被do
和require
处理的方式不同于'./foo'
和'../foo'
[RT #63492]。
将格式分配给全局变量可能会破坏格式;例如:
*bar=*foo{FORMAT}; # foo format now bad
尝试将全局变量强制转换为字符串或数字可能会导致断言失败。现在会生成正确的错误消息,Can't coerce GLOB to $type
。
在use filetest 'access'
下,-x
使用的是错误的访问模式。这个问题已经修复 [RT #49003]。
对返回Unicode值的绑定标量使用length
,第一次不会得到正确的结果。这个问题已经修复。
在数组tie
内部使用数组tie
可能会导致SEGV。这个问题已经修复。 [RT #51636]
已识别并修复了 PerlIOStdio_close()
中的竞争条件。这曾经会导致各种线程问题,包括 SEGVs。
在 unpack
中,在标量上下文中使用 ()
组会在内部将列表放置在解释器的堆栈上,这会以各种方式表现出来,包括 SEGVs。现在已修复 [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]。
如果在命令行中也指定了 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-string/require 不可移植
此警告已被移除。
子程序 "%s" 深度递归
现在可以通过重新编译 perl 二进制文件来更改此警告的深度阈值,默认值为 100,将 C 预处理器宏 PERL_SUB_DEPTH_WARN
设置为所需的值。
C 源文件开头的 J.R.R. 托尔金引文已通过 Tom Christiansen 的补丁进行检查并添加了适当的引用。
vcroak()
现在接受一个空第一个参数。此外,对 "非空" 编译器注释进行了全面审计,并更正了几个其他内部函数的注释。
添加了新的宏 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
快,PL_na
是在 ithreads 下对解释器结构的指针解除引用,在其他情况下是全局变量。
Perl_mg_free()
以前在释放内存后,仍然可以通过标量的 SvMAGIC() 访问已释放的内存。现在,它更新了链表,在释放每个魔法时将其从链表中移除。
在 ithreads 下,PL_reg_curpm
中的正则表达式现在是引用计数的。这消除了许多为了应对它没有引用计数而进行的 hackish 解决方法。
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)
等在此基础上构建,将 const
转换为 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
有 bug,应该避免使用。从 perl 5.11.0 开始,任何使用核心版本的此模块的行为都将发出警告,并且该模块最终将从核心删除(可能在 perl 5.14.0 中)。有关其替代方案,请参见 "perlsyn 中的 Switch 语句"。
suidperl
将在 5.12.0 中删除。这提供了一种机制来模拟不支持它的系统上的 setuid 权限位。
本版本中的一些工作由 TPF 资助。
Nicholas Clark 在 2008 年底正式从维护泵王职责中退休;然而,实际上,他从那时起付出了很多努力来帮助将 5.10.1 调整到可以发布的状态,包括编写了相当一部分的这个 perldelta。
特别感谢 Steffen Mueller 和 David Golden,他们帮助完善了 CPAN 模块,并使其与核心模块保持同步。
Craig Berry 不遗余力地让 maint 在 VMS 上运行,无论我们多少次把它搞坏。
其他核心提交者贡献了大部分更改,并应用了数百位贡献者(列在 AUTHORS 中)提交的大部分补丁。
(对所有未被我点名的人表示歉意)。
最后,感谢 Larry Wall,没有他,这一切都不可能实现。
如果您发现疑似错误,请查看最近发布到 comp.lang.perl.misc 新闻组的文章和 http://rt.perl.org/perlbug/ 上的 Perl 错误数据库。您也可以在 Perl 主页 https://www.perl5.cn/ 上找到相关信息。
如果您认为您遇到了未报告的错误,请运行随您的发行版提供的 perlbug 程序。请务必将您的错误缩减为一个微小但足以说明问题的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
如果您要报告的错误涉及安全问题,不适合发送到公开存档的邮件列表,请将其发送到 [email protected]。此地址指向一个封闭订阅的未存档邮件列表,其中包括所有核心提交者,他们将能够帮助评估问题的影响,找出解决方案,并帮助协调在所有支持 Perl 的平台上发布补丁以减轻或修复问题。请仅将此地址用于 Perl 核心中的安全问题,不要用于 CPAN 上独立分发的模块。
Changes 文件,其中解释了如何查看有关更改的详尽信息。
INSTALL 文件,其中介绍了如何构建 Perl。
README 文件,其中包含一般信息。
Artistic 和 Copying 文件,其中包含版权信息。