perl5200delta - perl v5.20.0 的新增内容
本文档介绍了 5.18.0 版本和 5.20.0 版本之间的差异。
如果您要从早期版本(例如 5.16.0)升级,请首先阅读 perl5180delta,其中介绍了 5.16.0 和 5.18.0 之间的差异。
声明性语法,用于将参数列表解包到词法变量中。sub foo ($a,$b) {...}
检查参数数量并将参数放入词法变量中。签名不等于现有的 sub foo { my($a,$b) = @_; ... }
惯用法。签名只能通过启用非默认特性来使用,并会生成有关实验性质的警告。当启用签名时,通过禁用短原型语法来管理与原型的语法冲突。
有关详细信息,请参见 perlsub 中的“签名”。
sub
现在采用 prototype
属性在声明或定义 sub
时,现在可以在 prototype
属性内指定原型,而不是在名称后跟括号中指定。
例如,sub foo($$){}
可以改写为 sub foo : prototype($$){}
。
子例程原型中的多个分号长期以来一直被容忍并被视为单个分号。有一种情况不会发生这种情况。原型以 "*" 或 ";*" 开头的子例程会影响裸字是否被视为方法名或子调用。现在这也适用于 ";;;*”。
长期以来允许在子例程原型中使用空格,因此 sub( $ $ )
等同于 sub($$)
,但直到现在,在解析子例程时才将其剥离。因此,Scalar::Util::set_prototype
设置的原型中不允许使用空格。现在允许这样做,并且解析器不再剥离空格。这意味着 prototype &mysub
返回原始原型,包括空格和其他所有内容。
rand
现在使用一致的随机数生成器以前,perl 会使用特定于平台的随机数生成器,在 libc rand()、random() 或 drand48() 之间变化。
这意味着 perl 随机数的质量会因平台而异,从 Windows 上 rand() 的 15 位到使用 drand48() 的 Linux 等 POSIX 平台上的 48 位。
perl 现在在其所有平台上使用自己的内部 drand48() 实现。这并不会使 perl 的 rand
在密码学上是安全的。[perl #115928]
新的 %hash{...}
和 %array[...]
语法返回键/值(或索引/值)对列表。请参阅 perldata 中的“键/值哈希切片”。
当 postderef
特性生效时,将设置以下语法等价项
$sref->$*; # same as ${ $sref } # interpolates
$aref->@*; # same as @{ $aref } # interpolates
$href->%*; # same as %{ $href }
$cref->&*; # same as &{ $cref }
$gref->**; # same as *{ $gref }
$aref->$#*; # same as $#{ $aref }
$gref->*{ $slot }; # same as *{ $gref }{ $slot }
$aref->@[ ... ]; # same as @$aref[ ... ] # interpolates
$href->@{ ... }; # same as @$href{ ... } # interpolates
$aref->%[ ... ]; # same as %$aref[ ... ]
$href->%{ ... }; # same as %$href{ ... }
标记为插值的仅在关联的 postderef_qq
特性也已启用时才插值。此特性是实验性的,在使用时会触发 experimental::postderef
类别警告,除非它们被抑制。
有关更多信息,请参阅 perlref 的后缀解除引用语法部分。
Perl 现在支持并附带 Unicode 6.3(尽管 Perl 也可以使用任何以前的 Unicode 版本重新编译)。Unicode 6.3 更改的详细列表位于 http://www.unicode.org/versions/Unicode6.3.0/。
\p{Unicode}
正则表达式模式属性这是 \p{Any}
的同义词,并匹配 Unicode 定义的代码点 0 - 0x10FFFF 的集合。
在 64 位平台上,内部数组函数现在使用 64 位偏移量,允许 Perl 数组容纳超过 2**31 个元素(如果您有可用内存)。
正则表达式引擎现在支持超过 2**31 个字符的字符串。[perl #112790,#116907]
函数 PerlIO_get_bufsiz、PerlIO_get_cnt、PerlIO_set_cnt 和 PerlIO_set_ptrcnt 现在具有 SSize_t 而不是 int 返回值和参数。
use locale
现在适用于 UTF-8 区域设置在此版本之前,仅支持单字节区域设置,例如 ISO 8859 系列。现在,越来越常见的 UTF-8 多字节区域设置也受支持。UTF-8 区域设置是指字符集为 Unicode 且编码为 UTF-8 的区域设置。在这种区域设置下,POSIX LC_CTYPE
类别操作(大小写转换(如 lc()
、"\U"
)和字符分类(\w
、\D
、qr/[[:punct:]]/
))的工作方式就像不在区域设置下一样,但就像在 use feature 'unicode_strings'
下一样,但遵循污染规则。在此版本中,排序仍按代码点顺序进行。[perl #56820]。
use locale
现在可以在没有区域设置功能的系统上编译以前这样做会导致程序无法编译。在其范围内,程序的行为就像在“C”区域设置中一样。因此,为支持区域设置的平台编写的程序可以在没有区域设置的平台上运行,而无需更改。当然,尝试将区域设置更改为非“C”区域设置将失败。
如果 Perl 启动期间出现区域设置错误,它会立即放弃并尝试使用 "C"
区域设置。现在,它首先尝试使用环境变量给出的其他区域设置,如 "ENVIRONMENT" in perllocale 中所述。例如,如果 LC_ALL
和 LANG
都已设置,并且使用 LC_ALL
区域设置失败,Perl 现在将尝试 LANG
区域设置,并且只有在该区域设置失败时,它才会回退到 "C"
。在 Windows 机器上,如果环境变量给出的所有区域设置都失败,Perl 将尝试在使用 "C"
之前使用系统默认区域设置。
-DL
运行时选项,用于跟踪区域设置这专为 Perl 核心开发者设计,以帮助调试有关区域设置的错误。
以前,没有 -a 的 -F 是无操作的,没有 -n 或 -p 的 -a 也是无操作的,有了此更改,如果你提供 -F,则 -a 和 -n 都暗示,如果你提供 -a,则暗示 -n。
你仍然可以使用 -p 来获得它的额外行为。[perl #116190]
在 sort
中使用的特殊变量 $a 和 $b 现在免于“仅使用一次”警告,即使在未使用 sort
的情况下也是如此。这使得 CPAN 模块更容易为类似目的提供使用 $a 和 $b 的函数。[perl #120462]
在一种不寻常的情况下,Perl 程序以 heredoc 结尾,磁盘上的文件最后一行没有终止换行符,有可能在解析期间读取 free()d 内存。此问题现已修复。
do
不再可用于调用子例程do SUBROUTINE(LIST)
形式自 Perl v5.0.0 起已导致弃用警告,现在是语法错误。
双引号字符串 ("..." 或 qq(...)) 或正则表达式中 \c
后面的字符现在必须是可打印字符,并且不能是 {
。
\B
或 \b
后面的字面 {
现在是致命的。
这些在 perl v5.14.0 中已弃用。
这会影响正则表达式匹配以及在 use locale
范围内更改字符串的大小写(lc
、"\U"
等)。结果现在会根据操作而受到污染,无论字符串的内容是什么,正如文档(perlsec,"SECURITY" in perllocale)所指出的那样。以前,对于大小写更改操作,如果字符串不包含任何大小写更改可能受区域设置影响的字符,则结果不会受到污染。例如,现在对空字符串或仅包含拉丁语 1 以上代码点的字符串执行 uc()
的结果会受到污染,而以前不会。这会导致更一致的污染结果。正则表达式模式会污染其非二进制结果(如 $&
、$2
),当且仅当模式包含匹配取决于当前(可能受污染的)区域设置的元素时。与大小写更改函数一样,现在正在匹配的字符串的实际内容无关紧要,而以前则相关。例如,如果模式包含 \w
,则即使匹配不必使用模式的该部分来成功或失败,结果也会受到污染,因为 \w
匹配的内容取决于区域设置。但是,例如,模式中的 .
不会启用污染,因为点匹配任何单个字符,而当前区域设置不会以任何方式更改匹配的内容和不匹配的内容。
\p{}
、\P{}
匹配已针对非 Unicode 代码点更改。\p{}
和 \P{}
仅由 Unicode 在 Unicode 定义的代码点(U+0000
到 U+10FFFF
)上定义。它们在匹配这些合法 Unicode 代码点时的行为保持不变,但对于代码点 0x110000
及以上则有更改。以前,Perl 将 \p{}
和 \P{}
针对这些代码点匹配的结果视为 undef
,这转换为“false”。对于 \P{}
,这随后被补充为“true”。当这种情况发生时,应该会发出警告。但是,各种优化可以防止发出警告,并且结果通常违反直觉,匹配及其看似补充都为 false。现在,所有非 Unicode 代码点都被视为典型的未分配 Unicode 代码点。这通常更符合预期。仅当结果与严格的 Unicode 方法以及 Perl 过去的行为存在争议时,才会发出警告。需要严格遵守 Unicode 的代码可以将此警告设为致命,然后 Perl 始终发出警告。
详细信息请参阅 "perlunicode 中的“Beyond Unicode code points”。
\p{All}
已扩展为匹配所有可能的代码点Perl 定义的正则表达式模式元素 \p{All}
,在 CPAN 上未使用,用于仅匹配 Unicode 代码点;现在它匹配所有可能的代码点;也就是说,它等效于 qr/./s
。因此,\p{All}
不再与 \p{Any}
同义,后者继续仅匹配 Unicode 代码点,正如 Unicode 所说应该的那样。
根据转储的数据结构和为 Data::Dumper 设置的设置,转储的输出可能已从以前版本更改。
如果您有依赖于 Data::Dumper 确切输出的测试,它们可能会失败。
为避免代码中出现此问题,请针对从评估转储结构中获得的数据结构进行测试,而不是转储本身。
use locale
范围之外这实际上是一个错误修复,但一些代码开始依赖于该错误的存在,因此此更改在此处列出。程序正在运行的当前区域设置不应该在 use locale
的作用域之外对 Perl 代码可见。然而,到目前为止,在某些情况下,用于小数点的字符(通常是逗号)会泄漏到该作用域之外。如果您的代码受到此更改的影响,只需添加一个 use locale
。
在以前版本的 Perl 中,Windows 套接字错误代码(由 WSAGetLastError() 返回)被分配给 $!,并且一些常量(例如 ECONNABORTED,不在 VC++(或 gcc 的各种 Windows 端口)中的 errno.h 中)被定义为相应的 WSAE* 值,以便允许 $! 根据 Errno 和 POSIX 导出的 E* 常量进行测试。
这很好用,直到 VC++ 2010 及更高版本,它引入了新的 E* 常量,其值 > 100 进入 errno.h,包括一些由 perl(重新)定义为 WSAE* 值的常量。当针对使用 errno.h 常量的原始定义的其他库链接 XS 代码时,这会导致问题。
为了避免这种不兼容,perl 现在尽可能将 WSAE* 错误代码映射到 E* 值,并将这些值分配给 $!。由 Errno 和 POSIX 导出的 E* 常量已更新以匹配,以便在以前可能的任何地方测试 $!,都将继续按预期工作,并且现在从这些模块中导出了 errno.h 中找到的所有 E* 常量,其原始 errno.h 值。
为了避免在将 WSAE* 值分配给 $! 的现有 Perl 代码中出现中断,perl 现在会拦截分配,并执行与内部在分配给 $! 本身时使用的相同的映射到 E* 值的操作。
但是,仍然存在一个向后不兼容性:将 $! 与以前分配给 $! 的 WSAE* 错误代码的数值进行比较的现有 Perl 代码,现在将在已分配相应 E* 值的情况下中断。这仅适用于那些 E* 值 < 100,这些值始终从 Errno 和 POSIX 中导出,其原始 errno.h 值,因此无法用于 WSAE* 错误代码测试(例如,WSAEINVAL 为 10022,但相应的 EINVAL 为 22)。(如果存在,E* 值 > 100,则无论如何都重新定义为 WSAE* 值,因此可以通过使用 E* 常量来实现兼容性,无论是在此更改之前还是之后,都可以使用不同的数值。)
PerlIO_vsprintf
和 PerlIO_sprintf
已被移除这两个函数未记录、在 CPAN 中未使用且存在问题,因此已将其移除。
/\C/
字符类/\C/
正则表达式字符类已弃用。从 perl 5.22 开始,它将生成警告,从 perl 5.24 开始,它将成为正则表达式编译器错误。如果您需要检查构成 UTF8 编码字符的各个字节,请首先对字符串(或副本)使用 utf8::encode()
。
此弃用影响诸如 $\cT 之类的事物,其中 \cT 是源代码中的一个文本控制(例如 NAK
或 NEGATIVE ACKNOWLEDGE
字符)。令人惊讶的是,最初这似乎是访问诸如 $^T 之类变量的规范方式,而插入符号形式只是作为一种替代方式添加的。
文本控制形式被弃用的原因主要有两个。它存在可能无法修复的错误,例如 $\cI 无法作为 $^I 的别名使用,并且它们的使用无法移植到非 ASCII 平台:虽然 $^T 在任何地方都能使用,但 \cT 在 EBCDIC 中是空白。[perl #119123]
$/
中对非整数和非正整数的引用将 $/
设置为对零的引用或对负整数的引用现在已被弃用,并且将完全表现得好像将其设置为 undef
一样。如果您想要 slurp 行为,请将 $/
明确设置为 undef
。
将 $/
设置为对非整数的引用现在已被禁止,并且会引发错误。Perl 从未记录过在这种情况下会发生什么,虽然它过去的行为与将 $/
设置为引用的地址相同,但在未来它可能会表现得不同,因此我们禁止了这种用法。
现在弃用 POSIX
模块中使用以下任何函数:isalnum
、isalpha
、iscntrl
、isdigit
、isgraph
、islower
、isprint
、ispunct
、isspace
、isupper
和 isxdigit
。这些函数有错误,并且无法处理 UTF-8 编码的字符串。有关更多信息,请参阅 POSIX 中的条目。
在从它们被调用的代码中的每个位置首次调用它们中的任何一个时,都会发出警告。(因此,循环中的重复语句只会引发一次警告。)
Perl 提供的“基于解释器的线程”并不是人们可能期望或希望的多任务快速轻量级系统。线程的实现方式使得它们很容易被误用。很少有人知道如何正确使用它们或能够提供帮助。
官方不鼓励在 perl 中使用基于解释器的线程。
以下模块将在未来的版本中从核心发行版中移除,并且届时需要从 CPAN 安装。需要这些模块的 CPAN 上的发行版需要将它们列为先决条件。
这些模块的核心版本现在将发出 “deprecated”
类别的警告来提醒您这一事实。要消除这些弃用警告,请从 CPAN 安装有问题的模块。
请注意,计划从核心移除这些模块并不反映对代码质量的判断,也不应将其视为停止使用它们的建议。它们从核心中的排除主要取决于它们对引导完全功能的、支持 CPAN 的 Perl 安装的必要性,而不是对它们设计的担忧。
以下实用程序将在未来版本中从核心发行版中移除,届时需要从 CPAN 安装。
Perl 具有新的写时复制机制,当从一个标量赋值到另一个标量时,避免了复制内部字符串缓冲区的需要。这使得复制大字符串看起来快得多。在赋值后修改两个(或更多)字符串中的一个将强制内部复制。这使得不必通过引用传递字符串来提高效率。
此功能在 5.18.0 中已经可用,但默认情况下未启用。它现在是默认值,因此您不再需要使用 Configure 参数构建 perl。
-Accflags=-DPERL_NEW_COPY_ON_WRITE
它可以在 perl 构建中(暂时)禁用
-Accflags=-DPERL_NO_COW
在某些操作系统上,可以编译 Perl,以便尝试修改多个 SV 共享的字符串缓冲区将崩溃。通过这种方式,XS 作者可以测试其模块是否正确处理写时复制标量。有关详细信息,请参阅 perlguts 中的 "Copy on Write"。
Perl 具有正则表达式模式的优化器。它分析模式以查找字符串匹配所需的最小长度等内容。它现在可以更好地处理超出 Latin1 范围的代码点。
在多种情况下,执行包含 ^
锚定(或其在 /m
标志下的变体)的正则表达式变得快得多。
现在在方法查找期间的更多位置使用预先计算的哈希值。
常量哈希键查找($hash{key}
相对于 $hash{$key}
)长期以来一直以编译时计算的内部哈希值来加速查找。此优化现在也已应用于哈希切片。
现在,在空上下文中组合的 and
和 or
运算符(如为 unless ($a && $b)
和 if ($a || b)
生成的运算符)直接短路到语句末尾。[perl #120128]
在某些情况下,当 return
是子例程主作用域中的最后一条语句时,它将被优化。这意味着像这样的代码
sub baz { return $cat; }
现在将表现为
sub baz { $cat; }
明显更快。
[perl #120765]
类似这样的代码
my $x; # or @x, %x
my $y;
现在优化为
my ($x, $y);
结合 v5.18.0 中引入的 padrange 优化,这意味着更长的未初始化 my 变量语句也已优化,因此
my $x; my @y; my %z;
变成
my ($x, @y, %z);
[perl #121077]
创建某些类型的列表(包括数组和哈希切片)现在更快。
使用小常量整数索引的数组的优化现在适用于范围为 -128..127 的整数,而不是 0..255。这应该会加快使用类似 $x[-1]
表达式的 Perl 代码的速度,但代价是使用类似 $x[200]
表达式的(可能更罕见的)代码的速度。
对大型哈希的第一次迭代(使用 keys
或 each
)现在更快。这是通过预分配哈希的内部迭代器状态来实现的,而不是在首次迭代哈希时延迟创建它。(对于小型哈希,迭代器仍然仅在首次需要时创建。假设小型哈希更有可能用作对象,因此永远不会分配。对于大型哈希,这种情况不太可能发生,并且分配迭代器的成本被分配哈希本身空间的成本所淹没。)
在对来自 readline
或 <>
运算符的字符串执行全局正则表达式匹配时,数据不再被不必要地复制。[perl #121259]
当 $obj
是已重载方法但未重载任何解引用方法 @{}
、%{}
等的类的实例时,解引用(如 $obj->[0]
或 $obj->{k}
)现在更快。
Perl 的优化器不再跳过优化某些 eval {}
表达式(包括那些具有明显无限循环的表达式)之后的代码。
该实现现在在运行时更好地避免无意义的工作。内部无效果的“空”操作(作为解析 Perl 程序的副作用创建)通常在编译期间删除。现在将删除应用于以前未处理的某些情况。
在处理最多涵盖三个连续代码点范围的 Unicode 属性时,Perl 现在执行的磁盘 I/O 更少。
experimental 0.007 已添加到 Perl 核心。
IO::Socket::IP 0.29 已添加到 Perl 核心。
Archive::Tar 已从版本 1.90 升级到 1.96。
arybase 已从版本 0.06 升级到 0.07。
Attribute::Handlers 已从版本 0.94 升级至 0.96。
attributes 已从版本 0.21 升级至 0.22。
autodie 已从版本 2.13 升级至 2.23。
AutoLoader 已从版本 5.73 升级至 5.74。
autouse 已从版本 1.07 升级至 1.08。
B 已从版本 1.42 升级至 1.48。
B::Concise 已从版本 0.95 升级至 0.992。
B::Debug 已从版本 1.18 升级至 1.19。
B::Deparse 已从版本 1.20 升级至 1.26。
base 已从版本 2.18 升级至 2.22。
Benchmark 已从版本 1.15 升级至 1.18。
bignum 已从版本 0.33 升级至 0.37。
Carp 已从版本 1.29 升级至 1.3301。
charnames 已从版本 1.36 升级至 1.40。
Class::Struct 已从版本 0.64 升级至 0.65。
Compress::Raw::Bzip2 已从版本 2.060 升级至 2.064。
Compress::Raw::Zlib 已从版本 2.060 升级至 2.065。
Config::Perl::V 已从版本 0.17 升级至 0.20。
constant 已从版本 1.27 升级至 1.31。
CPAN 已从版本 2.00 升级至 2.05。
CPAN::Meta 已从版本 2.120921 升级至 2.140640。
CPAN::Meta::Requirements 已从版本 2.122 升级至 2.125。
CPAN::Meta::YAML 已从版本 0.008 升级至 0.012。
Data::Dumper 已从版本 2.145 升级至 2.151。
DB 已从版本 1.04 升级至 1.07。
DB_File 已从版本 1.827 升级至 1.831。
DBM_Filter 已从版本 0.05 升级至 0.06。
deprecate 已从版本 0.02 升级至 0.03。
Devel::Peek 已从版本 1.11 升级至 1.16。
Devel::PPPort 已从版本 3.20 升级至 3.21。
diagnostics 已从版本 1.31 升级至 1.34。
Digest::MD5 已从版本 2.52 升级到 2.53。
Digest::SHA 已从版本 5.84 升级到 5.88。
DynaLoader 已从版本 1.18 升级到 1.25。
Encode 已从版本 2.49 升级到 2.60。
encoding 已从版本 2.6_01 升级到 2.12。
English 已从版本 1.06 升级到 1.09。
$OLD_PERL_VERSION
已作为 $]
的别名添加。
Errno 已从版本 1.18 升级到 1.20_03。
Exporter 已从版本 5.68 升级到 5.70。
ExtUtils::CBuilder 已从版本 0.280210 升级到 0.280216。
ExtUtils::Command 已从版本 1.17 升级到 1.18。
ExtUtils::Embed 已从版本 1.30 升级到 1.32。
ExtUtils::Install 已从版本 1.59 升级到 1.67。
ExtUtils::MakeMaker 已从版本 6.66 升级到 6.98。
ExtUtils::Miniperl 已从版本升级到 1.01。
ExtUtils::ParseXS 已从版本 3.18 升级到 3.24。
ExtUtils::Typemaps 已从版本 3.19 升级到 3.24。
ExtUtils::XSSymSet 已从版本 1.2 升级到 1.3。
feature 已从版本 1.32 升级到 1.36。
fields 已从版本 2.16 升级到 2.17。
File::Basename 已从版本 2.84 升级到 2.85。
File::Copy 已从版本 2.26 升级到 2.29。
File::DosGlob 已从版本 1.10 升级到 1.12。
File::Fetch 已从版本 0.38 升级到 0.48。
File::Find 已从版本 1.23 升级到 1.27。
File::Glob 已从版本 1.20 升级到 1.23。
File::Spec 已从版本 3.40 升级到 3.47。
File::Temp 已从版本 0.23 升级到 0.2304。
FileCache 已从 1.08 版升级到 1.09 版。
Filter::Simple 已从 0.89 版升级到 0.91 版。
Filter::Util::Call 已从 1.45 版升级到 1.49 版。
Getopt::Long 已从 2.39 版升级到 2.42 版。
Getopt::Std 已从 1.07 版升级到 1.10 版。
Hash::Util::FieldHash 已从 1.10 版升级到 1.15 版。
HTTP::Tiny 已从 0.025 版升级到 0.043 版。
I18N::Langinfo 已从 0.10 版升级到 0.11 版。
I18N::LangTags 已从 0.39 版升级到 0.40 版。
if 已从 0.0602 版升级到 0.0603 版。
inc::latest 已从 0.4003 版升级到 0.4205 版。注意:inc::latest 已弃用,可能会从未来版本的 Perl 中移除。
integer 已从 1.00 版升级到 1.01 版。
IO 已从 1.28 版升级到 1.31 版。
IO::Compress::Gzip 及其关联模块已从 2.060 版升级到 2.064 版。
IPC::Cmd 已从 0.80 版升级到 0.92 版。
IPC::Open3 已从 1.13 版升级到 1.16 版。
IPC::SysV 已从 2.03 版升级到 2.04 版。
JSON::PP 已从 2.27202 版升级到 2.27203 版。
List::Util 已从 1.27 版升级到 1.38 版。
locale 已从 1.02 版升级到 1.03 版。
Locale::Codes 已从 3.25 版升级到 3.30 版。
Locale::Maketext 已从 1.23 版升级到 1.25 版。
Math::BigInt 已从 1.9991 版升级到 1.9993 版。
Math::BigInt::FastCalc 已从 0.30 版升级到 0.31 版。
Math::BigRat 已从 0.2604 版升级到 0.2606 版。
MIME::Base64 已从 3.13 版升级到 3.14 版。
Module::Build 已从 0.4003 版升级到 0.4205 版。注意:Module::Build 已弃用,可能会从未来版本的 Perl 中移除。
Module::CoreList 已从 2.89 版升级到 3.10 版。
Module::Load 已从 0.24 版升级到 0.32 版。
Module::Load::Conditional 已从 0.54 版升级到 0.62 版。
Module::Metadata 已从 1.000011 版升级到 1.000019 版。
mro 已从 1.11 版升级到 1.16 版。
Net::Ping 已从 2.41 版升级到 2.43 版。
Opcode 已从 1.25 版升级到 1.27 版。
Package::Constants 已从 0.02 版升级到 0.04 版。注意:Package::Constants 已弃用,可能会从未来版本的 Perl 中移除。
Params::Check 已从 0.36 版升级到 0.38 版。
parent 已从 0.225 版升级到 0.228 版。
Parse::CPAN::Meta 已从 1.4404 版升级到 1.4414 版。
Perl::OSType 已从 1.003 版升级到 1.007 版。
perlfaq 已从 5.0150042 版升级到 5.0150044 版。
PerlIO 已从 1.07 版升级到 1.09 版。
PerlIO::encoding 已从 0.16 版升级到 0.18 版。
PerlIO::scalar 已从 0.16 版升级到 0.18 版。
PerlIO::via 已从 0.12 版升级到 0.14 版。
Pod::Escapes 已从 1.04 版升级到 1.06 版。
Pod::Functions 已从 1.06 版升级到 1.08 版。
Pod::Html 已从 1.18 版升级到 1.21 版。
Pod::Parser 已从 1.60 版升级到 1.62 版。
Pod::Perldoc 已从 3.19 版升级到 3.23 版。
Pod::Usage 已从 1.61 版升级到 1.63 版。
POSIX 已从 1.32 版升级到 1.38_03 版。
re 已从 0.23 版升级到 0.26 版。
Safe 已从 2.35 版升级到 2.37 版。
Scalar::Util 已从 1.27 版升级到 1.38 版。
SDBM_File 已从 1.09 版升级到 1.11 版。
Socket 已从 2.009 版升级到 2.013 版。
Storable 已从 2.41 版升级到 2.49 版。
strict 已从 1.07 版升级到 1.08 版。
subs 已从 1.01 版升级到 1.02 版。
Sys::Hostname 已从 1.17 版升级到 1.18 版。
Sys::Syslog 已从 0.32 版升级到 0.33 版。
Term::Cap 已从 1.13 版升级到 1.15 版。
Term::ReadLine 已从 1.12 版升级到 1.14 版。
Test::Harness 已从 3.26 版升级到 3.30 版。
Test::Simple 已从 0.98 版升级到 1.001002 版。
Text::ParseWords 已从 3.28 版升级到 3.29 版。
Text::Tabs 已从 2012.0818 版升级到 2013.0523 版。
Text::Wrap 已从 2012.0818 版升级到 2013.0523 版。
Thread 已从 3.02 版升级到 3.04 版。
Thread::Queue 已从 3.02 版升级到 3.05 版。
threads 已从 1.86 版升级到 1.93 版。
threads::shared 已从 1.43 版升级到 1.46 版。
Tie::Array 已从 1.05 版升级到 1.06 版。
Tie::File 已从 0.99 版升级到 1.00 版。
Tie::Hash 已从 1.04 版升级到 1.05 版。
Tie::Scalar 已从 1.02 版升级到 1.03 版。
Tie::StdHandle 已从 4.3 版升级到 4.4 版。
Time::HiRes 已从 1.9725 版升级到 1.9726 版。
Time::Piece 已从 1.20_01 版升级到 1.27 版。
Unicode::Collate 已从 0.97 版升级到 1.04 版。
Unicode::Normalize 已从 1.16 版升级到 1.17 版。
Unicode::UCD 已从 0.51 版升级到 0.57 版。
utf8 已从 1.10 版升级到 1.13 版。
version 已从 0.9902 版升级到 0.9908 版。
vmsish 已从 1.03 版升级到 1.04 版。
warnings 已从 1.18 版升级到 1.23 版。
Win32 已从 0.47 版升级到 0.49 版。
XS::Typemap 已从 0.10 版升级到 0.13 版。
XSLoader 已从 0.16 版升级到 0.17 版。
此文档已在 Perl v5.14 中移除(实际上已重命名为 perlgit 并进行了重大修改),导致 Perl 文档网站将 Perl v5.12 中的过期版本显示为最新版本。它现已以存根形式恢复,指导读者获取最新信息。
已添加新章节来记录新的索引/值数组切片和键/值哈希切片语法。
现在记录了 DB::goto
和 DB::lsub
调试子例程。[perl #77680]
标记与 \cK
匹配的 \s
为实验性。
ithreads 已在 v5.8.0 中接受(但在 v5.20.0 中不推荐使用)。
长双精度不再被视为实验性。
chop
和 chomp
现在指出它们可以重置哈希迭代器。
现在更清晰地记录了 exec
对参数的处理。
eval EXPR
现在对在某些区域设置中展开浮点数有警告。
现在记录了 goto EXPR
处理计算结果为代码引用的表达式,就像 goto &$coderef
一样。此行为至少有十年历史。
自 Perl v5.10 以来,@INC
中的子例程可以返回对标量(包含要预先添加到文件的初始源代码)的引用的功能。此功能现在已记录在案。
已更新 ref
的文档,建议在处理对已祝福对象的引用时使用 blessed
、isa
和 reftype
。
超级快速补丁指南 部分已更新。
已更新文档以包含更多 gdb
用法示例。
perllexwarn 文档用于描述 warnings 实用程序理解的警告类别层次结构。该描述现已移至 warnings 文档本身,将 perllexwarn 作为指向它的存根。此更改将词法警告的所有文档整合到一处。
该文档现在提到 fc() 和 \F
,并包含许多澄清和更正。
Perl 的语言设计一直要求单态运算符。现在明确提到了这一点。
Tom Christiansen 已完全重写了 open
教程,现在专注于仅介绍基础知识,而不是提供对所有可打开内容的全面参考。这次重写是 perl5-porters 上一场激烈讨论的结果,该讨论是由 Alexander Hartmaier 对现有的 perlopentut 编写的一组改进内容引发的。在 perl 的后续版本中可能会出现“比你更想了解 open
”的文档。
已记录 regexp 引擎不尝试调用 (?{}) 和 (??{}) 构造任何指定次数的事实(尽管在成功匹配的情况下它基本上会 DWIM)。
现在记录了 /r
修饰符(用于非破坏性替换)。[perl #119151]
已扩展并澄清了 /x
和 (?# comment)
的文档。
已根据最近对 regcomp.c 所做的更改更新了文档。
现在记录了预先声明递归函数和原型以使原型在递归调用中得到尊重的必要性。[perl #2726]
现在包含了 perl 实现使用的子例程名称列表。[perl #77680]
现在有一个 JavaScript 部分。
文档已更新以反映 Unicode 6.3 中的 Bidi_Class
更改。
添加了一个新部分,解释了 $`, $& 和 $' 的性能问题,包括不同版本 Perl 中的解决方法和更改。
从文档中删除了三个 英语 变量名称,这些名称长期以来都有记录,但实际上并不存在。它们是 $OLD_PERL_VERSION
、$OFMT
和 $ARRAY_BASE
。
(实际上,OLD_PERL_VERSION
确实 存在,从本次修订开始,但直到 perl 5.22.0 才记录下来。)
MY_CXT
示例中的几个问题已得到修复。
已对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参见 perldiag。
(F) 您将索引/值数组切片语法 (%array[...]
) 用作 delete
的参数。您可能打算使用带有 @ 符号的 @array[...]
。
(F) 您将键/值哈希切片语法 (%hash{...}
) 用作 delete
的参数。您可能打算使用带有 @ 符号的 @hash{...}
。
(F) 您将一个神奇数组分配给一个 stash 元素,然后尝试从同一槽使用子例程。您要求 Perl 做它不能做的事情,细节可能会在 Perl 版本之间发生变化。
“自动取消引用”功能是实验性的。
从 v5.14.0 开始,可以在聚合类型及其引用上使用 push、pop、keys 和其他内置函数。该功能未部署到其最初的预期规范,现在可能变得多余以取消后缀引用。它一直被归类为实验性功能,在 v5.20.0 中带有这样的警告。
检测到这些操作时,现在将在编译时发出警告。
no if $] >= 5.01908, warnings => "experimental::autoderef";
但请考虑替换这些功能的使用,因为它们在变得稳定之前可能会再次改变行为。
涉及 \N{...}
的这两个弃用警告实现不正确。它们不会默认发出警告(现在会发出警告),并且无法通过 use warnings FATAL => 'deprecated'
设置为致命(现在可以)。
属性 prototype(%s) 丢弃同一子程序中较早的 prototype 属性
(W misc) 例如,一个子程序被声明为 sub foo : prototype(A) : prototype(B) {}
。由于每个子程序只能有一个原型,因此在应用最后一个原型时,将丢弃较早的声明。
(W syscalls) 从 5.20 开始,路径名或其他系统调用参数中的嵌入式 \0 字符会产生警告。以前,系统调用会忽略 \0 之后的部分。
将非 Unicode 代码点 0x%X 与 Unicode 属性匹配;可能不可移植.
这替换了消息“代码点 0x%X 不是 Unicode,所有 \p{} 匹配都失败;所有 \P{} 匹配都成功”。
(W illegalproto) 使用 [
开始了一个分组,但从未使用 ]
关闭。
(W syntax) 控制流运算符(例如 return
)和低优先级运算符(例如 or
)的混合可能存在问题。考虑
sub { return $a or $b; }
这被解析为
sub { (return $a) or $b; }
这实际上只是
sub { return $a; }
使用括号或运算符的高优先级变体。
请注意,对于类似这样的结构,也可能会触发此警告
sub { 1 if die; }
(S experimental::postderef) 如果你使用实验性后缀取消引用语法,则会发出此警告。如果你想使用此功能,只需取消警告即可,但要知道这样做会冒着使用实验性功能的风险,该功能在未来的 Perl 版本中可能会更改或被删除
no warnings "experimental::postderef";
use feature "postderef", "postderef_qq";
$ref->$*;
$aref->@*;
$aref->@[@indices];
... etc ...
原型 '%s' 被 %s 中的属性 'prototype(%s)' 覆盖
(W prototype) 在子程序名称后面的括号中和通过 prototype 属性中都声明了一个原型。括号中的原型是无用的,因为它将在使用之前被属性中的原型替换。
(W 语法)在标量上下文中,您已使用数组索引/值切片(由 % 表示)来选择数组的单个元素。通常,最好请求标量值(由 $ 表示)。区别在于 $foo[&bar]
始终表现得像一个标量,无论是在它返回的值中还是在评估其参数时,而 %foo[&bar]
为其下标提供了一个列表上下文,如果您只期望一个下标,这可能会做一些奇怪的事情。在列表上下文中调用时,它还会返回索引(&bar 返回的内容)以及值。
(W 语法)在标量上下文中,您已使用哈希键/值切片(由 % 表示)来选择哈希的单个元素。通常,最好请求标量值(由 $ 表示)。区别在于 $foo{&bar}
始终表现得像一个标量,无论是在它返回的值中还是在评估其参数时,而 @foo{&bar}
为其下标提供了一个列表上下文,如果您只期望一个下标,这可能会做一些奇怪的事情。在列表上下文中调用时,它还会返回键以及值。
(S)调用了 exit() 或脚本在 PL_exit_flags
中设置了 PERL_EXIT_WARN
时以其他方式正常完成。
(S)在 PL_exit_flags
中设置了 PERL_EXIT_WARN
时调用了未捕获的 die()。
(D 已弃用)现在已弃用在源代码中使用文字控制字符来引用 ^FOO 变量,例如 $^X 和 ${^GLOBAL_PHASE}。这仅影响诸如 $\cT 的代码,其中 \cT 是源代码中的控制字符(如 SOH
):${"\cT"} 和 $^T 仍然有效。
这修复了 [Perl #42957]。
来自正则表达式引擎的警告和错误现在已 UTF-8 清理。
“未知开关条件”错误消息有一些细微的更改。当 (?(foo))
条件中有未知条件时,会触发此错误。错误消息用于读取
Unknown switch condition (?(%s in regex;
但是 %s 是什么,主要取决于运气。对于 (?(foobar))
,您可能看到“fo”或“f”。对于 Unicode 字符,您通常会得到一个损坏的字符串。消息已更改为读取
Unknown switch condition (?(...)) in regex;
此外,错误中的 '<-- HERE'
标记现在将指向正则表达式中的正确位置。
警告“%s "\x%X" 不映射到 Unicode”现在正确地列为严重警告,而不是致命错误。
在极少数情况下,可能会收到“无法将只读 REF 强制转换为字符串”而不是通常的“修改只读值”。此备用错误消息已删除。
“对 * 的模棱两可的使用解析为运算符 *”:此警告以及关于 "%" 和 "&" 的类似警告过去会在某些情况下出现,其中没有所引用的类型的运算符,因此警告完全错误。这已得到修复 [perl #117535、#76910]。
有关格式错误的子例程原型的警告现在在原型的呈现方式上更加一致。其中一些警告将截断包含空值的原型。在其他情况下,一个警告会抑制另一个警告。如果错误字符出现在下划线之前,关于原型中非法字符的警告不再显示“在 '_' 之后”。
Perl 折叠规则对于 0x%X 尚未更新;请使用 perlbug 实用工具进行报告;在正则表达式中;标记为 <-- HERE in m/%s/
此消息现在仅在正则表达式类别中,而不在弃用类别中。它仍然是默认(即严重)警告 [perl #89648]。
此警告现在针对任何已知在编译时处于标量上下文的 %array[$index]
或 %hash{key}
发生。以前表述为“标量值 %%s[%s] 最好写成 $%s[%s]”。
正则表达式中未识别出 switch 条件;标记为 <-- HERE in m/%s/:
此诊断的描述已扩展,涵盖警告可能发生的所有情况。箭头指示符定位问题也已解决。
my($a?$b$c)
和 my(do{})
的错误消息现在分别提到“条件表达式”和“do 块”,而不是读取“无法在“my”中声明空操作”。
当 use re "debug"
执行包含反向引用的正则表达式时,调试输出现在显示正在匹配的字符串。
现在致命的错误消息 Character following "\c" must be ASCII
已重新表述为 Character following "\c" must be printable ASCII
,以强调在 \cX
中,X 必须是可打印(非控制)ASCII 字符。
尝试在缓冲区开头之前访问时可能因 off-by-one 错误而崩溃的问题已得到修复。[perl #120244]
git 二分工具 Porting/bisect.pl 已得到许多增强。
它作为源代码分发的一部分提供,但未安装,因为它不是自包含的,因为它依赖于在 git 检出中运行。另请注意,它不会尝试修复测试、更正运行时错误或制作有用的东西进行安装 - 它的目的是对任何历史修订进行最小的更改,以便尽可能“按原样”构建和运行,从而使 git bisect
易于使用。
可以选择使用超时运行测试用例。
现在可以在干净的 git 检出中就地运行。
可以在 valgrind
下运行测试用例。
可以在构建之前将用户提供的补丁和修复应用到源代码检出。
现在已修复了启用构建更多历史版本的 bleadperl 的问题,这对于查明错误或行为更改的根源很有用。
find2perl 现在可以正确处理 ?
通配符。[perl #113054]
perlbug 现在有一个 -p
选项,用于在错误报告中附加补丁。
perlbug 已被修改,以便在 Windows 上使用 CRLF 行尾提供报告模板。 [GH #13612]
perlbug 现在对报告的编码尽可能少地进行假设。将来可能会更改此行为,以便默认情况下假设 UTF-8,但允许用户覆盖。
SDBM_File 的 Makefile.PL 现在生成更好的 Makefile,这避免了并行 make 期间的竞争条件,这可能导致构建失败。这是已知的最后一个并行 make 问题(在 *nix 平台上),因此我们相信并行 make 现在应该始终没有错误。
installperl 和 installman 的选项处理已重构为使用 Getopt::Long。这两个选项都由 Makefile install
目标使用,并且未安装,因此这些更改可能只影响自定义安装脚本。
单字母选项现在也有长名称。
无效选项现在会被拒绝。
现在拒绝不是选项的命令行参数。
每个选项现在都有一个 --help
选项来显示用法信息。
所有有效记录调用行为保持不变。
在可能的情况下,构建现在避免在构建纯 Perl 扩展时递归调用 make,而不会从构建中删除任何并行性。目前,大约 80 个扩展可以由 make_ext.pl 工具直接处理,这意味着不再进行 80 次 make 调用和 160 次 miniperl 调用。
在启用链接时优化(-flto
选项)的情况下使用 GCC 或 Clang 编译时,构建系统现在可以正常工作。[perl #113022]
使用 d_libname_unique
的不同库基名。
使用此选项编译 perl 时,XS 模块的库文件将被命名为“唯一”的名称——例如,Hash/Util/Util.so 将变为 Hash/Util/PL_Hash__Util.so。此行为类似于当前在 VMS 上发生的行为,并作为 Android 移植的基础。
sysroot
选项用于指示 gcc 和 clang 下的逻辑根目录。
使用此选项集进行构建时,Configure 和编译器将在新的 sysroot 下搜索所有头文件和库,而不是在 / 下。
如果进行交叉编译,这将节省大量时间,但如果工具链文件位于非标准位置,这也可以帮助进行本机构建。
交叉编译模型已更新。有几个新选项,还有一些向后不兼容的更改
我们现在为 miniperl 和 generate_uudmap 构建二进制文件以在主机上使用,而不是在目标上运行每个 miniperl 调用;这意味着,除了“make test”之外,我们不再需要在 Configure 完成后访问目标系统。你可以通过 Configure 的 hostperl
和 hostgenerate
选项提供已构建的二进制文件。
此外,如果从 ASCII 主机定位 EBCDIC 平台,反之亦然,则需要使用 -Uhostgenerate
运行 Configure,以指示应在目标上运行 generate_uudmap。
最后,还有一种方法可以在构建主机二进制文件后立即结束 Configure,方法是在不指定 targethost
的情况下进行交叉编译。
不兼容的更改包括不再使用 xconfig.h、xlib 或 Cross.pm,因此需要更新罐头配置文件和 Makefile。
与上述相关,现在有一种方法可以在目标系统上指定 sh(或等效项)的位置:targetsh
。
例如,Android 在 /system/bin/sh 中有其 sh,因此如果从在 /bin/sh 中有 sh 的更普通的类 Unix 系统进行交叉编译,“targetsh”将最终成为 /system/bin/sh,“sh”为 /bin/sh。
默认情况下,gcc 4.9 会执行一些破坏 perl 的优化。-fwrapv 选项禁用这些优化(可能还有其他优化),因此对于 gcc 4.3 及更高版本(因为较旧版本上也可能潜伏着类似的问题,但 -fwrapv 在 4.3 之前已损坏,并且优化可能不会消失),Configure 现在添加 -fwrapv,除非用户请求 -fno-wrapv(禁用 -fwrapv)或 -fsanitize=undefined(将 -fwrapv 忽略的溢出转换为运行时错误)。[GH #13690]
test.valgrind
make 目标现在允许并行运行测试。此目标允许在 Valgrind 下运行 Perl 的测试套件,后者可以检测某些类型的 C 编程错误,尽管运行时间成本很高。在合适的硬件上,允许并行执行可以弥补很多额外的成本。[perl #121431]
当 perl .git 目录位于 perl 树外部并由 $GIT_DIR
指向时,t/porting/ 中的各种测试不再被跳过。[perl #120505]
当用户的交互式 shell 维护 $PWD
环境变量,但用于运行测试的 /bin/sh 不维护时,测试套件不再失败。
现在可以在 Android 上构建 Perl,无论是原生构建还是通过交叉编译,适用于所有三种当前可用的架构(ARM、MIPS 和 x86),以及各种版本。
已为 Bitrig(OpenBSD 的一个分支)添加了编译支持。
已为 FreeMiNT 添加了支持,FreeMiNT 是 Atari ST 系统及其继任者的免费开源操作系统,基于 Atari 正式采用的原始 MiNT。
Synology 在相对便宜的 CPU(如 Marvell Kirkwood mv6282 - ARMv5tel 或 Freescale QorIQ P1022 ppc - e500v2)上为其 NAS 盒子配备精简的 Linux 发行版 (DSM),这些 CPU 不适用于工作站或开发。现在应该可以构建这些盒子。基本问题是工具的非标准位置。
sfio
已删除与支持 sfio
I/O 系统相关的代码。
Perl 5.004 添加了使用 sfio
(AT&T 的安全/快速 I/O 库)的本机 API 的支持。此代码仍然使用 v5.8.0 构建,尽管许多回归测试失败,但在 v5.8.1 发布之前无意中被破坏,这意味着它在自那时以来发布的任何 Perl 版本上都无法正常工作。十多年来,我们没有收到有关此问题的错误报告,因此很明显,没有人使用 Perl 任何版本上的此功能,而这些版本在某种程度上仍然受支持。
已删除对 3b1(也称为 AT&T Unix PC(和类似的 AT&T 7300))的配置支持。
DG/UX 是 Data General 销售的 Unix。最后一次发布是在 2001 年 4 月。它只在 Data General 自己的硬件上运行。
在没有常规烟雾报告来源的情况下,旨在支持本机 EBCDIC 平台的代码将在 5.22.0 之前从 perl 中移除。
已连接句柄上的 recv() 将使用工作缓冲区中碰巧存在的任何内容填充返回的发件人地址。recv() 现在使用类似于 Win32 recv() 包装器的解决方法,并在 recvfrom(2) 不修改提供的地址长度时返回空字符串。[perl #118843]
修复了 Cygwin 1.7.28 上 cygwin.c 中的一个构建错误。
测试现在处理 cygserver
未运行时发生的错误。
构建不再需要 BSD 兼容性库 libbsd
。
提示文件现在仅在同时需要 libgdbm
本身时才查找 libgdbm_compat
。没有后者,前者永远不会有用,并且在某些情况下,包括它实际上可能会阻止构建。
构建系统现在遵循运行 Configure 的用户提供的 ld
设置。
objformat
已从 MidnightBSD 的 0.4-RELEASE 版本中移除,并在早期版本中已弃用。这导致构建环境错误地配置为 a.out
而不是 elf
。此问题现已得到纠正。
支持混合端平台上的 pack
和 unpack
操作的代码已移除。我们认为 Perl 长期以来无法在混合端架构(例如 PDP-11)上构建,因此我们认为此更改不会影响任何能够构建 v5.18.0 的平台。
Win32 上的 rename
和 link
现在在适当的时候将 $! 设置为 ENOSPC 和 EDQUOT。[perl #119857]
用于将部分或(几乎)所有扩展静态链接(到 perl520.dll,以及单独的 perl-static.exe)的 BUILD_STATIC 和 ALL_STATIC Makefile 选项对于 MinGW 构建已损坏。此问题现已修复。
ALL_STATIC 选项也已改进,以包括 Encode 和 Win32 扩展(对于 VC++ 和 MinGW 构建)。
已添加使用 Visual C++ 2013 构建的支持。目前有两个可能的测试失败(请参阅 perlwin32 中的“在 Windows 上测试 Perl”),希望很快就能解决。
已添加使用 Intel C++ 编译器构建的实验性支持。可以使用 nmake Makefile (win32/Makefile) 和 dmake Makefile (win32/makefile.mk)。由于 cpan/CGI/t/url.t,此时“nmake test”将不会通过。
从 5.18.0 开始,使用 perlfunc 中的“kill” 和负信号来终止进程树已损坏。在此错误中,kill
始终对负信号返回 0,即使对于有效的 PID 也是如此,并且没有终止任何进程。此问题已修复 [perl #121230]。
通过减少每次 require()
(仅适用于 miniperl.exe)的通常会失败的 I/O 调用次数,已显著减少在 Windows 上构建 perl 所需的时间(通常会节省 30-40% 的时间)。[GH #13566]
由于错误导致用于测试的超时监视器在测试完成后无法取消,并且在运行下一个测试文件之前经过了完整的超时时间,因此从运行 make test
中删除了大约 15 分钟的空闲休眠时间。 [GH #13647]
在没有伪 fork 的情况下构建的 perl(此错误不受伪 fork 构建的影响)中,使用 kill()
和负信号终止进程树会导致 kill()
反转返回的值。例如,如果 kill()
终止了 1 个进程树 PID,则它返回 0 而不是 1,如果向 kill()
传递了 2 个无效的 PID,则它返回 2 而不是 0。自 Win32 上实现进程树终止功能以来,情况可能一直如此。现在已更正为遵循记录的行为。 [GH #13595]
在构建 64 位 perl 时,构建过程中使用的 miniperl.exe 中未初始化的内存读取可能导致创建 4GB 的 wperl.exe。此问题现已修复。(请注意,perl.exe 本身不受影响,但显然 wperl.exe 将完全损坏。)[GH #13677]
现在可以使用 http://www.mingw.org 中的 gcc 版本 4.8.1 构建 Perl。以前由于 perl 源文件中 DllMain() 的定义不正确,导致此问题损坏。使用 w32api 包的版本 4 时,较早的 gcc 版本也受到影响。从 http://mingw-w64.sourceforge.net/ 获得的 gcc 版本不受影响。 [GH #13733]
当在 NTFS 驱动器上使用 Windows 操作系统在 FAT 驱动器上构建 perl 时,测试框架现在没有任何故障。 [GH #6348]
在 fork() 模拟中克隆上下文堆栈时,Perl_cx_dup() 将崩溃,因为它访问了不包含任何参数的上下文堆栈条目的参数信息,例如 &foo;
。 [GH #13763]
由 [GH #12161] 引入,从 5.18.0 开始,在大多数 Win32 Perl 中,每次调用 system
和反引号 ( ``
) 时都会出现内存泄漏,此问题已得到修复。只有在 Win32 Perl 构建中启用了伪 fork,并且在 Server 2003 R2 或更新的操作系统上运行该构建时,才会发生内存泄漏。WinXP SP3 上不会出现泄漏。 [GH #13741]
XS 模块的构建已基本恢复。几个模块仍然无法构建,但现在只需几个额外的补丁(针对 Socket 和 ExtUtils::MakeMaker),就可以在 WinCE 上构建 Perl,希望很快就能合并这些补丁。
现在可以通过运行 nmake -f Makefile.ce all
在 WinCE 上一次性构建 Perl,无需用户干预。
已恢复对使用 EVC(嵌入式 Visual C++)4 进行构建的支持。还可以使用 Visual C++ 2005 或 2008 的智能设备构建 Perl。
匹配变量 $1、$2 等、$`、$&、$’、${^PREMATCH}、${^MATCH} 和 ${^POSTMATCH} 的内部表示已更改。它使用的内存更少,避免了查找期间的字符串比较和数字转换,并且使用了少 23 行的 C 代码。此更改不应影响任何外部代码。
现在数组在内部使用 NULL 表示未使用的槽,而不是 &PL_sv_undef。&PL_sv_undef 不再被视为特殊值,因此 av_store(av, 0, &PL_sv_undef) 将导致该数组的元素 0 容纳一个只读未定义标量。$array[0] = anything
将 croak,而 \$array[0]
将与 \undef
相等。
当基础哈希键未存储为 SV 时,HeSVKEY_force() 返回的 SV 现在正确反映了该键的 UTF8 性质。[perl #79074]
某些 XS 代码可用的罕用函数和宏现在已弃用。这些函数和宏包括:utf8_to_uvuni_buf
(改为使用 utf8_to_uvchr_buf
)、valid_utf8_to_uvuni
(改为使用 utf8_to_uvchr_buf
)、NATIVE_TO_NEED
(此函数本来就不正常工作)和 ASCII_TO_NEED
(此函数本来就不正常工作)。
从本版本开始,应用程序代码几乎不需要区分平台的字符集和 Unicode 最低 256 个字符所基于的 Latin1。新代码不应使用 utf8n_to_uvuni
(改为使用 utf8_to_uvchr_buf
),也不应使用 uvuni_to_utf8
(改为使用 uvchr_to_utf8
)。
针对许多罕用(或从未使用)的测试和分析目标的 Makefile 快捷目标已删除,或合并到使用它们的唯一其他 Makefile 目标中。具体来说,这些目标已删除,以及引用它们或解释如何使用它们的文档
check.third check.utf16 check.utf8 coretest minitest.prep
minitest.utf16 perl.config.dashg perl.config.dashpg
perl.config.gcov perl.gcov perl.gprof perl.gprof.config
perl.pixie perl.pixie.atom perl.pixie.config perl.pixie.irix
perl.third perl.third.config perl.valgrind.config purecovperl
pureperl quantperl test.deparse test.taintwarn test.third
test.torture test.utf16 test.utf8 test_notty.deparse
test_notty.third test_notty.valgrind test_prep.third
test_prep.valgrind torturetest ucheck ucheck.third ucheck.utf16
ucheck.valgrind utest utest.third utest.utf16 utest.valgrind
仍然可以通过“手动”方式运行相关命令 - 没有任何基础功能被删除。
现在可以阻止 Perl 初始化区域设置处理。在大多数情况下,Perl 不会关注区域设置。(请参阅 perllocale。)尽管如此,到目前为止,在启动时,它始终会将区域设置处理初始化为系统默认值,以防正在执行的程序最终使用区域设置。(这是区域设置感知程序应该做的第一件事,远在 Perl 知道是否实际需要它之前。)这很好用,除非 Perl 嵌入在需要区域设置的另一个应用程序中,该区域设置不是系统默认值。现在,如果在启动 Perl 时设置了环境变量 PERL_SKIP_LOCALE_INIT
,则会跳过此初始化步骤。在此之前,在 Windows 平台上,解决此缺陷的唯一解决方法是使用内部 Perl 代码的黑客版本。需要使用较旧 Perl 的应用程序可以通过测试 C 预处理器符号 HAS_SKIP_LOCALE_INIT
未定义来发现它们正在使用的嵌入式 Perl 是否需要解决方法。[RT #38193]
BmRARE
和 BmPREVIOUS
已被移除。它们在任何地方都没有使用,也不是 API 的一部分。对于 XS 模块,它们现在被 # 定义为 0。
sv_force_normal
通常会对只读值进行 croak,过去允许在编译时修改只读值。这已被更改为对只读值进行 croak,无论如何。此更改发现了几个核心错误。
Perl 的新写时复制机制(现在默认启用),允许任何 SvPOK
标量在复制时自动升级为写时复制标量。字符串缓冲区上的引用计数存储在字符串缓冲区本身中。
例如
$ perl -MDevel::Peek -e'$a="abc"; $b = $a; Dump $a; Dump $b'
SV = PV(0x260cd80) at 0x2620ad8
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
SV = PV(0x260ce30) at 0x2620b20
REFCNT = 1
FLAGS = (POK,IsCOW,pPOK)
PV = 0x2619bc0 "abc"\0
CUR = 3
LEN = 16
COW_REFCNT = 1
请注意,两个标量共享相同的 PV 缓冲区,并且 COW_REFCNT 大于零。
这意味着希望修改 SV 的 SvPVX()
缓冲区的 XS 代码应该首先调用 SvPV_force()
或类似代码,以确保一个有效(且未共享)的缓冲区,并在之后调用 SvSETMAGIC()
。事实上,情况一直如此(例如,哈希键已经是写时复制);此更改只是将 COW 行为传播到更广泛的 SV。
一个重要的区别是,在 5.18.0 之前,共享哈希键标量过去常常设置 SvREADONLY
标志;现在不再是这样了。
此新行为仍可以通过使用 -Accflags=-DPERL_NO_COW 运行 Configure 来禁用。此选项可能在 Perl 5.22 中被移除。
PL_sawampersand
现在是一个常量。此变量提供的开关(用于根据是否已看到 $&
来启用/禁用预匹配复制)已被移除并替换为按需复制,从而消除了几个错误。
仍可以通过使用 -Accflags=-DPERL_SAWAMPERSAND 运行 Configure 来启用之前的行为。
已移除函数 my_swap
、my_htonl
和 my_ntohl
。目前尚不清楚为什么这些函数曾被标记为 API 部分的 A。XS 代码无法直接调用它们,因为它无法依赖于它们被编译。毫不奇怪,CPAN 上没有任何代码引用它们。
Perl_re_intuit_start()
正则表达式函数的签名已更改;正则表达式引擎插件结构中的函数指针 intuit
也已相应更改。已添加一个新参数 strbeg
;它与 Perl_regexec_flags
中的同名参数具有相同的含义。以前,intuit 会尝试从传递的 SV(如果有)猜测字符串的开头,有时会出错(例如,使用重载的 SV)。
Perl_regexec_flags()
正则表达式函数的签名已更改;正则表达式引擎插件结构中的函数指针 exec
也已更改以匹配。minend
参数现在具有 SSize_t
类型,以更好地支持 64 位系统。
XS 代码可以使用各种宏来更改字符或代码点的案例(例如 toLOWER_utf8()
)。到目前为止,其中只有几个有文档记载;现在应优先使用它们来调用底层函数。请参阅 "perlapi 中的“字符大小写更改”。
代码处理 uid 和 gid 的方式相当不一致。一些地方假设它们可以安全地存储在 UV 中,另一些地方假设它们可以安全地存储在 IV 中,还有一些地方假设它们可以安全地存储在 int 中。引入了四个新宏:SvUID()、sv_setuid()、SvGID() 和 sv_setgid()
sv_pos_b2u_flags
已添加到 API 中。它类似于 sv_pos_b2u
,但在 64 位平台上支持长字符串。
perl 嵌入式程序或其他 XS 代码现在可以使用 PL_exit_flags
让 perl 在尝试退出时发出 warn
或 abort
。[perl #52000]
使用 -Accflags=-PERL_BOOL_AS_CHAR
进行编译现在允许 C99 和 C++ 编译器模拟 perl 为 C89 编译器执行的 bool
到 char
的别名。[perl #120314]
在 "perlapi 中的“sv_2pv_flags”、"perlapi 中的“sv_2iv_flags”、"perlapi 中的“sv_2uv_flags” 和 "perlapi 中的“sv_2nv_flags” 中的 sv
参数及其较旧的包装器 sv_2pv、sv_2iv、sv_2uv、sv_2nv 现在是非 NULL 的。现在传递 NULL 将导致崩溃。当在 5.9.3 中大量引入非 NULL 标记时,这些函数被标记为非 NULL,但自 5.0 alpha 2 中创建 SV API 以来,如果传递了 NULL,这些函数将返回 0 或 false 类型的值。支持 sv
参数为非 NULL 的代码直接追溯到 5.0 alpha 2,间接追溯到 Perl 1.0(5.0 api 之前)。函数接受 NULL sv
的文档缺失已在 5.11.0 中得到纠正,并且在 5.11.0 和 5.19.5 之间,这些函数被标记为 NULLOK。作为优化,NULLOK 代码现已移除,并且这些函数再次被标记为非 NULL,因为核心 getter 类型宏永远不会将 NULL 传递给这些函数,并且会在传递 NULL 之前崩溃。
将 NULL sv
传递给 sv_2*v* 函数的唯一方法是,如果 XS 代码直接调用 sv_2*v*。这不太可能,因为 XS 代码使用 Sv*V* 宏来从 SV 中获取基础值。导致将 NULL sv
传递给 sv_2*v* 函数的一种可能情况是,如果 XS 代码定义自己的 getter 类型 Sv*V* 宏,它在取消引用和通过公共 API Sv*OK* 宏检查 SV 的标志或直接使用私有 API SvFLAGS
之前检查 NULL,并且如果 sv
为 NULL,则使用 NULL 字面值调用 sv_2*v 函数或传递包含 NULL 值的 sv
。
newATTRSUB 现在是一个宏
公共 API newATTRSUB 以前是私有函数 Perl_newATTRSUB 的宏。函数 Perl_newATTRSUB 已被移除。newATTRSUB 现在是其他内部函数的宏。
utf8n_to_uvchr()
引发的警告更改
此底层函数将 UTF-8 字符串的第一个字符解码为代码点。XS 级代码可以访问它,但建议不要直接使用它。有调用此函数的高级函数,应该使用它们,例如 perlapi 中的“utf8_to_uvchr_buf”。但为了完整性,本文档记录了对其进行的一些更改。现在,在对其他潜在问题进行任何测试之前,先对畸形进行测试。其中一个问题涉及代码点太大,以至于它们从未出现在任何官方标准中(当前标准已将最高可接受代码点从早期版本中缩减)。有可能警告和/或禁止这些代码点(尽管 CPAN 中没有这样做),同时接受仍然高于合法 Unicode 最大值的较小代码点。此警告消息现在包括代码点(如果可以在机器上表示)。以前它总是显示原始字节,而对于不可表示的代码点,它仍然这样做。
影响可插拔正则表达式引擎接口的正则表达式引擎更改
许多以前通过 regexp.h 公开并用于填充 struct regexp 的 extflags 成员的标志已被移除。从技术上讲,这些字段是 Perl 自身正则表达式引擎的私有字段,一开始就不应该在那里公开。
受影响的标志是
RXf_NOSCAN
RXf_CANY_SEEN
RXf_GPOS_SEEN
RXf_GPOS_FLOAT
RXf_ANCH_BOL
RXf_ANCH_MBOL
RXf_ANCH_SBOL
RXf_ANCH_GPOS
以及以下标志掩码
RXf_ANCH_SINGLE
RXf_ANCH
所有标志都已重命名为 PREGf_ 等效标志,并移至 regcomp.h。
以前通过设置一个或多个 RXf_ANCH_ 标志(通过 RXf_ANCH 掩码)实现的行为现在已被 extflags 中的 *单个* 标志位取代
RXf_IS_ANCHORED
以前用于设置这些标志的可插入式正则表达式引擎现在应该单独设置此标志。
Perl 核心现在始终使用 av_tindex()
(“数组的最高索引”)作为 av_len()
的一个命名更清晰的同义词。
预计在 5.21.x 开发系列的早期移除模糊的解释器变量 PL_timesbuf
,以便 Perl 5.22.0 不会将其提供给 XS 作者。虽然该变量在 5.20.0 中仍然存在,但我们希望对弃用的提前警告将帮助任何正在使用该变量的人。
修复了少数正则表达式构造,在 32 位系统上匹配的字符串在 2GB 线以上分配时,这些构造可能会匹配失败或导致 perl 崩溃。[RT #118175]
已修复涉及解析 (?[...])
正则表达式构造的各种内存泄漏。
(?[...])
现在允许插值预编译模式,其中包含带有括号字符类的 (?[...])
($pat = qr/(?[ [a] ])/; /(?[ $pat ])/
)。以前,括号会混淆正则表达式解析器。
从 Perl v5.10 开始,对于也包含交替(例如,“a|b”)触发 trie 优化的正则表达式,“量词在零长度表达式中意外出现”警告消息可能会出现两次。
Perl v5.18 无意中引入了一个错误,即在正则表达式中插值混合了升级和降级的 UTF-8 字符串会导致模式中的 UTF-8 格式错误:特别是如果范围内的降级字符 \x80..\xff
后面跟着一个 UTF-8 字符串,例如
utf8::upgrade( my $u = "\x{e5}");
utf8::downgrade(my $d = "\x{e5}");
/$u$d/
[RT #118297]
在包含多个代码块的正则表达式中,由嵌套正则表达式调用设置的 $1
、$2
等值会从一个块泄漏到下一个块。现在,这些变量在嵌入式块的开始处始终引用外部正则表达式 [perl #117917]。
/$qr/p
在 Perl 5.18.0 中已损坏;忽略了 /p
标志。此问题已修复。[perl #118213]
从 Perl 5.18.0 开始,类似于 /[#](?{})/x
的结构会错误地将其 #
解释为注释。代码块将被跳过,不会进行解析。此问题已得到修复。
从 Perl 5.001 开始,类似于 /[#$a]/x
或 /[#]$a/x
的正则表达式会错误地将其 #
解释为注释,因此变量不会进行插值。此问题已得到修复。[perl #45667]
Perl 5.18.0 无意中将取消引用的正则表达式 (${ qr// }
) 作为布尔值返回 false。此问题已得到修复。
在正则表达式中使用 \G
(不在模式的开头)现在错误更少(尽管仍然存在一些问题)。
如果正则表达式包含代码块(/(?{...})/
),并且常量重载的使用触发了代码块的重新编译,则第二次编译不会看到其外部词法范围。这是 Perl 5.18.0 中的一个回归。
由 pos
设置的字符串位置可能会发生变化,如果字符串在内部表示形式从 utf8 更改为其他形式或从其他形式更改为 utf8。例如,当引用具有字符串重载的对象时,可能会发生这种情况。
使用相同参数引用两个 pos
调用的返回值,然后将一个引用赋值给一个,将 undef
赋值给另一个,可能会导致断言失败或内存泄漏。
@- 和 @+ 的元素现在在引用不存在的捕获时会正确更新。以前,引用元素($ref = \$-[1]
)在后续匹配后可能会引用错误的匹配。
解析正则表达式反向引用(或模棱两可的反向引用/八进制数)的代码(例如 \123)执行简单的 atoi(),这可能会在长数字字符串上环绕为负值并导致分段错误。此问题现已得到修复。[perl #119505]
将另一个类型全局变量分配给 *^R
不再会导致正则表达式引擎崩溃。
正则表达式转义 \N
在不使用大括号(表示 [^\n]
)的情况下,如果后面跟着空格,则会忽略后面的 *
(在 /x 下)。自 5.12.0 中引入 \N
表示 [^\n]
以来一直如此。
当宽字符用作分隔符时,s///
、tr///
和 y///
现在可以正常工作。[perl #120463]
正则表达式中某些未终止的 (?...) 序列(例如,/(?</
)已得到修复,以生成正确的错误消息,而不是“panic: memory wrap”。其他情况(例如,/(?(/
)尚未修复。
当从正则表达式(??{...})
代码块返回对重载对象的引用的引用时,如果内部引用之前已由代码块返回,则可能会发生不正确的隐式取消引用。
从(??{...})
返回的绑定变量在其 FETCH 方法中看到匹配变量的内部值(即块内任何匹配项中的 $1 等)。如果对重载对象的引用是分配给绑定变量的最后一项,则情况并非如此。相反,匹配变量在 FETCH 调用期间引用外部模式。
使用区域设置修复意外的正则表达式污染。以前,在某些条件下,字符类的使用可能会在不应该污染时导致污染。一些字符类依赖于区域设置,但在此修补程序之前,有时即使对于不依赖于区域设置的字符类也会发生污染。[perl #120675]
在某些条件下,如果正则表达式中的后向断言中,断言引用了命名子模式,Perl 会抛出一个错误,抱怨后向断言是可变的,而实际上并非如此。此问题已修复。[perl #120600]、[perl #120618]。当前的修复程序将来可能会得到改进。
$^R
在初始化它的正则表达式之外不可用。[perl #121070]
合并了一大组针对 re_intuit_start() 的修复和重构,重点如下
修复了在编译正则表达式/\x{100}[xy]\x{100}{2}/
时的恐慌。
修复了针对 UTF-8 字符串执行全局模式匹配时的性能回归。[perl #120692]
修复了另一个性能问题,其中针对长 UTF-8 字符串匹配正则表达式/ab.{1,2}x/
时,会不必要地计算字符串大部分的字节偏移量。[perl #120692]
修复了在 HP-UX 64 位上使用 GCC 构建时编译正则表达式时的对齐错误。
在 64 位平台上,pos
现在可以设置为高于 2**31-1 的值。[perl #72766]
调试器的man
命令已修复。它在 v5.18.0 版本中已损坏。man
命令别名为doc
和perldoc
- 现在所有命令都再次起作用。
@_
现在可以在调试器中正确显示,修复了 v5.18.0 的调试器中引入的回归。[RT #118169]
在写时复制构建(5.20.0 的默认值)下,${'_<-e'}[0]
不再被破坏。这是为单行文本保存的用于调试器的第一行输入 [perl #118627]。
在非线程构建中,将 ${"_<filename"}
设置为引用或类型全局变量不再导致 __FILE__
和一些错误消息生成损坏的字符串,并且不再阻止字符串求值中的 #line
指令向调试器提供源代码行。线程构建不受影响。
从 Perl 5.12 开始,如果在 #! 行上使用 -d 开关,则行号会减少一。现在它们是正确的。
*DB::DB = sub {} if 0
不再阻止 Perl 的调试模式查找此后声明的 DB::DB
子例程。
%{'_<...'}
哈希现在在相应的 @{'_<...'}
上设置断点,而不是 @DB::dbline
别名指向的任何数组。[perl #119799]
设置 $DB::sub 时调用 set-magic。[perl #121255]
调试器的“n”命令现在尊重左值子例程并跨过它们 [perl #118839]。
词法常量(my sub a() { 42 }
)在内联时不再崩溃。
现在在不带括号编译子例程调用时,尊重附加到词法子例程的参数原型。以前,仅当调用带括号时才会遵守原型。[RT #116735]
词法子例程中的语法错误与对同一子例程的调用结合在一起时,不再在编译时导致崩溃。
深度递归警告不再使词法子例程崩溃。[RT #118521]
dtrace 子条目探测现在可以与词法子例程一起使用,而不是崩溃 [perl #118305]。
取消定义可内联的词法子例程(my sub foo() { 42 } undef &foo
)如果启用了警告,将导致崩溃。
用作继承方法的未定义词法子例程不再崩溃。
名为“CORE”的词法子例程的存在不再阻止 CORE:: 前缀工作。
对于 struct pmop
,OP 分配代码现在在所有情况下都返回正确对齐的内存。以前,它只能返回对齐到 4 字节边界的内存,这对于在某些 32 位平台上使用 64 位 IV 构建的 ithreads 来说是不正确的。值得注意的是,这导致构建在 sparc GNU/Linux 上完全失败。[RT #118055]
在标量上下文中计算大型哈希现在快得多,因为现在会为较大的哈希缓存哈希中使用的链数。较小的哈希继续不存储它,并在需要时计算它,因为这可以节省一个 IV。对于从哈希构建的每个对象,这将是 1 个 IV 的开销。[RT #114576]
Perl v5.16 无意中引入了一个错误,即对编译时不可见的 XSUB 的调用被视为左值,并且可以被赋值,即使子例程不是左值子例程。此问题已修复。[RT #117947]
在 Perl v5.18.0 中,对于字符串部分为空字符串但数字部分为非零数字的 dualvar 开始被视为 true。在以前的版本中,它们被视为 false,字符串表示形式优先。旧行为已恢复。[RT #118159]
自 Perl v5.12 以来,覆盖具有相同名称的内置关键字的常量的内联已违背 use subs
,导致对常量的后续提及使用内置关键字。此问题已修复。
-l $handle
产生的警告现在适用于 IO 引用和 glob,而不仅仅是 glob 引用。该警告现在也已 UTF8 清理。[RT #117595]
delete local $ENV{nonexistent_env_var}
不再泄露内存。
sort
和 require
后跟以 CORE::
为前缀的关键字现在将其视为关键字,而不是子例程或模块名称。[RT #24482]
通过某些难题,有可能导致释放当前包。某些运算符(bless
、reset
、open
、eval
)无法应对并会崩溃。它们已经变得更加有弹性。[RT #117941]
如果存在与文件句柄同名的包,则通过 glob 到 glob 赋值别名文件句柄不会正确更新内部方法缓存,导致文件句柄方法调用转到包。此问题已修复。
./Configure -de -Dusevendorprefix
没有默认值。[RT #64126]
Statement unlikely to be reached
警告在 perldiag 中列为 exec
类别警告,但由 syntax
类别启用和禁用。另一方面,exec
类别控制其致命性。现在它完全由 exec
类别处理。
在存在 /c
标志的情况下,tr///
和 y///
的“替换列表比搜索列表长”警告不再出现。[RT #118047]
NV 的字符串化未被缓存,以便语言环境控制小数点的字符串化。[perl #108378] [perl #115800]
已修复 Perl 处理区域设置的几个问题。perl #38193 已在 "内部变更" 中进行了描述。还修复了 #118197,其中基数(小数点)字符必须是 ASCII 字符(对于某些非西方语言不起作用);以及 #115808,其中 POSIX::setlocale()
在失败时返回一个 undef
,即使启用了这些警告,也不会警告未定义。
不再会因编译第三个参数为求值为 0 的命名常量的 split
运算符而导致该常量值发生更改。
用作 index
第二个参数的命名常量不再会强制转换为字符串(如果它是一个引用、正则表达式、双变量等)。
用作 index
第二个参数的求值为未定义值的命名常量不再会在编译时产生“未初始化”警告。它仍会在运行时产生这些警告。
当从 @INC 中的子例程返回标量时,引用的标量会神奇地转换为 IO 事物,如果该标量继续在其他地方使用,可能会导致“奇怪的复制”错误。现在 Perl 使用标量的内部副本。
对 sort
运算符的某些用法进行了优化,以修改数组,例如 @a = sort @a
。在排序期间,数组变为只读。如果排序块碰巧死亡,那么即使在 sort
之外,数组仍然保持只读。此问题已得到修复。
排序块内的 $a
和 $b
别名为 sort
的实际参数,因此可以通过这两个变量对其进行修改。这并不总是有效,例如,对于 lvalue 子例程和 $#ary
,以及可能还有许多其他运算符。现在它有效了。
sort
的参数现在都在列表上下文中。如果 sort
本身是在 void 或标量上下文中调用的,那么 一些(但不是全部)参数过去常常在 void 或标量上下文中。
闭包克隆期间,包含高于 U+00FF 的 Unicode 字符的子例程原型会变得混乱。这会发生在关闭在外部声明的词法变量的子例程以及词法子例程中。
UNIVERSAL::can
现在对其第一个参数的处理方式与方法调用相同:具有非空 IO 槽的类型全局和全局引用被视为句柄,如果存在具有该名称的句柄,则字符串被视为文件句柄,而不是包 [perl #113932]。
对类型全局变量(例如,*ARGV->getline
)进行的方法调用用于将类型全局变量字符串化,然后再次查找它。结合 Perl 5.18.0 中的更改,这允许 *foo->bar
调用“foo”包上的方法(例如 foo->bar
)。在某些情况下,它可能导致对错误句柄调用方法。现在,类型全局变量参数被视为句柄(就像 (\*foo)->bar
),或者,如果其 IO 槽为空,则会引发错误。
现在可以将 vstring 分配给已绑定变量或别名为不存在的哈希或数组元素的子例程参数,而无需将 vstring 展平为常规字符串。
pos
、tie
、tied
和 untie
在别名为不存在的哈希和数组元素的子例程参数上无法正常工作 [perl #77814、#27010]。
=>
粗箭头运算符现在可以引用内置关键字,即使它出现在下一行中,使其与它处理其他裸字的方式保持一致。
通过 \&$glob
自动激活子例程存根开始在 Perl 5.18.0 中导致崩溃,如果 $glob 仅仅是真实全局变量的副本,即已分配全局变量的标量。此问题已修复。[perl #119051]
Perl 在引用某些运算符的返回值时会泄露实现细节。for ($a+$b) { warn \$_; warn \$_ }
用于显示两个不同的内存地址,因为 \
运算符正在复制变量。在多线程构建中,它也会发生在常量上(for(1) { ... }
)。此问题已修复。[perl #21979、#78194、#89188、#109746、#114838、#115388]
范围运算符 ..
在每次调用时都会返回相同的可修改标量,除非它是 foreach
循环头中的唯一内容。这意味着对返回列表中值进行的更改将在下次执行运算符时可见。[perl #3105]
常量折叠和子例程内联不再导致通常会返回新可修改标量的操作改为返回只读值。
不再内联 sub () { $some_variable }
形式的闭包,导致对变量的更改被子例程的调用者忽略。[perl #79908]
某些运算符(如 ref
)的返回值有时会在对同一子例程的递归调用之间共享,导致内部调用修改外部调用中 ref
返回的值。此问题已修复。
__PACKAGE__
和返回包名称或哈希键的常量现在始终为只读。在以前的各种 Perl 版本中,它们在某些情况下已变为可变。
启用“仅使用一次”警告不再导致在编译时创建的 stash 循环中崩溃(*Foo::Bar::Foo:: = *Foo::
)。
哈希键中使用的未定义常量(use constant u => undef; $h{+u}
)不再在编译时产生“未初始化”警告。
修改替换中的替换目标不再导致崩溃。
字符串 eval 中的第一条语句有时会在常量折叠期间使用错误的 pragma 设置。eval 'uc chr 0xe0'
将在 Unicode、字节和区域设置语义之间随机选择。此问题已修复。
已通过多种方式修复了 @INC 筛选器(@INC 中的子例程返回的子例程)的返回值处理。以前,已绑定的变量处理不当,并且将 $_ 设置为引用或类型全局变量可能会导致崩溃。
已修复 SvPVbyte
XS 函数,使其可与返回非字符串的已绑定标量一起使用。在 SvPV
会返回 utf8 的情况下,它过去常常返回 utf8。
Perl 5.18.0 无意中使 --
和 ++
在取消引用的正则表达式上崩溃,并阻止 ++
展平 vstring。
如果 bless
的第一个参数是已绑定的引用,则 bless
不再因“无法祝福非引用值”而终止。
带有参数的 reset
不再跳过写时复制标量、正则表达式、类型全局变量副本和 vstring。此外,在遇到这些值或只读值时,它不再跳过具有相同名称的任何数组或哈希。
带有参数的 reset
现在跳过别名为类型全局变量的标量(for $z (*foo) { reset "z" }
)。以前,它会损坏内存或导致崩溃。
ucfirst
和 lcfirst
不尊重 bytes pragma。这是 Perl 5.12 中的一个回归。[perl #117355]
对 UNIVERSAL::DESTROY
的更改现在会更新所有类中的 DESTROY 缓存,而不是导致已经销毁对象的类继续使用旧的子例程。这是 Perl 5.18 中的一个回归。[perl #114864]
已移除 Perl 5.18.0 中添加的弃用警告“无用的 '\';不会转义元字符 '%c'”的所有已知误报。[perl #119101]
现在在 Windows 上的信号处理程序中保存 $^E 的值。[perl #85104]
词法文件句柄(如 open my $fh...
)通常根据当前包和变量的名称指定一个名称,例如“main::$fh”。在递归中,文件句柄丢失了名称的“$fh”部分。此问题已修复。
XSUB 返回的未初始化值不再豁免于未初始化警告。[perl #118693]
elsif ("")
不再错误地生成有关空上下文的警告。[perl #118753]
现在将 undef
传递给子例程会导致 @_ 包含 undef
返回的相同只读未定义标量。此外,如果 undef
是第一个参数,则 exists $_[0]
现在将返回 true。[perl #7508, #109726]
将不存在的数组元素传递给子例程通常不会自动生成它,除非子例程修改其参数。对于负索引和数组中不存在的元素,此操作无法正常工作。该元素将立即生成。延迟生成已扩展到适用于这些元素。[perl #118691]
在释放 @foo 数组后,将引用或全局变量分配给 $#foo 返回的标量不再导致调试版本中的断言失败和常规版本中的内存泄漏。
在 64 位平台上,1..1000000000000 等大范围不再崩溃,而是会耗尽所有内存。[perl #119161]
__DATA__
现在将 DATA
句柄放入正确的包中,即使当前包已通过全局变量分配重命名。
当 die
、last
、next
、redo
、goto
和 exit
展开作用域时,DESTROY
可能会递归调用当前正在退出的子例程或格式。在这种情况下,子例程中的词法变量有时会从外部调用开始具有值,而不是像应有的那样未定义。此问题已修复。[perl #119311]
${^MPEN} 不再被视为 ${^MATCH} 的同义词。
Perl 现在会更加努力地在 (caller)[2]
中返回正确的行号。[perl #115768]
现在正确报告了多行引号类运算符内的行号。[perl #3643]
现在遵守引号类运算符中嵌入的代码内的 #line
指令。
当同一行上出现两个 here-doc 标记时,现在第二个 here-doc 内的行号正确。
Perl 5.18 中的一项优化做出了错误的假设,导致与 Devel::CallParser CPAN 模块交互不良。如果加载了该模块,则在 my(...)
列表后在单独语句中声明的词法变量可能无法在作用域退出时清除。
&xsub
和 goto &xsub
调用现在允许被调用的子例程自动生成 @_ 的元素。
如果 *_ 未定义且没有 ARRAY 条目(即 @_ 不存在),则 &xsub
和 goto &xsub
不再崩溃。
&xsub
和 goto &xsub
现在可与绑定的 @_ 配合使用。
过长的标识符不再导致缓冲区溢出(和崩溃)。它们从 Perl 5.18 开始这样做。
警告“标量值 @hash{foo} 最好写成 $hash{foo}”现在产生的误报更少。特别是,@hash{+function_returning_a_list}
和 @hash{ qw "foo bar baz" }
不再发出警告。数组切片也适用。[perl #28380, #114024]
$! = EINVAL; waitpid(0, WNOHANG);
不再进入内部无限循环。[perl #85228]
已修复文件句柄复制中可能存在的段错误。
@INC 中的子例程可以返回对包含文件初始内容的标量的引用。但是,如果在其他地方没有引用该标量,则会过早释放该标量,从而产生随机结果。
last
不再返回到目前为止同一语句累积的值,这修复了长期存在的错误,即 push @a, last
会尝试返回 @a,在此过程中将其复制为标量,并导致错误“last 中的 ARRAY 副本很奇怪”。[perl #3112]
在某些情况下,关闭已打开的文件句柄以通过管道与进程通信,该进程已复制到标准句柄中,将使用 pid 为零调用 perl 的内部 waitpid 包装器。使用 [perl #85228] 修复程序后,此 pid 为零将传递给 waitpid
,可能会阻塞进程。不再等待进程为零。[perl #119893]
select
过去会忽略第四个(超时)参数上的魔术,从而导致 select
无限期阻塞而不是预期的睡眠时间等影响。此问题现已修复。[perl #120102]
for my class $foo
中的类名现在可以正确解析。如果类名的第二个字符后跟一个数字(例如“a1b”),则过去会给出“循环变量上缺少 $”错误。[perl #120112]
Perl 5.18.0 在 use strict
和 use integer
下意外地禁止了 -bareword
。此问题已修复。[perl #120288]
行首的 -a
(或连字符和任何不是文件测试运算符的单个字母)不再产生错误的“不带括号使用“-a”是模棱两可的”警告。[perl #120288]
左值上下文现在可以正确传播到 lvalue 子例程中的 bare 块和 if
和 else
块。以前,数组和哈希在以 lvalue 列表上下文返回时有时会错误地展平,或者可能发生“奇怪的复制”错误。[perl #119797]
左值上下文现在传播到 ||
和 &&
的分支(及其字母等效项 or
和 and
)。这意味着 foreach (pos $x || pos $y) {...}
现在允许通过 $_ 修改 pos
。
stat
和 readline
记住上次使用的句柄;前者用于特殊 _
文件句柄,后者用于 ${^LAST_FH}
。如果 *foo 是传递给 stat
或 readline
的最后一个句柄,则 eval "*foo if 0"
可能导致忘记该句柄,如果该句柄尚未打开。此问题已修复。
导致崩溃的 delete $::{a}
、delete $::{ENV}
等各种情况已修复。[perl #54044]
在调用 require
之前将 $!
设置为 EACCESS 可能会影响 require
的行为。此问题已修复。
“不能在表达式中使用 \1 表示 $1”警告消息现在仅出现在替换的右半部分。以前,它可能发生在嵌入在左侧的代码中,或在任何其他类似引号的运算符中。
祝福引用(bless $thisref, $thatref
)长期以来一直不被允许,但第二个的魔术标量(如 $/
和绑定的标量)是例外。它们不再是例外。[perl #119809]
如果类参数是具有陈旧方法缓存的祝福引用(即自上次方法调用以来已定义子类的类),则在 5.18 中意外地允许祝福引用。它们再次被禁止,就像在 5.16 中一样。
如果 $x 被声明为 my Class $x
,则 $x->{key}
在声明了 Class::FIELDS 子例程存根后不再崩溃。
@$obj{'key'}
和 ${$obj}{key}
过去免于编译时字段检查(“没有这样的类字段”;参见 字段),但现在不再免于检查。
传递给子例程的具有大索引的非存在数组元素(该子例程绑定该数组并随后尝试访问该元素)不再导致崩溃。
声明名为 NEGATIVE_INDICES 的子例程存根不再导致负数组索引在当前包为绑定数组类时崩溃。
在 CORE::GLOBAL:: 包中声明 require
、glob
或 do
子例程存根不再导致对相应函数的调用编译崩溃。
在 Perl 5.10 中将 CORE::GLOBAL:: 函数别名化为常量已停止工作,但现在已修复。
当 `...`
或 qx/.../
调用 readpipe
覆盖时,现在发生双引号内插,就像没有覆盖时的情况一样。以前,覆盖的存在会使这些类似引号的运算符像 q{}
一样作用,从而抑制内插。[perl #115330]
<<<`...`
here-docs(以反引号为分隔符)现在调用 readpipe
覆盖。[perl #119827]
&CORE::exit()
和 &CORE::die()
现在遵循 vmsish 提示。
取消定义触发了取消定义同一 glob 的 DESTROY 方法的 glob 现在是安全的。它过去会产生“尝试释放未引用的 glob 指针”警告并泄漏内存。
如果子例程重新定义(针对 XS 代码的 eval 'sub foo{}'
或 newXS
)触发了正在重新定义的子例程上的 DESTROY 方法,并且该方法将子例程分配给同一槽(*foo = sub {}
),则 $_[0]
不再指向已释放的标量。现在,DESTROY 会延迟,直到安装了新的子例程。
在 Windows 上,perl 不再对套接字句柄调用 CloseHandle()。这通过移除某些无关的错误句柄异常,从而简化了 Windows 上的调试。它还修复了一个竞争条件,该条件使套接字函数在具有多个 OS 线程的 Perl 进程中随机失败,并且可能导致 dist/IO/t/cachepropagate-tcp.t 中的测试失败。[perl #120091/118059]
涉及 UTF-8 编码字符串或诸如绑定、重载或字符串化引用(以及在最近的 perl 中,纯 NOK 变量)等奇怪变量的格式通常会在将变量视为字符串并重复截断时在格式中执行错误的操作,例如在 ^<<<~~
和类似情况下。此问题现已解决。[perl #33832/45325/113868/119847/119849/119851]
semctl(..., SETVAL, ...)
会将信号量设置为提供的整数的顶部 32 位,而不是在 64 位大端系统上的底部 32 位。[perl #120635]
readdir()
现在仅在出错时设置 $!
。当从目录中读取终止的 undef
时,$!
不再设置为 EBADF
,除非系统调用设置 $!
。[perl #118651]
&CORE::glob
不再因 perl 堆栈损坏而导致间歇性崩溃。[perl #119993]
具有加载模块的层的 open
(例如,“<:encoding(utf8)”) 不再因堆栈损坏而导致崩溃的风险。
Perl 5.18 通过从当前包而不是当前包的超类中查找 AUTOLOAD,中断了通过 ->SUPER::foo
方法调用进行的自动加载。此问题已修复。[perl #120694]
导致 do {} until CONSTANT
(其中常量保存真值)读取未分配内存的长期存在的 bug 已得到解决。这通常会在语法错误后发生。在过去版本的 Perl 中,它会间歇性崩溃。[perl #72406]
修复 HP-UX $!
故障。HP-UX strerror() 为未知错误代码返回一个空字符串。这导致在 DEBUGGING 构建下断言失败。现在,"$!"
的返回字符串包含指示代码为未知错误的文本。
现在正确处理 @INC 的单独绑定的元素(如 tie $INC[0]...
)。以前,由这样的绑定元素返回的子例程是否被视为子例程取决于之前是否发生过 FETCH。
在对 utf8 句柄使用相同的 getc
运算符后,对字节大小句柄使用 getc
,将字节视为 utf8,导致行为不稳定(例如,格式错误的 UTF-8 警告)。
在格式化参数行开头处的初始 {
在 v5.18 之前始终被解释为块的开头。在 Perl v5.18 中,它开始被视为一个模棱两可的标记。解析器将根据内容猜测它应该是匿名哈希构造函数还是块。现在已恢复之前的行为。[perl #119973]
在 Perl v5.18 中,undef *_; goto &sub
和 local *_; goto &sub
开始崩溃。此问题已修复。[perl #119949]
反引号( ``
或 qx//
)与 Win32 上的多线程结合使用可能会导致在一个线程上发送到 stdout 的输出被另一个线程中的外部命令的反引号捕获。
这对于伪分叉进程也可能发生,因为 Win32 的伪分叉是在线程方面实现的。[perl #77672]
open $fh, ">+", undef
不再泄露内存,此时 TMPDIR 已设置,但指向无法创建临时文件的目录。[perl #120951]
for ( $h{k} || '' )
不再自动激活 $h{k}
。[perl #120374]
在 Windows 机器上,Perl 现在模拟 POSIX 使用环境进行区域设置初始化。以前,环境被忽略。请参阅 "ENVIRONMENT" in perllocale。
修复了在销毁自引用 GLOB 时崩溃的问题。[perl #121242]
IO::Socket 已知在 AIX 5.3 上测试失败。请求跟踪器中有一个 补丁,#120835,可应用于未来版本。
已知以下模块在此版本的 Perl 中测试失败。补丁已提交,因此希望很快会有新版本
Data::Structure::Util 版本 0.15
HTML::StripScripts 版本 1.05
List::Gather 版本 0.08。
27 岁的 Diana Rosa 来自里约热内卢,于 2014 年 5 月 10 日与她一直挂在电脑屏幕上的毛绒骆驼一起安息。她是一位热情的 Perl 黑客,热爱这门语言及其社区,并且从未错过过 Rio.pm 活动。她是一位真正的艺术家,热衷于编写代码、演唱咏叹调和涂鸦墙壁。我们永远不会忘记你。
Greg McCarroll 于 2013 年 8 月 28 日去世。
Greg 因许多正当理由而闻名。他是第一届 YAPC::Europe 的组织者之一,该活动以一场临时拍卖会结束,他疯狂地试图筹集额外资金以避免会议亏损。Greg 是错误地迟到一周参加 london.pm 会议的人;几年后,他在 YAPC::Europe 拍卖会上出售了官方会议日期的选择权,最终作为 london.pm 的光荣领导者,他继承了他自己制造的 irreverent 混乱。
你总是乐于助人、友善且乐观开朗,我们会想念你,但永远不会忘记你。
Perl 5.20.0 代表了自 Perl 5.18.0 以来大约 12 个月的开发时间,包含来自 124 位作者的 2,900 个文件中大约 470,000 行的更改。
不包括自动生成的文件、文档和发行工具,大约有 280,000 行更改到 1,800 个 .pm、.t、.c 和 .h 文件。
得益于活跃的用户和开发人员社区,Perl 在其第三个十年继续蓬勃发展。以下人员已知为 Perl 5.20.0 的改进做出了贡献
Aaron Crane、Abhijit Menon-Sen、Abigail、Abir Viqar、Alan Haggai Alavi、Alan Hourihane、Alexander Voronov、Alexandr Ciornii、Andy Dougherty、Anno Siegel、Aristotle Pagaltzis、Arthur Axel 'fREW' Schmidt、Brad Gilbert、Brendan Byrd、Brian Childs、Brian Fraser、Brian Gottreu、Chris 'BinGOs' Williams、Christian Millour、Colin Kuskie、Craig A. Berry、Dabrien 'Dabe' Murphy、Dagfinn Ilmari Mannsåker、Daniel Dragan、Darin McBride、David Golden、David Leadbeater、David Mitchell、David Nicol、David Steinbrunner、Dennis Kaarsemaker、Dominic Hargreaves、Ed Avis、Eric Brine、Evan Zacks、Father Chrysostomos、Florian Ragwitz、François Perrad、Gavin Shelley、Gideon Israel Dsouza、Gisle Aas、Graham Knop、H.Merijn Brand、Hauke D、Heiko Eissfeldt、Hiroo Hayashi、Hojung Youn、James E Keenan、Jarkko Hietaniemi、Jerry D. Hedden、Jess Robinson、Jesse Luehrs、Johan Vromans、John Gardiner Myers、John Goodyear、John P. Linderman、John Peacock、kafka、Kang-min Liu、Karen Etheridge、Karl Williamson、Keedi Kim、Kent Fredric、kevin dawson、Kevin Falcone、Kevin Ryde、Leon Timmermans、Lukas Mai、Marc Simpson、Marcel Grünauer、Marco Peereboom、Marcus Holland-Moritz、Mark Jason Dominus、Martin McGrath、Matthew Horsfall、Max Maischein、Mike Doherty、Moritz Lenz、Nathan Glenn、Nathan Trapuzzano、Neil Bowers、Neil Williams、Nicholas Clark、Niels Thykier、Niko Tyni、Olivier Mengué、Owain G. Ainsworth、Paul Green、Paul Johnson、Peter John Acklam、Peter Martini、Peter Rabbitson、Petr Písař、Philip Boulain、Philip Guenther、Piotr Roszatycki、Rafael Garcia-Suarez、Reini Urban、Reuben Thomas、Ricardo Signes、Ruslan Zakirov、Sergey Alekseev、Shirakata Kentaro、Shlomi Fish、Slaven Rezic、Smylers、Steffen Müller、Steve Hay、Sullivan Beck、Thomas Sibley、Tobias Leich、Toby Inkster、Tokuhiro Matsuno、Tom Christiansen、Tom Hukins、Tony Cook、Victor Efimov、Viktor Turskyi、Vladimir Timofeev、YAMASHINA Hio、Yves Orton、Zefram、Zsbán Ambrus、Ævar Arnfjörð Bjarmason。
以上列表几乎肯定不完整,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的(非常感谢的)贡献者的姓名。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
如需查看所有 Perl 历史贡献者的更完整列表,请参阅 Perl 源代码发行版中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可以查看最近发布到 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 文件,了解版权信息。