perl5300delta - perl v5.30.0 的新增内容
本文档描述了 5.28.0 版本和 5.30.0 版本之间的差异。
如果您从 5.26.0 等早期版本升级,请先阅读 perl5280delta,其中描述了 5.26.0 和 5.28.0 之间的差异。
sv_utf8_(downgrade|decode) 不再标记为实验性。 [GH #16822].
使用后视断言(如 (?<=foo?)
或 (?<!ba{1,9}r)
以前会生成错误并拒绝编译。现在它可以编译(如果最大后视最多为 255 个字符),但在新的 experimental::vlb
警告类别中发出警告。这是为了提醒您,精确的行为可能会根据现场使用的反馈而改变。
请参阅 "(?<=pattern)" in perlre 和 "(?<!pattern)" in perlre.
"{m,n}"
的正则表达式量词中,可指定的上限 "n"
已加倍至 65534无界上限量词 "{m,}"
的含义保持不变。它在大多数平台上匹配 2**31 - 1 次,在 C 语言短变量长度超过 4 字节的平台上匹配更多次。
由于 Unicode 版本发布周期的变化,Perl 从 Perl 5.28 中的 Unicode 10.0 跳到了 Perl 5.30 中的 Unicode 12.1。
有关 Unicode 更改的详细信息,请参阅 https://www.unicode.org/versions/Unicode11.0.0/(11.0);https://www.unicode.org/versions/Unicode12.0.0/(12.0);以及 https://www.unicode.org/versions/Unicode12.1.0/(12.1)。(Unicode 12.1 与 12.0 的唯一区别在于添加了一个字符,用于新的日本年号。)
与之前的 Perl 版本一样,Word_Break 属性仍然经过调整,以更符合 Perl 用户的预期。这意味着连续的水平空白字符不会被拆分,而是作为一个整体保留。Unicode 11 从之前的版本更改为更符合 Perl,但它仍然将几个空白字符视为导致断裂:TAB、NO BREAK SPACE 和 FIGURE SPACE(U+2007)。我们决定继续使用之前的 Perl 调整来处理这些字符。
您现在可以在正则表达式模式中执行以下操作
qr! \p{nv= /(?x) \A [0-5] \z / }!
它匹配所有 Unicode 代码点,其数值在 0 到 5(含)之间。因此,它可以匹配泰语或孟加拉语数字,其数值为 0、1、2、3、4 或 5。
这标志着在实现 Unicode 联盟建议的正则表达式功能方面又迈出了一步。
大多数属性都支持,其余的计划在 5.32 中实现。详细信息请参阅 "perlunicode 中的属性值中的通配符"。
以前,在单引号正则表达式模式(其评估被延迟到正常位置)中评估命名字符 \N{...}
会导致错误。现在已取消此限制。
土耳其语的字母 "i"
和 "I"
的大小写规则与其他语言不同。"i"
的大写是带点拉丁大写字母 I (U+0130);而 "I"
的小写是无点拉丁小写字母 I (U+0131)。Unicode 为土耳其语提供了备选的大小写规则。以前,Perl 会忽略这些规则,但现在,当它检测到正在土耳其语 UTF-8 环境下运行时,它会使用这些规则。
以前,只有在编译 Perl 为多线程时才会使用这些调用。要始终启用它们,请将
-Accflags='-DUSE_THREAD_SAFE_LOCALE'
添加到您的 Configure 标志中。
此宏仍然定义,但不再在核心代码中使用。
-Drv
在 -DDEBUGGING
构建中现在有意义现在,将详细标志 (-Dv
) 添加到 -Dr
标志会打开所有可能的正则表达式调试。
$[
是致命的将 $[
设置为非零值已从 Perl 5.12 开始被弃用,现在会引发致命错误。请参阅 "在 perldeprecation 中将非零值赋予 $[
是致命的"。
请参阅 "在 perldeprecation 中使用未分配的代码点或非独立字素作为分隔符"
"{"
的用法现在是非法的但为了避免不必要地破坏代码,大多数发出弃用警告的实例仍然合法,并且现在会引发非弃用警告。请参阅 "在 perldeprecation 中正则表达式中的未转义左大括号"。
在 :utf8
处理程序上调用 sysread()、syswrite()、send() 或 recv(),无论显式还是隐式应用,现在都是致命的。这在 perl 5.24 中已弃用。
在 :utf8
处理程序上调用这些函数存在两个问题
所有四个函数只关注 :utf8
标志。其他层级完全被忽略,因此具有 :encoding(UTF-16LE)
层级的处理程序将被视为 UTF-8。其他层级,例如压缩,无论是否使用 :utf8
标志,都会被完全忽略。
sysread() 和 recv() 将从处理程序中读取数据,跳过层级进行的任何验证,并且不会进行自己的验证。这可能导致 perl 标量编码无效。
不再允许诸如 my $x if 0
之类的声明。
这些长期弃用的特殊变量现在在使用时会抛出异常。
dump()
函数长期以来一直不鼓励使用,现在除非完全限定,否则不能使用,即 CORE::dump()
。
File::Glob::glob()
函数长期以来一直被弃用,现已删除,现在会抛出异常,建议使用 File::Glob::bsd_glob()
代替。
pack()
不再能返回格式错误的 UTF-8如果它会返回包含格式错误的 UTF-8 的 UTF-8 字符串,则会发出警告。这可以防止潜在的安全威胁。这也算是一个错误修复。 [GH #16035].
Common 脚本中包含多组数字。[0-9]
是最常见的。但还有 [\x{FF10}-\x{FF19}]
(全角数字零 - 全角数字九),以及几组用于数学符号的数字,例如数学双线数字。这些集合中的任何一个都应该能够出现在希腊语的脚本运行中。但是 5.30 的设计忽略了除 ASCII 数字 [0-9]
之外的所有数字,因此设计存在缺陷。这个问题已经修复,因此既是错误修复,也是不兼容性。 [GH #16704].
运行中的所有数字都必须来自同一组十个数字。
由于 JSON::XS 4.0 改变了其策略,默认情况下启用了 allow_nonref,因此 JSON::PP 也默认启用了 allow_nonref。
此弃用功能计划在 5.30 版本中变为致命错误,但由于一些 CPAN 模块出现问题,已推迟到 5.32 版本。有关受影响内容的详细信息,请参阅 perldeprecation。
现在,从 UTF-8 转换为它所代表的代码点是通过确定性有限自动机完成的,从而加快了速度。例如,ord("\x7fff")
现在比以前需要少 12% 的指令。使用 DFA 同样提高了检查字节序列是否为有效 UTF-8 的性能。
从 finalize_op() 中消除递归。 [GH #11866].
一些与正则表达式中的字符折叠和字符类相关的微小优化。
优化 IV
到 UV
的转换。 [GH #16761].
通过一次处理两位而不是一位数字,加快整数字符串化算法的速度。 [GH #16769].
基于 LGTM 分析和建议的改进。(https://lgtm.com/projects/g/Perl/perl5/alerts/?mode=tree)。 [GH #16765]. [GH #16773].
regcomp.c、regcomp.h、regexec.c 中的代码优化。
对类似 qr/[^a]/
的正则表达式模式匹配进行了显著加速,其中 a 是任何 ASCII 字符。其他类可以获得这种加速,但哪些类可以获得加速很复杂,并且取决于这些字符的底层位模式,因此在 ASCII 和 EBCDIC 平台之间有所不同,但所有大小写对,如 qr/[Gg]/
都包含在内,以及 [^01]
。
Archive::Tar 已从版本 2.30 升级到 2.32。
B 已从版本 1.74 升级到 1.76。
B::Concise 已从版本 1.003 升级到 1.004。
B::Deparse 已从版本 1.48 升级到 1.49。
bignum 已从版本 0.49 升级到 0.51。
bytes 已从版本 1.06 升级到 1.07。
Carp 已从版本 1.38 升级到 1.50。
Compress::Raw::Bzip2 已从版本 2.074 升级到 2.084。
Compress::Raw::Zlib 已从版本 2.076 升级到 2.084。
Config::Extensions 已从版本 0.02 升级到 0.03。
Config::Perl::V 已从版本 0.29 升级到 0.32。这是由于一个新的配置变量对二进制兼容性有影响:USE_THREAD_SAFE_LOCALE
。
CPAN 已从版本 2.20 升级到 2.22。
Data::Dumper 已从版本 2.170 升级到 2.174。
Data::Dumper 现在在 croak
时避免泄漏。
DB_File 已从版本 1.840 升级到 1.843。
deprecate 已从版本 0.03 升级到 0.04。
Devel::Peek 已从版本 1.27 升级到 1.28。
Devel::PPPort 已从版本 3.40 升级到 3.52。
Digest::SHA 已从版本 6.01 升级到 6.02。
Encode 已从版本 2.97 升级到 3.01。
Errno 已从版本 1.29 升级到 1.30。
experimental 已从版本 0.019 升级到 0.020。
ExtUtils::CBuilder 已从版本 0.280230 升级到 0.280231。
ExtUtils::Manifest 已从版本 1.70 升级到 1.72。
ExtUtils::Miniperl 已从版本 1.08 升级到 1.09。
ExtUtils::ParseXS 已从版本 3.39 升级到 3.40。OUTLIST
参数不再被错误地包含在自动生成的函数原型中。 [GH #16746].
feature 已从版本 1.52 升级到 1.54。
File::Copy 已从版本 2.33 升级到 2.34。
File::Find 已从版本 1.34 升级到 1.36。
$File::Find::dont_use_nlink
现在在所有平台上默认设置为 1。 [GH #16759].
变量 $Is_Win32
和 $Is_VMS
正在初始化。
File::Glob 已从版本 1.31 升级到 1.32。
File::Path 已从版本 2.15 升级到 2.16。
File::Spec 已从版本 3.74 升级到 3.78。
如果未定义 targetsh
,则在 Android 构建中静默 Cwd 警告。
File::Temp 已从版本 0.2304 升级到 0.2309。
Filter::Util::Call 已从版本 1.58 升级到 1.59。
GDBM_File 已从版本 1.17 升级到 1.18。
HTTP::Tiny 已从版本 0.070 升级到 0.076。
I18N::Langinfo 已从版本 0.17 升级到 0.18。
IO 已从版本 1.39 升级到 1.40。
IO-Compress 已从版本 2.074 升级到 2.084。
添加了对 IO::Uncompress::Zstd
和 IO::Uncompress::UnLzip
的支持。
BinModeIn
和 BinModeOut
选项现在是无操作的。所有文件都将以 binmode 模式读取/写入。
IPC::Cmd 已从版本 1.00 升级到 1.02。
JSON::PP 已从版本 2.97001 升级到 4.02。
JSON::XS 4.0 中的 JSON::PP 默认情况下启用 allow_nonref
。
lib 已从版本 0.64 升级到 0.65。
Locale::Codes 已从版本 3.56 升级到 3.57。
Math::BigInt 已从版本 1.999811 升级到 1.999816。
bnok()
现在支持完整的 Kronenburg 扩展。 [cpan #95628].
Math::BigInt::FastCalc 已从版本 0.5006 升级到 0.5008。
Math::BigRat 已从版本 0.2613 升级到 0.2614。
Module::CoreList 已从版本 5.20180622 升级到 5.20190520。
对 B::Op_private 和 Config 的更改
Module::Load 已从版本 0.32 升级到 0.34。
Module::Metadata 已从版本 1.000033 升级到 1.000036。
在测试后正确清理临时目录。
NDBM_File 已从版本 1.14 升级到 1.15。
Net::Ping 已从版本 2.62 升级到 2.71。
ODBM_File 已从版本 1.15 升级到 1.16。
PathTools 已从版本 3.74 升级到 3.78。
parent 已从版本 0.236 升级到 0.237。
perl5db.pl 已从版本 1.54 升级到 1.55。
调试线程代码不再在 DB::sub
或 DB::lsub
中死锁。
perlfaq 已从版本 5.021011 升级到 5.20190126。
PerlIO::encoding 已从版本 0.26 升级到 0.27。
在 $PerlIO::encoding::fallback
中设置 WARN_ON_ERR
标志启用的警告现在仅在使用 use warnings "utf8";
或设置 $^W
启用警告时才会产生。
PerlIO::scalar 已从版本 0.29 升级到 0.30。
podlators 已从版本 4.10 升级到 4.11。
POSIX 已从版本 1.84 升级到 1.88。
re 已从版本 0.36 升级到 0.37。
SDBM_File 已从版本 1.14 升级到 1.15。
sigtrap 已从版本 1.08 升级到 1.09。
Storable 已从版本 3.08 升级到 3.15。
Storable 不再在构建时探测递归限制。 [GH #16780] 等。
Metasploit 利用代码被包含在内以测试 CVE-2015-1592 检测,这导致至少一个 AV 套件出现反病毒检测。 利用代码已被删除并替换为简单的功能测试。 [GH #16778]
Test::Simple 已从版本 1.302133 升级到 1.302162。
Thread::Queue 已从版本 3.12 升级到 3.13。
threads::shared 已从版本 1.58 升级到 1.60。
添加了对锁定额外跟踪的支持,这需要 -DDEBUGGING
和额外的编译标志。
Time::HiRes 已从版本 1.9759 升级到 1.9760。
Time::Local 已从版本 1.25 升级到 1.28。
Time::Piece 已从版本 1.3204 升级到 1.33。
Unicode::Collate 已从版本 1.25 升级到 1.27。
Unicode::UCD 已从版本 0.70 升级到 0.72。
User::grent 已从版本 1.02 升级到 1.03。
utf8 已从版本 1.21 升级到 1.22。
vars 已从版本 1.04 升级到 1.05。
vars.pm
不再在检查是否启用了严格变量时禁用非变量严格。 [GH #15851].
version 已从版本 0.9923 升级到 0.9924。
warnings 已从版本 1.42 升级到 1.44。
XS::APItest 已从版本 0.98 升级到 1.00。
XS::Typemap 已从版本 0.16 升级到 0.17。
以下模块将在未来版本中从核心发行版中移除,届时需要从 CPAN 安装。CPAN 上需要这些模块的发行版需要将它们列为先决条件。
这些模块的核心版本现在将发出“deprecated”类别的警告,以提醒您这一点。要消除这些弃用警告,请从 CPAN 安装有问题的模块。
请注意,这些模块(除了少数例外)都是很好的模块,我们鼓励您继续使用它们。它们从核心发行版中移除的主要原因是它们对启动一个功能齐全、支持 CPAN 的 Perl 安装的必要性,而不是对它们的设计的担忧。
B::Debug 不再与核心发行版一起分发。它仍然可以在 CPAN 上以 B::Debug
的形式获得。
Locale::Codes 已在作者的要求下移除。它仍然可以在 CPAN 上以 Locale::Codes
的形式获得 [GH #16660]。
我们已尝试更新文档以反映本文档中列出的更改。如果您发现我们遗漏了任何内容,请发送电子邮件至 [email protected]。
AvFILL()
被错误地列为已弃用。这已得到纠正。 [GH #16586]
我们不再有空行(空行)的 here doc 终止符,因此 perlop 不应提及它们。
当分隔符为撇号时,tr
的行为已得到澄清。特别是,连字符不是特殊的,并且不会插值 \x{}
。 [GH #15853]
改进了 lastparen、lastcloseparen 的文档。
perlfunc 中的“-X” 的条目已得到澄清,以表明大多数测试都遵循符号链接。
澄清了 reset EXPR
的行为。
尝试澄清ref(qr/xx/)
返回的是Regexp
而不是REGEXP
,以及原因。 [GH #16801].
澄清/(?(cond)yes)/的语法。
实际上,存在两种略微不同的 UTF-8 本地化:一种用于突厥语系,另一种用于其他所有语言。从 Perl v5.30 开始,Perl 无缝处理这两种类型。
为 ::xdigit:: 字符类添加了注释。
更详细地记录了段落模式。 [GH #16787].
对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
如上文 "不兼容的更改" 中所述,弃用警告“正则表达式中未转义的左大括号在此处已弃用(将在 Perl 5.30 中变为致命错误),在正则表达式中传递;由 <-- HERE 在 m/%s/ 中标记”已更改为非弃用警告“正则表达式中未转义的左大括号在正则表达式中传递;由 <-- HERE 在 m/%s/ 中标记”。
在不带任何内容的大括号之间指定 \o{}
现在会产生致命错误消息“Empty \o{}”。以前是“没有数字的数字”。这意味着此类错误使用与类似结构(如 \p{}
)相同的措辞。
在实验性功能 use re 'strict'
的范围内,在不带任何内容的大括号之间指定 \x{}
现在会产生致命错误消息“Empty \x{}”。以前是“没有数字的数字”。这意味着此类错误使用与类似结构(如 \p{}
)相同的措辞。在 re 'strict'
之外,即使不建议,但拥有一个空的 \x
也是合法的;它会静默地生成一个 NUL 字符。
现在,尝试对哈希或 glob 进行 push、pop 等操作会产生此消息,而不是抱怨它们不再适用于标量。 [GH #15774].
现在会报告此错误的文件和行号。 [GH #16697]
在 -Dr
(或 use re 'Debug'
)下,会显示编译后的正则表达式引擎程序。它以前使用两种不同的拼写来表示无穷大,INFINITY
和 INFTY
。现在它只使用后者,因为这种拼写存在的时间最长。
生成的原型(使用 PROTOTYPES: ENABLE
)将包含 OUTLIST
参数,但这些参数不是 perl 函数的参数。这个问题已经得到解决。 [GH #16746].
通常,线程安全区域设置函数仅在多线程构建中使用。现在,可以通过在 Configure 中包含 -Accflags='-DUSE_THREAD_SAFE_LOCALE'
选项,强制在具有这些函数的非多线程构建中使用它们。
改进 memrchr、strlcat 和 strlcpy 的检测
改进 Configure 对 memmem() 的检测。 [GH #16807].
对 -DPERL_GLOBAL_STRUCT 构建选项进行了多项改进和修复。
修复 -DPERL_GLOBAL_STRUCT_PRIVATE 构建选项。
t/lib/croak/op [GH #15774].
为哈希/glob 上的 push
等操作提供单独的错误。
t/op/svleak.t [GH #16749].
添加对 goto &sub
在重载泄漏中的测试。
将 t/re/fold_grind.t 拆分为多个测试文件。
修复由于并行测试期间出现的竞争条件而导致的间歇性测试失败。 [GH #16795].
使用新的测试文件 t/io/paragraph_mode.t 彻底测试段落模式。 [GH #16787].
t/io/eintr.t 中的一些测试会导致进程在 16 之前的 Darwin 版本上挂起。这些测试将跳过这些版本的 Darwin。
在使用 HP C-ANSI-C 编译时,pack()
中的一个模糊问题已通过在 pp_pack.c 中禁用优化来解决。
Perl 在 Mac OS X 上针对 -Duseshrplib
构建的构建和测试过程现在与 Mac OS X 系统完整性保护 (SIP) 兼容。
SIP 阻止 /bin(以及其他几个位置)中的二进制文件传递 DYLD_LIBRARY_PATH
环境变量。就我们而言,这会阻止将 DYLD_LIBRARY_PATH
传递给 shell,从而阻止该变量传递给测试或构建过程,因此运行 perl
无法找到 libperl.dylib。
为了解决这个问题,perl 可执行文件的初始构建预计会在构建目录中找到 libperl.dylib,然后在安装过程中调整库路径以指向已安装的库。
已重新添加对 Minix3 的一些支持。
Cygwin 不提供 cuserid
。
现在可以使用 C99 数学函数。
USE_CPLUSPLUS
构建选项长期以来一直存在于 win32/Makefile(用于 nmake)和 win32/makefile.mk(用于 dmake)中,现在也存在于 win32/GNUmakefile(用于 gmake)中。
nmake makefile 不再默认使用 Visual C++ 6.0(一个非常旧的版本,今天不太可能被广泛使用)。因此,现在需要指定 CCTYPE
,因为没有明显的现代版本选择作为默认值。未指定 CCTYPE
将导致输出错误,构建将停止。
(dmake 和 gmake makefile 将自动检测正在使用的编译器,因此不需要设置 CCTYPE
。此功能尚未添加到 nmake makefile 中。)
对于 USE_IMP_SYS
构建,启用警告的 sleep()
不再警告睡眠超时过长。 [GH #16631].
已添加对使用 Microsoft Visual Studio 2019(包含 Visual C++ 14.2)在 Windows 上编译 perl 的支持。
如果找不到协议、地址族和套接字类型组合,socket() 现在会设置 $!
。 [GH #16849].
Windows Server 2003 SP1 平台 SDK 构建(使用其早期 x64 编译器和工具)在 Perl 5.27.9 中意外损坏。现在已修复此问题。
已从正则表达式编译器中删除大小调整过程。在某些情况下,可能需要额外的过程来计算括号捕获组的数量。
现在可以使用一个新函数 "my_strtod
" in perlapi 或其同义词 Strtod(),其签名与 libc strtod() 相同。它在所有平台上提供与 strotod() 等效的行为,使用最佳可用精度,具体取决于平台功能和 Configure 选项,同时处理与区域设置相关的问题,例如基数字符应该是点还是逗号。
添加了 newSVsv_nomg()
函数,用于复制 SV 而不对源进行 get magic 处理。 [GH #16461].
现在禁止分配超过 PTRDIFF_T_MAX
字节的内存。许多代码(包括 C 优化器)假设所有数据结构都不会超过此大小,因此这会在溢出发生之前捕获此类尝试。
引入了两个新的 regnode:EXACT_ONLY8
和 EXACTFU_ONLY8
。它们等效于 EXACT
和 EXACTFU
,但它们包含一个需要 UTF-8 表示/匹配的代码点。因此,如果目标字符串不是 UTF-8,我们知道它不可能匹配,而无需尝试。
如果定义了 DEBUGGING
,则现在定义了 print_bytes_for_locale()
。之前,除非在平台上定义了 LC_COLLATE
,否则它不会被定义。
在 -DPERL_MEM_LOG
和 -DNO_LOCALE
下的编译已修复。
Perl 5.28 在与 -1(或间接地,例如 >= 0)比较时引入了 index()
优化。当此优化在 when
子句中触发时,会导致警告(“参数 %s 在智能匹配中不是数字”)。现在已修复。 [GH #16626]
新的就地编辑代码不再泄漏目录句柄。 [GH #16602].
对重载值进行常量折叠操作产生的警告不再产生虚假的“使用未初始化的值”警告。 [GH #16349].
修复了“在 (lex = ...) .= ... 中未看到 mutator”问题。 [GH #16655].
pack "u", "invalid uuencoding"
现在正确地用 NUL 终止生成的零长度 SV。 [GH #16343].
使用 -Dm
改善了 calloc() 调用的调试输出。 [GH #16653].
正则表达式脚本运行在某些情况下无法允许 ASCII 数字。 [GH #16704].
在支持特定于平台的技术来确定 $^X
的类 Unix 系统上,当特定于平台的技术失败时(例如,没有挂载 /proc 的 Linux 系统),Perl 无法回退到通用技术。这是 Perl 5.28.0 中的回归。 [GH #16715].
SDBM_File 现在对损坏的数据库文件更加健壮。这些改进不会使 SDBM 文件适合用作交换格式。 [GH #16164].
binmode($fh);
或 binmode($fh, ':raw');
现在在 Win32 上正确地从默认的 :crlf
I/O 层中删除 :utf8
标志。 [GH #16730].
实验性的引用别名功能错误地将数组和哈希切片赋值解释为本地化的,例如
\(@a[3,5,7]) = \(....);
被解释为
local \(@a[3,5,7]) = \(....);
在 EXPR
经过 UTF-8 升级后,eval EXPR
中的 sort SUBNAME
如果 SUBNAME
不是 ASCII 字符,可能会导致 panic。 [GH #16979].
正确处理 realloc() 在成功时修改 errno
的情况,以便该修改对 perl 用户不可见,因为 realloc() 是由解释器隐式调用的。这种修改是 C 标准允许的,但只在 FreeBSD 13.0-CURRENT 上观察到。 [GH #16907].
Perl 现在公开 POSIX getcwd
作为 Internals::getcwd()
(如果可用)。这旨在供 Cwd.pm
在引导过程中使用,可能会在不通知的情况下被移除或更改。这修复了在某些祖先目录不可读的目录中构建 perl 时的一些引导问题。 [GH #16903].
pack()
现在不再能返回格式错误的 UTF-8。如果它会返回包含格式错误的 UTF-8 的 UTF-8 字符串,它会抛出异常。这可以防止潜在的安全威胁。 [GH #16035].
正则表达式匹配不再在更新 $^R
时留下过时的 UTF-8 长度魔法。这会导致 length($^R)
返回错误的值。
减少操作的递归 [GH #11866].
这可以防止在处理极其深的操作树时发生堆栈溢出。
避免在多重连接中使用重载时发生泄漏。 [GH #16823].
对用户定义的 \p{}
属性(参见 "perlunicode 中的用户定义字符属性")的处理已重写为用 C(而不是 Perl)实现。这加快了速度,但在过程中也进行了一些不一致和错误修复。
一些错误消息的措辞略有变化。这主要是因为新方法被集成到正则表达式错误处理机制中,该机制标记了输入中发生错误的位置。以前这是不可能的。这些消息现在还包含额外的类似回溯的信息,以防错误发生在嵌套调用的深处。
用户定义的属性是用具有某些高度受限命名约定的 perl 子例程实现的。以前有文档说明,如果包未指定,则子例程将位于当前包中。事实证明,并非所有情况下都是如此,但现在是了。
所有递归调用都被视为无限递归。以前,它们会导致解释器 panic。现在,它们会导致正则表达式模式编译失败。
同样,任何其他错误都可能导致恐慌;现在只是模式无法编译。
旧机制没有检测到属性定义中的非法范围。现在,范围最大值不能小于范围最小值。否则,模式将无法编译。
目的是让每个子程序在程序的生命周期内只调用一次,这样属性的定义就是不可变的。这被放宽了,以便它可以为所有 /i 编译调用一次,并且可能为非 /i 调用第二次(子程序传递一个参数来指示哪个)。但是,在实践中,有时会发生这种情况,并且可能进行多次调用。这些问题已修复。现在(除了 /i、非 /i 的情况外),子程序可以多次调用的唯一方法是,如果它的某些组件尚未定义。例如,假设我们有子程序 IsA(),其定义在编译时已知,并且它反过来调用 isB(),而 isB() 的定义尚不清楚。每次编译包含 isA() 的模式时,都会调用 isA()。如果 isA() 还调用 isC() 并且该定义已知,则 isC() 只会被调用一次。
如果一个线程同时编译与另一个线程相同的属性,则会发生一些竞争条件和非常长的挂起。这些问题现在已修复。
修复了无法正确匹配的问题。
EXACTFish regnode 具有有限的长度,它可以用于保存要匹配的字符串。如果超过该长度,则将使用第二个节点用于字符串的下一段,并使用尽可能多的 regnode。在断开字符串的位置需要小心,以便正确处理 Unicode 中的多字符折叠。如果我们想在可能位于多字符折叠中间的位置断开字符串,我们会后退一个(或多个)字符,留下一个较短的 EXACTFish regnode。这种后退机制包含一个越界错误。 [GH #16806].
没有先前文件句柄的裸 eof
调用现在返回 true。 [GH #16786]
无法编译格式现在将中止编译。与子解析中的其他错误一样,这可能会使解析器处于奇怪的状态,如果编译继续,可能会导致 perl 崩溃。 [GH #16169]
如果在全局销毁期间仍在进行就地编辑,并且进程退出代码(存储在 $?
中)为零,perl 现在将就地编辑视为成功,并用生成的任何输出替换输入文件。
这允许像这样的代码
perl -i -ne 'print "Foo"; last'
替换输入文件,而像这样的代码
perl -i -ne 'print "Foo"; die'
不会。部分解决了 [GH #16748]。
5.28 版本中的一个回归导致以下代码失败
close(STDIN); open(CHILD, "|wc -l")'
因为子进程的标准输入会在执行时关闭。现在已修复。
修复了在编译包含编译时和运行时代码块的正则表达式时,可能会导致尝试编译无效语法的错误。
修复了使用 -DNO_LOCALE_NUMERIC
和 -DNO_LOCALE_COLLATE
时的构建失败。 [GH #16771]。
防止 ext/B/t/strict.t 中的测试被跳过。 [GH #16783]。
以 s 结尾或开头的 /di
节点现在是 EXACTF
。我们不希望在优化过程中将两个 EXACTFU
连接在一起,形成 ss
、sS
、Ss
或 SS
序列;它们是唯一可能在 /ui
和 /di
下匹配不同的多字符序列。
Perl 5.30.0 代表了自 Perl 5.28.0 发布以来的大约 11 个月的开发,包含来自 58 位作者的 1,300 个文件中的大约 620,000 行代码变更。
不包括自动生成的代码、文档和发布工具,大约有 510,000 行代码变更,涉及 750 个 .pm、.t、.c 和 .h 文件。
得益于充满活力的用户和开发者社区,Perl 继续在它的第四个十年蓬勃发展。以下人员已知为 Perl 5.30.0 的改进做出了贡献
Aaron Crane, Abigail, Alberto Simões, Alexandr Savca, Andreas König, Andy Dougherty, Aristotle Pagaltzis, Brian Greenfield, Chad Granum, Chris 'BinGOs' Williams, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Book, Dan Dedrick, Daniel Dragan, Dan Kogai, David Cantrell, David Mitchell, Dominic Hargreaves, E. Choroba, Ed J, Eugen Konkov, François Perrad, Graham Knop, Hauke D, H.Merijn Brand, Hugo van der Sanden, Jakub Wilk, James Clarke, James E Keenan, Jerry D. Hedden, Jim Cromie, John SJ Anderson, Karen Etheridge, Karl Williamson, Leon Timmermans, Matthias Bethke, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Petr Písař, Phil Pearl (Lobbes), Richard Leach, Ryan Voots, Sawyer X, Shlomi Fish, Sisyphus, Slaven Rezic, Steve Hay, Sullivan Beck, Tina Müller, Tomasz Konojacki, Tom Wyant, Tony Cook, Unicode Consortium, Yves Orton, Zak B. Elep.
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括大多数(非常感谢)报告 Perl 错误跟踪器问题的贡献者的姓名。值得注意的是,在本版本中,Sergey Aleynikov 使用 AFL 进行模糊测试发现的错误,并提交了高质量的 perlbug 报告,使得大量错误修复成为可能。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误,您可以查看 Perl 错误数据库,网址为 https://rt.perl.org/。您也可以在 Perl 主页 https://www.perl5.cn/ 上找到相关信息。
如果您认为您遇到了一个未报告的错误,请运行您发布版本中包含的 perlbug 程序。请务必将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
如果您要报告的错误存在安全隐患,不适合发送到公开存档的邮件列表,请参阅 "perlsec 中的 SECURITY VULNERABILITY CONTACT INFORMATION",了解如何报告此问题。
如果您想感谢 Perl 5 移植团队为 Perl 5 所做的工作,您可以运行 perlthanks
程序。
perlthanks
这将向 Perl 5 移植团队列表发送一封电子邮件,表达您的感谢。
Changes 文件,了解如何查看有关更改的详尽信息。
INSTALL 文件,了解如何构建 Perl。
README 文件,了解一般信息。
Artistic 和 Copying 文件,了解版权信息。