perl5320delta - perl v5.32.0 的新增功能
本文档描述了 5.30.0 版本和 5.32.0 版本之间的差异。
如果您要从 5.28.0 等早期版本升级,请先阅读 perl5300delta,其中描述了 5.28.0 和 5.30.0 之间的差异。
一个名为 isa
的新的实验性中缀运算符测试给定对象是否是给定类的实例,或者是否是该类的派生类的实例。
if( $obj isa Package::Name ) { ... }
有关更多详细信息,请参阅 "perlop 中的类实例运算符"。
有关详细信息,请参阅 https://www.unicode.org/versions/Unicode13.0.0/。
一些比较运算符,以及它们的结合性,会与一些具有相同优先级的运算符链式(但绝不会与不同优先级的运算符链式)。
if ( $x < $y <= $z ) {...}
行为与
if ( $x < $y && $y <= $z ) {...}
完全相同(假设"$y"
是一个看起来很简单标量)。
您可以在perlop的"运算符优先级和结合性"中了解更多信息。
Identifier_Status
和 Identifier_Type
Unicode 已修改其正则表达式要求:https://www.unicode.org/reports/tr18/tr18-21.html。作为其中的一部分,他们希望公开更多属性,这些属性不是严格 UCD(Unicode 字符数据库)的一部分。这两个属性用于检查输入以确保安全性。有关其用法的详细信息,请访问 https://www.unicode.org/reports/tr39/。
qr/\p{Name=...}/
或 qr!\p{na=/(SMILING|GRINNING) FACE/}!
Unicode 名称属性现在可以在正则表达式模式中使用,作为 \N{...}
的替代方案。两种方法的比较见"perlunicode 中的 \N{...} 和 \p{name=...} 的比较"。
上面的第二个示例表明,通配符子模式也可以在此属性中使用。请参阅"perlunicode 中的属性值中的通配符"。
POSIX::mblen()
、mbtowc
和 wctomb
POSIX::mblen()
、mbtowc
和 wctomb
函数现在可以在移位状态区域设置中工作,并且在 C99 及更高版本的编译器上执行时,在具有区域设置线程安全的平台上是线程安全的;长度参数现在是可选的。
这些函数始终在当前 C 语言区域设置下执行。(请参阅perllocale。)大多数区域设置是无状态的,但少数区域设置(特别是很少遇到的 ISO 2022)在对这些函数的调用之间保持状态。以前,状态在每次调用时都会被清除,但现在状态不会被重置,除非相应的参数为 undef
。
在多线程 Perl 中,C99 函数 mbrlen(3)、mbrtowc(3) 和 wcrtomb(3)(如果可用)将替换普通函数。这使得这些函数在执行于区域设置线程安全的平台上时是线程安全的。
mblen
和 mbtowc
中的字符串长度参数现在是可选的;仅当您希望将解析的源字符串长度限制为小于实际长度时才有用。
参见 "(*pla:pattern)" in perlre,"(*plb:pattern)" in perlre,"(*nla:pattern)" in perlre 和 "(*nlb:pattern)" in perlre。使用这些功能不再会产生警告;现有的代码禁用 experimental::alpha_assertions
警告类别将继续工作,无需任何更改。启用该类别没有效果。
参见 "Script Runs" in perlre。使用这些功能不再会产生警告;现有的代码禁用 experimental::script_run
警告类别将继续工作,无需任何更改。启用该类别没有效果。
以前,解析器中的功能检查在功能设置在功能包之外时需要进行哈希查找,现在已优化为位掩码检查。[GH #17229]
Perl 现在在 GitHub 上开发。您可以在 https://github.com/Perl/perl5 找到我们。
非安全漏洞现在应该通过 GitHub 报告。安全问题应继续按照 perlsec 中的文档进行报告。
这主要用于跟踪正则表达式编译器中的错误。此转储发生在 -DDEBUGGING
perls 上,如果您在命令行中指定 -Drv
;或者在任何 perl 上,如果模式是在 use re qw(Debug DUMP_PRE_OPTIMIZE)
或 use re qw(Debug COMPILE EXTRA)
的作用域内编译的。(除了第二种情况外,其他情况也会显示其他信息。)
Perl 正则表达式编译器中嵌套正则表达式量词的存储空间计算中的带符号 size_t
整数溢出会导致堆缓冲区溢出,从而用攻击者提供的数据覆盖正则表达式存储空间之后分配的内存。
目标系统需要足够的内存来分配嵌套量词的部分扩展,然后才能发生溢出。在 64 位系统上不太可能满足此要求。
发现者:The Tarantula Team 的 ManhND,VinCSS(Vingroup 成员)。
在计算正则表达式引擎指令之间偏移量的过程中,整数溢出可能会导致编译后的正则表达式的中间语言状态损坏。攻击者可以利用此行为将指令插入到 Perl 正则表达式的编译形式中。
发现者:Hugo van der Sanden 和 Slaven Rezic。
Perl 正则表达式编译器对 S_study_chunk()
的递归调用,用于优化正则表达式的中间语言表示,可能会导致编译后的正则表达式的中间语言状态损坏。
发现者:Sergey Aleynikov。
如果 Perl 编写的应用程序评估攻击者提供的正则表达式,则该应用程序可能会受到上述任何缺陷的影响。以这种方式评估正则表达式是危险的,因为正则表达式引擎在这种使用场景中不提供针对拒绝服务攻击的保护。
这些功能要么不合适,要么会干扰用于完成此任务的算法。完整的列表在 "perlunicode 中的属性值通配符" 中。
POSIX::mbstowcs
和 POSIX::wcstombs
由于接口规范有缺陷,这些函数永远无法正常工作。很明显,没有人对它们有需求,因为在这些函数声称可用多年的时间里,没有人抱怨过,因此现在放弃了对它们的所谓“支持”。
(?[...])
的一个 bug 可能会导致某些模式无法编译参见 "已选 Bug 修复"。之前使用的启发式方法可能允许某些结构编译(可能不是程序员预期的效果),而这些结构应该被视为错误。目前还没有发现任何已知的错误,但有可能某些错误的结构不再编译。
\p{user-defined}
属性现在始终覆盖官方 Unicode 属性以前,当且仅当在包含它的正则表达式模式编译之前声明了用户定义的属性时,才会使用它的定义,而不是使用任何具有相同名称的官方 Unicode 属性。现在,它始终覆盖官方属性。此更改可能会破坏依赖(可能无意中)于先前行为的现有代码。如果没有此修复,如果 Unicode 发布了一个包含与您长期使用的新属性具有相同名称的新版本,那么当您升级到使用该新 Unicode 版本的 perl 时,您的程序将崩溃。参见 "perlunicode 中的用户定义字符属性"。[GH #17205]
类似以下代码
my $var;
$sub = sub () { $var };
其中 $var
在其他地方以某种可修改的上下文引用,现在在定义子程序时会产生异常。
可以通过在子程序定义中添加一个 return 来避免此错误
$sub = sub () { return $var };
自 Perl 5.22 起已弃用。 [GH #17020]
vec
此类字符串在内部以 UTF-8 表示,而 vec
是一个面向位的操作,在这些字符串上可能会产生意外的结果。这在 perl 5.28.0 中已弃用。
在之前的弃用周期之后,这些操作中的某些操作已经是非法的。现在禁止使用剩余的操作,这些操作在 perl 5.28.0 中已弃用。参见 perldeprecation。
Sys::Hostname::hostname()
不接受参数此用法在 perl 5.28.0 中已弃用,现在是致命的。
以前,范围 "0" .. "-1"
会生成从 "0" 到 "99" 的数字字符串范围;现在它会生成一个空列表,就像 0 .. -1
一样。这也意味着 "0" .. "9"
现在会生成一个整数列表,而以前它会生成一个字符串列表。
这是由于一个特殊情况,它将以 "0" 开头的字符串视为字符串,因此像 "00" .. "03"
这样的范围会生成 "00", "01", "02", "03"
,但没有专门处理字符串 "0"
。 [GH #16770]
\K
现在在先行断言和后行断言中被禁止这是因为它会导致意外行为,并且没有人能够定义期望的行为应该是什么。 [GH #14638]
对于没有自己 strnlen
实现的系统,my_strnlen
的速度已经加快。
grok_bin_oct_hex
(以及 grok_bin
、grok_oct
和 grok_hex
)的速度已经加快。
grok_number_flags
的速度已经加快。
在诸如 sort {$a <=> $b}
或 sort {$b <=> $a}
之类的用例中,sort
现在明显更快。[GH #17608]
Archive::Tar 已从版本 2.32 升级到 2.36。
autodie 已从版本 2.29 升级到 2.32。
B 已从版本 1.76 升级到 1.80。
B::Deparse 已从版本 1.49 升级到 1.54。
Benchmark 已从版本 1.22 升级到 1.23。
charnames 已从版本 1.45 升级到 1.48。
Class::Struct 已从版本 0.65 升级到 0.66。
Compress::Raw::Bzip2 已从版本 2.084 升级到 2.093。
Compress::Raw::Zlib 已从版本 2.084 升级到 2.093。
CPAN 已从版本 2.22 升级到 2.27。
DB_File 已从版本 1.843 升级到 1.853。
Devel::PPPort 已从版本 3.52 升级到 3.57。
在 Win32 上生成的测试文件现在与在类 POSIX 系统上生成的测试文件相同。
diagnostics 已从版本 1.36 升级到 1.37。
Digest::MD5 已从版本 2.55 升级到 2.55_01。
Dumpvalue 已从版本 1.18 升级到 1.21。
以前,在转储数组元素并遇到未定义值时,打印的字符串将为 empty array
。这已更改为显然最初的意图:empty slot
。
DynaLoader 已从版本 1.45 升级到 1.47。
Encode 已从版本 3.01 升级到 3.06。
encoding 已从版本 2.22 升级到 3.00。
English 已从版本 1.10 升级到 1.11。
Exporter 已从版本 5.73 升级到 5.74。
ExtUtils::CBuilder 已从版本 0.280231 升级到 0.280234。
ExtUtils::MakeMaker 已从版本 7.34 升级到 7.44。
feature 已从版本 1.54 升级到 1.58。
添加了一个新的 indirect
特性,该特性默认启用,但允许关闭 间接对象语法。
File::Find 已从版本 1.36 升级到 1.37。
在 Win32 上,测试不再需要驱动器根目录中的文件或可写的根目录。
File::Glob 已从 1.32 版升级到 1.33 版。
File::stat 已从 1.08 版升级到 1.09 版。
Filter::Simple 已从 0.95 版升级到 0.96 版。
Getopt::Long 已从 2.5 版升级到 2.51 版。
Hash::Util 已从 0.22 版升级到 0.23 版。
概要已更新,因为示例代码在较新的 Perl 版本中停止工作。[GH #17399]
I18N::Langinfo 已从 0.18 版升级到 0.19 版。
I18N::LangTags 已从 0.43 版升级到 0.44 版。
记录 IGNORE_WIN32_LOCALE
环境变量。
IO 已从 1.40 版升级到 1.43 版。
IO::Socket 不再缓存零协议值,因为这表示实现将选择协议。这意味着在未为给定套接字类型实现 SO_PROTOCOL
的平台上,协议方法可能会返回 undef
。
现在,在对 send()
方法的调用中始终会遵守提供的 TO。[[GH #16891]]
IO-Compress 已从 2.084 版升级到 2.093 版。
IPC::Cmd 已从 1.02 版升级到 1.04 版。
IPC::Open3 已从 1.20 版升级到 1.21 版。
JSON::PP 已从 4.02 版升级到 4.04 版。
Math::BigInt 已从 1.999816 版升级到 1.999818 版。
Math::BigInt::FastCalc 已从 0.5008 版升级到 0.5009 版。
Module::CoreList 已从 5.20190522 版升级到 5.20200620 版。
Module::Load::Conditional 已从 0.68 版升级到 0.70 版。
Module::Metadata 已从 1.000036 版升级到 1.000037 版。
mro 已从 1.22 版升级到 1.23 版。
Net::Ping 已从 2.71 版升级到 2.72 版。
Opcode 已从 1.43 版升级到 1.47 版。
open 已从 1.11 版升级到 1.12 版。
overload 已从 1.30 版升级到 1.31 版。
parent 已从 0.237 版升级到 0.238 版。
perlfaq 已从 5.20190126 版升级到 5.20200523 版。
PerlIO 已从版本 1.10 升级到 1.11。
PerlIO::encoding 已从版本 0.27 升级到 0.28。
PerlIO::via 已从版本 0.17 升级到 0.18。
Pod::Html 已从版本 1.24 升级到 1.25。
Pod::Simple 已从版本 3.35 升级到 3.40。
podlators 已从版本 4.11 升级到 4.14。
POSIX 已从版本 1.88 升级到 1.94。
re 已从版本 0.37 升级到 0.40。
Safe 已从版本 2.40 升级到 2.41。
Scalar::Util 已从版本 1.50 升级到 1.55。
SelfLoader 已从版本 1.25 升级到 1.26。
Socket 已从版本 2.027 升级到 2.029。
Storable 已从版本 3.15 升级到 3.21。
在测试中使用来自 Test::More 的 note()
现在是可选的。这解决了在从 CPAN 安装非常旧的 Perl 时,与 Test::More 之间的循环依赖关系。
现在禁止超过 2GB 的 Vstring 魔术字符串。
在检索时,正则表达式对象没有被正确地计算对象 ID。这会导致结果结构损坏,或者在某些情况下导致运行时错误。 [GH #17037]
Sys::Hostname 已从版本 1.22 升级到 1.23。
Sys::Syslog 已从版本 0.35 升级到 0.36。
Term::ANSIColor 已从版本 4.06 升级到 5.01。
Test::Simple 已从版本 1.302162 升级到 1.302175。
Thread 已从版本 3.04 升级到 3.05。
Thread::Queue 已从版本 3.13 升级到 3.14。
threads 已从版本 2.22 升级到 2.25。
threads::shared 已从版本 1.60 升级到 1.61。
Tie::File 已从版本 1.02 升级到 1.06。
Tie::Hash::NamedCapture 已从版本 0.10 升级到 0.13。
Tie::Scalar 已从版本 1.04 升级到 1.05。
Tie::StdHandle 已从版本 4.5 升级到 4.6。
Time::HiRes 已从版本 1.9760 升级到 1.9764。
删除了过时的代码,例如对 5.6 之前的 Perl 和经典 MacOS 的支持。 [GH #17096]
Time::Piece 已从版本 1.33 升级到 1.3401。
Unicode::Normalize 已从版本 1.26 升级到 1.27。
Unicode::UCD 已从版本 0.72 升级到 0.75。
VMS::Stdio 已从版本 2.44 升级到 2.45。
warnings 已从版本 1.44 升级到 1.47。
Win32 已从版本 0.52 升级到 0.53。
Win32API::File 已从版本 0.1203 升级到 0.1203_01。
XS::APItest 已从版本 1.00 升级到 1.09。
Pod::Parser 已从核心发行版中删除。 它仍然可以从 CPAN 下载。 这解决了 [#13194]。
我们已尝试更新文档以反映本文档中列出的更改。 如果您发现我们遗漏了任何内容,请在 https://github.com/Perl/perl5/issues 上打开一个问题。
此外,还进行了以下选定更改
简化一些 regnode 定义
更新 BOUND
和 NBOUND
定义。
添加 ANYOFHs regnode
此节点类似于 ANYOFHb
,但在所有匹配的代码点中,多个前导字节相同的情况下使用。
ANYOFHb
用于避免将 UTF-8 转换为代码点,以用于不会匹配的内容。 它检查 UTF-8 编码目标中的第一个字节是否为所需的字节,从而排除了大多数可能的代码点。
sv_2pvbyte
已更新,以说明如果 SV 无法降级,它将 croak。
sv_setpvn
已更新,以说明此函数不会更改 UTF-8 标志,并且保证有终止的 NUL 字节。
已添加 PL_phase
的文档。
grok_bin
、grok_oct
和 grok_hex
的文档已更新并澄清。
添加了对实验性 'isa' 运算符的文档
(S experimental::isa) 如果使用 (isa
) 运算符,则会发出此警告。此运算符目前处于实验阶段,其行为可能会在未来的 Perl 版本中发生变化。
caller
与 __FILE__
和 __LINE__
一样,此处返回的文件名和行号可能会被 "Plain Old Comments (Not!)" in perlsyn 中描述的机制更改。
__FILE__
它可以被 "Plain Old Comments (Not!)" in perlsyn 中描述的机制更改。
__LINE__
它可以被 "Plain Old Comments (Not!)" in perlsyn 中描述的机制更改。
return
现在提到你不能从 do BLOCK
中返回。
open
open()
部分已进行了重大翻新。
不再建议使用 perl 的 malloc
。现在假设现代系统 malloc
比 perl 的实现要好得多。
关于 embed.fnc 标志的文档已被删除。embed.fnc 现在在其内部有足够的注释。任何更改该文件的人都会首先看到这些注释,因此此处的条目现在是多余的。
更新了 UTF8f
的文档
添加了缺少的 =for apidoc
行
现在详细介绍了 Perl 字符串和 C 字符串之间的区别。
重复运算符 x
的文档已澄清。[GH #17335]
围绕 open
和句柄使用的文档已现代化,以优先使用 3 参数 open 和词法变量而不是裸字。
各种更新和修复,包括使所有示例严格安全并用 use warnings
替换 -w
。
'isa' 运算符是实验性的
这是一个实验性功能,在通过 use feature 'isa'
启用时可用。它在 experimental::isa
类别中发出警告。
本文档解释了 Perl 解释器中各种堆栈的详细信息。
添加了关于使用 Z<>
的建议。
更新 timegm
示例,使用正确的年份格式 1970 而不是 70。[GH #16431]
修复了一些拼写错误。
现在建议将 $]
字符串化并进行数值比较。
为之前缺少文档的几个函数添加了文档。
建议使用 libffi
通过 CPAN 模块(如 FFI::Platypus 或 FFI::Raw)进行简单的库绑定。
关于线程构建的 setlocale
警告已更新,以说明它不适用于 Perl 5.28.X 及更高版本。
Posix::SigSet->new(...)
已更新,说明如果提供的任何信号无法添加到集合中,它将抛出错误。
此外,还进行了以下选定更改
指向现已失效的 https://search.cpan.org 网站的链接现在指向等效的 https://metacpan.org URL。[GH #17393]
ExtUtils::XSSymSet 的手册页现在仅在 VMS 上安装,因为该模块仅在该平台上安装。[GH #17424]
URL 已更改为 https://
,并且过时的链接已更新。
在适用情况下,文档中的 URL 已从使用 http://
协议更改为使用 https://
。这也影响了错误跟踪器在 https://rt.perl.org 上的位置。
一些指向 OS/2 库、Address Sanitizer 和其他系统工具的链接已失效。这些链接已更新为可用的链接。
一些指向 perl5-porters 上旧电子邮件地址的链接已失效。这些链接已更新为可用的链接。
诊断输出中添加或更改了以下内容,包括警告和致命错误消息。有关诊断消息的完整列表,请参见 perldiag。
在正则表达式中预期插值的扩展字符类;在 m/%s/ 中用 <-- HERE 标记
这是对 "现有诊断的更改" 下列出的几个错误消息的替换。
(F) 在 0x
后面未找到十六进制数字,或在 0b
后面未找到二进制数字。
这实际上不是一条新消息,但现在在启用 portable
警告类别时会输出。
当在正则表达式模式编译期间引发时,警告会在末尾添加额外的文本,以标记它在模式中发生的精确位置。
这替换了一个警告,该警告的具体程度要低得多,并且提供了错误的信息。这个新的警告与为 \o{}
引发的类似的现有警告相平行。
...现在在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以标记它在模式中发生的精确位置。
...现在在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以标记它在模式中发生的精确位置。
...现在在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以标记它在模式中发生的精确位置。
...现在在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以标记它在模式中发生的精确位置。
...现在包含短语 "提前终止 \o",并且在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以标记它在模式中发生的精确位置。在某些情况下,解析文本已得到澄清。
从 Perl 5.32 开始,不再生成此消息。相反,使用 "perldiag 中的 '非八进制字符 '%c' 提前终止 \o。解析为 "%s""。
此消息的一些实例以前以小写形式输出十六进制数字A
、B
、C
、D
、E
和F
。现在它们始终为大写。
以下三个诊断已删除,并被Expecting interpolated extended charclass in regex; marked by <-- HERE in m/%s/
替换:Expecting close paren for nested extended charclass in regex; marked by <-- HERE in m/%s/
,Expecting close paren for wrapper for nested extended charclass in regex; marked by <-- HERE in m/%s/
,以及Expecting '(?flags:(?[...' in regex; marked by <-- HERE in m/%s/
。
Code point 0x%X is not Unicode, and not portable
警告删除了Code points above 0xFFFF_FFFF require larger than a 32 bit word.
这一行,因为在32位平台上不再允许这么大的代码点。
此错误消息已从原始的Can't use global %s in "%s"
略微重新格式化,特别是像Can't use global $_ in "my"
这样的误导性错误消息现在将呈现为Can't use global $_ in subroutine signature
。
此错误消息替换了以前的Constants from lexical variables potentially modified elsewhere are deprecated. This will not be allowed in Perl 5.32
,以反映以前已弃用的用法现在已转换为异常的事实。消息的分类也已从 D(已弃用)更新为 F(致命) 。
另请参见"不兼容的更改"。
\N{} here is restricted to one character
现在在以前\N{} in inverted character class or as a range end-point is restricted to one character
出现的情况下发出。
这是由于 Perl 5.30 中添加了以前措辞未涵盖的新情况。
错误跟踪器主页 URL 现在指向 GitHub。
这是一个新实用程序,作为IO::Compress::Base升级的一部分包含在内。
streamzip 从 stdin 创建一个 zip 文件。该程序将从 stdin 读取数据,将其压缩到 zip 容器中,默认情况下,将一个流式 zip 文件写入 stdout。
对于 clang++,在 Configure 的 futimes
、strtoll
、strtoul
、strtoull
、strtouq
探测中添加 #include <stdlib.h>
,否则探测将无法编译。
使用编译和运行测试来检测 lchown
,以满足 clang++,这将更可靠地检测它。
对于 C++ 编译器,在 Configure 的 getpgrp
和 setpgrp
探测中添加 #include <stdio.h>
,因为它们使用 printf,而 C++ 编译器可能会导致编译失败而不是仅仅警告。
检查编译器是否可以处理内联属性。
检查字符数据对齐。
Configure 现在可以正确处理 gcc-10。之前它被解释为 gcc-1,并开启了 -fpcc-struct-return
。
Perl 现在不再探测 d_u32align
,默认在所有平台上定义。此检查在执行时容易出错,仅在 32 位平台上执行。 [GH #16680]
在 Z/OS(原生 EBCDIC)上构建 perl 的文档和提示已更新。这仍在进行中。
添加了 malloc_usable_size
的新探测。
Configure 在 C++ 和 clang++ 中的检测方面有所改进。Andy Dougherty 正在进行工作。 [GH #17033]
autodoc.pl
此工具重新生成 perlintern 和 perlapi,已进行了重大改进,恢复了 embed.fnc 和 Devel::PPPort 中使用的标志的一致性,并允许删除代码中许多冗余的 =for apidoc
条目。
现在定义了 ECHO
宏。它用于最初为 FreeBSD 修改的 dtrace
规则,而 FreeBSD make 显然预定义了它。Solaris make 没有预定义 ECHO
,这在 Solaris 上破坏了此规则。 [GH #17057]
现在支持 Bison 版本 3.1 到 3.4。
添加和更改了测试以反映此版本中的其他添加和更改。此外,还进行了以下重大更改
t/run/switches.t 不再使用(和重复使用)t/ 下的 tmpinplace/ 目录。这可能会防止出现虚假错误。 [GH #17424]
修复了 POSIX::mbtowc
中的各种错误。现在避免了与其他线程的潜在竞争,以前返回的宽字符很可能是垃圾。
修复了POSIX::wctomb
中的多个错误。现在避免了与其他线程的潜在竞争,并且以前如果字符串参数是共享的或没有预先分配一个足够长的字符串来容纳结果,它将导致段错误。
在 EBCDIC 上修复了包含控制字符和 Unicode 的标量某些测试输出。
t/charset_tools.pl:避免在 ASCII 平台上进行一些工作。
t/re/regexp.t:在 ASCII 平台上加速许多正则表达式测试。
t/re/pat.t:跳过在 EBCDIC 上无法正常工作的测试。
现在已删除在 Windows CE 上构建 perl 的支持。
如果cc
是clang
,则将使用cc
填充plibpth
。 [GH #17043]
修复了在 NetBSD 8.0 上使用 g++ 编译 Perl 的问题。[GH #17381]
ccflags
和optimize
的配置现在与 POSIX 平台一样是分开的。[GH #17156]
现在已删除使用 Visual C++ 6.0 构建 perl 的支持。
区域设置测试可能会在 Win32 上崩溃,原因是 Windows 错误,以及由于 CRT 在区域设置名称在当前代码页中未有效编码时抛出异常。
对于第二个问题,我们现在自己解码区域设置名称,并始终将其解码为 UTF-8。 [GH #16922]
t/op/magic.t 如果已经存在以FOO
开头的环境变量,则可能会失败。
MYMALLOC (PERL_MALLOC) 构建已修复。
Configure
现在将找到 Oracle Developer Studio 编译器的最新版本,这些版本位于/opt/developerstudio*
下。
Configure
现在使用检测到的gethostby*
函数类型,允许 Perl 再次在某些 Solaris 配置上编译。
随着补丁包 C99 V2.0 的发布,VSI 为许多以前缺少的 C99 功能提供了支持。在安装了该补丁包的系统上,Perl 的配置过程现在将检测到stdint.h
头文件和以下函数的存在:fpclassify
、isblank
、isless
、llrint
、llrintl
、llround
、llroundl
、nearbyint
、round
、scalbn
和scalbnl
。
-Duse64bitint
现在是 VMS 上的默认值。
Perl 5.32 已在 z/OS 2.4 上测试,并有以下注意事项
只有静态构建(默认)才能可靠地构建
当使用语言环境时,z/OS 无法正确处理 LC_MESSAGES
类别,因此在编译 perl 时,您应该在 Configure 选项中添加以下内容
./Configure <other options> -Accflags=-DNO_LOCALE_MESSAGES
z/OS 不支持带有线程的语言环境,因此在编译带线程的 perl 时,您应该在 Configure 选项中添加以下内容
./Configure <other Configure options> -Accflags=-DNO_LOCALE
一些与 perl 一起提供的 CPAN 模块至少会失败一项自检。这些是:Archive::Tar、Config::Perl::V、CPAN::Meta、CPAN::Meta::YAML、Digest::MD5、Digest::SHA、Encode、ExtUtils::MakeMaker、ExtUtils::Manifest、HTTP::Tiny、IO::Compress、IPC::Cmd、JSON::PP、libnet、MIME::Base64、Module::Metadata、PerlIO::via-QuotedPrint、Pod::Checker、podlators、Pod::Simple、Socket 和 Test::Harness。
失败的原因从自检本身存在缺陷,而模块实际上工作正常,到模块在 EBCDIC 平台上根本无法工作。
savepvn
的 len 参数现在是 Size_t
而不是 I32
,因为我们可以处理比 31 位更长的字符串。
词法分析器(toke.c 中的 Perl_yylex()
)以前是一个单一的 4100 行函数,严重依赖 goto
和大量范围广泛的局部变量来完成其工作。现在它已被拆分为几十个较小的静态函数;最大的剩余部分(yyl_word_or_keyword()
)略高于 900 行,并且包含一个单一的 switch
语句,其所有 case
组都是独立的。这应该更容易理解和维护。
perl 核心使用的 OS 级信号处理程序和类型 (Sighandler_t) 被声明为具有三个参数,但 OS 始终被告知使用一个参数调用它们。这已通过将它们声明为具有一个参数来修复。有关完整详细信息,请参阅合并提交 v5.31.5-346-g116e19abbf
。
处理 tr///
的代码已得到广泛修改,修复了各种错误,尤其是在源字符串和/或替换字符串包含代码点高于 255 的字符时。一些错误是未记录的,其中一个错误是,在某些情况下(但并非所有情况下)使用 /s
,压缩是基于源字符串而不是替换字符串进行的。已修复的一个记录的错误是 [GH #14777]。
为处理 UTF-8 编码的 Unicode 字符串的 XS 编写者创建了一个新的宏 "UTF8_CHK_SKIP
" 在 perlapi 中,它在遇到格式错误的 UTF-8 输入时比 "UTF8_SKIP
" 在 perlapi 中 更安全(但不如 "UTF8_SAFE_SKIP
" 在 perlapi 中 安全)。它不会读取超过 NUL 字符。它已在 Devel::PPPort 3.55 及更高版本中移植。
添加了PL_curstackinfo->si_cxsubix
字段。它记录了最近压入的子例程/格式/求值上下文的堆栈索引。它由cx_pushsub()
、cx_popsub()
等自动设置和恢复,但如果您对上下文堆栈进行任何不寻常的操作,则需要手动管理。
处理字符类型分类和更改大小写的各种宏,如果输入以 UTF-8 编码,现在需要一个额外的参数来防止潜在的越界读取。自 Perl 5.26 以来,使用这些宏会生成弃用警告。详细信息请参见"在 XS 代码中,使用处理 UTF-8 的各种宏。"在 perldeprecation 中
一个新的解析器函数parse_subsignature()允许关键字插件在use feature 'signatures'
生效时解析子例程签名。这允许自定义关键字实现类似于包含签名的常规sub
声明的语义。 [GH #16261]
由于在某些平台上,我们需要在临时切换区域设置时保持互斥锁,因此添加了新的宏(STORE_LC_NUMERIC_SET_TO_NEEDED_IN
、WITH_LC_NUMERIC_SET_TO_NEEDED
和WITH_LC_NUMERIC_SET_TO_NEEDED_IN
),以便更轻松地安全高效地执行此操作,作为[GH #17034]的一部分。
分配 OP 结构的内存簿记开销在 64 位系统上每个 OP 减少了 8 字节。
eval_pv()不再对异常进行字符串化,当[GH #17035]|https://github.com/Perl/perl5/issues/17035
]
PERL_DESTRUCT_LEVEL 环境变量以前只在使用 DEBUGGING 支持构建的 perl 二进制文件中生效。现在在所有 perl 构建中都会检查它。它的正常用途是在退出之前强制 perl 单独释放它分配的每个内存块,这在使用 valgrind 等自动泄漏检测工具时非常有用。
API eval_sv() 现在接受G_RETHROW
标志。如果设置了此标志,并且在编译或执行提供的代码时抛出异常,它将被重新抛出,并且 eval_sv() 不会返回。 [GH #17036]
作为修复 [GH #1537] 的一部分,perl_parse() 现在在 BEGIN
、UNITCHECK
或 CHECK
块中调用 exit(0) 时返回非零值。
大多数在编译期间递归遍历操作树的函数已改为非递归。这避免了在操作树深度嵌套时(例如 $n == 1 ? "one" : $n == 2 ? "two" : ....
,尤其是在自动生成的代码中)由于堆栈溢出而导致的段错误。
这在代码在单独的线程中编译时尤其明显,因为线程默认情况下往往具有较小的堆栈。
以前,"perlfunc 中的 require" 仅将特殊的内置 SV &PL_sv_undef
视为 %INC
中的值,就好像之前的 require
失败一样,将其他未定义的 SV 视为之前的 require
成功一样。这会导致 require
出现意外的成功,例如在 local %INC = %INC;
上。这个问题已修复。[GH #17428]
正则表达式中的 (?{...})
eval 组不再无意中触发“正则表达式中 EVAL ללא pos change 超过限制”[GH #17490]
(?[...])
扩展的方括号字符类在某些情况下不会错误地引发错误,在这些情况下,先前编译的此类类被插值到另一个类中。以前使用的启发式方法已被可靠的方法取代,因此生成的诊断信息已更改。请参阅 "诊断信息"。
编译的 Unicode 属性通配符子模式的调试显示(例如通过指定 -Dr
或 use re
(以及相应的选项))不再有额外的输出。
修复正则表达式引擎中的断言失败。[GH #17372]
修复 B::UNOP_AUX::aux_list()
之后 pp_hot.c 中的 core dump。[GH #17301]
加载 IO 现在是线程安全的。[GH #14816]
\p{user-defined}
覆盖官方 Unicode [GH #17025]
在此补丁之前,覆盖有时才生效。
正确处理填充的 /il
regnodes 和多字符折叠
在 make minitest 期间出现编译错误 [GH #17293]
将 %-
和 %+
的实现移至核心。
在 grok_inf_nan
中读取超出缓冲区 [GH #17370]
解决 LC_MESSAGES
与 glibc 冲突的问题 [GH #17081]
使用 %n
格式的 printf()
或 sprintf()
在调试版本中可能导致崩溃,或者在生成 SVfUTF8
标志字符串时报告错误的缓存长度值。 [GH #17221]
现在对优化为 multiconcat
运算符的裸字常量强制执行 use strict "subs"
。 [GH #17254]
修复了正则表达式模式中的内存泄漏。 [GH #17218]
Perl 在将字符串转换为数字时不再将以 "0x" 或 "0b" 开头的字符串分别视为十六进制或二进制数字。这恢复了 perl 5.30.0 中意外引入的行为更改,该更改旨在提高将字符串转换为浮点数时的精度。 [GH #17062]
将非 SVf_UTF8
字符串与包含 Unicode 字面量的正则表达式匹配可能会在每次匹配尝试时泄漏 SV。 [GH #17140]
八进制和二进制浮点数字面量的重载始终传递一个带有 0x
前缀的字符串,而不是适当的 0
或 [GH #14791]|https://github.com/Perl/perl5/issues/14791
]
$@ = 100; die;
现在正确地将 100 传播为异常,而不是忽略它。 [GH #17098]
[GH #17108]|https://github.com/Perl/perl5/issues/17108
]
在 $@
为只读时抛出的异常会导致无限递归,因为 perl 尝试更新 $@
,这会抛出另一个异常,导致堆栈溢出。Perl 现在如果 $@
不是一个简单的可写 SV,则用一个副本替换它。 [GH #17083]
设置 $)
现在如果拥有必要的权限,会正确地设置辅助组 ID。 [GH #17031]
对管道进行 close()
操作现在会抢先从 IO SV 中清除 PerlIO 对象。这可以防止在 close()
等待子进程完成时,如果信号处理程序调用 die()
或 exit()
,则第二次尝试关闭已关闭的 PerlIO 对象。 [GH #13929]
sprintf("%.*a", -10000, $x)
会由于错误处理负精度值而导致缓冲区溢出。 [GH #16942]
对引用进行 scalar()
操作可能会在编译期间导致错误的断言失败。 [GH #16969]
%{^CAPTURE_ALL}
现在是 %-
的别名,如文档所述,而不是错误地作为 [GH #16105]|https://github.com/Perl/perl5/issues/16105
的别名。
如果先提到 @{^CAPTURE}
,则 %{^CAPTURE}
无法正常工作。类似地,%{^CAPTURE_ALL}
和 @{^CAPTURE_ALL}
也是如此,尽管 [GH #17045]|https://github.com/Perl/perl5/issues/17045
。
极大的(超过 2GB)浮点格式宽度会导致对 snprintf() 的底层调用出现整数溢出,从而导致断言错误。现在,格式化的浮点宽度限制在 int 的范围内,即 snprintf() 的返回值。[#16881]
在子解析(例如使用 "${code here}"
或 s/.../code here/e
)中解析以下结构的方式已更改,以匹配它们通常的解析方式。
print $fh ...
不再产生语法错误。
类似 s/.../ ${time} /e
的代码现在在启用警告时会正确地产生“对 ${time} 的模糊使用解析为 $time at …”警告。
在子解析中,@x {"a"}
(带空格)现在在启用警告时会正确地产生“最好写成”警告。
现在可以在子解析中使用属性。 [GH #16847]
现在,不完整的十六进制和二进制字面量(如 0x
和 0b
)被视为 x
或 b
是下一个标记的一部分。[#17010]
子解析中的一个多余的 )
,例如在 s/.../code here/e
或 "...${code here}"
中,不再会混淆解析器。
以前,子解析用生成的 (
和 )
标记括起来,因此一个多余的 )
会关闭结构而不会进行正常的子解析清理,从而混淆解析器并可能导致断言失败。
现在,此类结构被人工标记包围,这些标记不能包含在源代码中。 [GH #15814]
子例程的引用赋值,例如 \&foo = \&bar;
,在 [GH #16987]|https://github.com/Perl/perl5/issues/16987
中默默地什么也没做。
如果目标 SV 被信号处理程序修改,sv_gets() 现在可以更好地恢复。 [GH #16960]
readline @foo
现在在标量上下文中评估 @foo
。以前它会在列表上下文中进行评估,并且由于 readline() 只从堆栈中弹出单个参数,因此堆栈可能会下溢,或者在堆栈上留下意外的值。 [GH #16929]
在 5.31.1 中,解析不完整的十六进制或二进制字面量被更改为将此类字面量视为仅为 0,并将后面的 x
或 b
解析为下一个标记的一部分。这可能会导致一些行为上的静默更改,因此现在不完整的十六进制或二进制字面量会产生致命错误。 [GH #17010]
eval_pv() 的 croak_on_error 标志现在即使异常是错误的重载值也会抛出。 [GH #17036]
如果在 BEGIN
、UNITCHECK
或 CHECK
块中调用 exit(0),则不再运行 INIT
块和程序本身。 [GH #1537]
open my $fh, ">>+", undef
现在以追加模式打开临时文件:写入操作将在写入之前寻求文件末尾。 [GH #17058]
修复了在搜索未初始化值警告的源代码时,当操作的子树包含 OP_MULTIDEREF 时发生的 SEGV。 [GH #17088]
Jeff Goff(JGOFF 或 DrForr),Perl 和 Raku 社区的核心成员,也是我们所有人的亲密朋友,于 2020 年 3 月 13 日去世。DrForr 是这些社区的杰出成员,参加并发表了无数的活动,为众多项目做出了贡献,并尽其所能提供帮助。
他的离去让我们心碎,也给我们的社区留下了空缺,我们将深深怀念他。
Perl 5.32.0 代表了自 Perl 5.30.0 发布以来的大约 13 个月的开发,包含了来自 89 位作者的 1,800 个文件中的大约 220,000 行代码变更。
不包括自动生成的代码、文档和发布工具,对 880 个 .pm、.t、.c 和 .h 文件进行了大约 140,000 行代码变更。
得益于充满活力的用户和开发人员社区,Perl 在其第四个十年中继续蓬勃发展。以下人员已知为 Perl 5.32.0 的改进做出了贡献。
Aaron Crane、Alberto Simões、Alexandr Savca、Andreas König、Andrew Fresh、Andy Dougherty、Ask Bjørn Hansen、Atsushi Sugawara、Bernhard M. Wiedemann、brian d foy、Bryan Stenson、Chad Granum、Chase Whitener、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Book、Daniel Dragan、Dan Kogai、Dave Cross、Dave Rolsky、David Cantrell、David Mitchell、Dominic Hargreaves、E. Choroba、Felipe Gasper、Florian Weimer、Graham Knop、Håkon Hægland、Hauke D、H.Merijn Brand、Hugo van der Sanden、Ichinose Shogo、James E Keenan、Jason McIntosh、Jerome Duval、Johan Vromans、John Lightsey、John Paul Adrian Glaubitz、Kang-min Liu、Karen Etheridge、Karl Williamson、Leon Timmermans、Manuel Mausz、Marc Green、Matthew Horsfall、Matt Turner、Max Maischein、Michael Haardt、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Paul Evans、Paul Johnson、Paul Marquess、Peter Eisentraut、Peter John Acklam、Peter Oliver、Petr Písař、Renee Baecker、Ricardo Signes、Richard Leach、Russ Allbery、Samuel Smith、Santtu Ojanperä、Sawyer X、Sergey Aleynikov、Sergiy Borodych、Shirakata Kentaro、Shlomi Fish、Sisyphus、Slaven Rezic、Smylers、Stefan Seifert、Steve Hay、Steve Peters、Svyatoslav、Thibault Duponchelle、Todd Rinaldo、Tomasz Konojacki、Tom Hukins、Tony Cook、Unicode Consortium、VanL、Vickenty Fesunov、Vitali Peil、Yves Orton、Zefram。
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的贡献者(非常感谢)的姓名。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可能需要查看 Perl 错误数据库,地址为 https://github.com/Perl/perl5/issues。您也可以在 https://www.perl5.cn/(Perl 主页)上找到相关信息。
如果您认为您发现了一个未报告的错误,请在 https://github.com/Perl/perl5/issues 上创建一个问题。请确保将您的错误缩减为一个简短但充分的测试用例。
如果您要报告的错误涉及安全隐患,不适合发送到公共问题跟踪器,请参阅 "perlsec 中的 SECURITY VULNERABILITY CONTACT INFORMATION",了解如何报告此问题。
如果您想感谢 Perl 5 维护者在 Perl 5 中所做的工作,您可以运行 perlthanks
程序。
perlthanks
这将向 Perl 5 维护者列表发送一封电子邮件,表达您的感谢。
Changes 文件,了解如何查看有关更改的详尽信息。
INSTALL 文件,了解如何构建 Perl。
README 文件,了解一般信息。
Artistic 和 Copying 文件,了解版权信息。