Perl 5.40 发布
2024-07-01 22:42:08 阿炯

Perl语言于2024年6月中旬释出了 v5.40.0,其代表了自 v5.38.0 发布至今约 11 个月的开发成果,包含来自 75 位作者 1,500 个文件约 160,000 行变更。主要变化包括:新的__CLASS__ keyword、字段变量 a :reader: attribute、新的 "^^" logical-XOR 运算符、try/catch 移出实验类别,等等。更多可浏览官方变更页面。v5.40.0 更新摘要说明如下:

核心增强

新增 __CLASS__ 关键字: 在 class 特性中,方法、ADJUST 块和字段初始化表达式可以使用 __CLASS__ 关键字获取运行时类名,方便方法调度。 (参考 perlfunc 中的 __CLASS__)
字段变量的 :reader 属性: class 特性中,字段变量可以使用 :reader 属性自动生成读取器方法。 (参考 perlclass 中的 :reader)
-M 命令行选项允许空格: -M 开关和模块名之间允许有空格。
限制 use VERSION 声明: 将 5.11 以上版本的 use VERSION 声明降级到 5.11 以下版本现在是致命错误。连续使用 use VERSION 声明,且其中一个版本大于等于 5.39,也是致命错误。
新增 builtin::inf 和 builtin::nan 函数 (实验性): 提供浮点数无穷大和非数字值。
新增 ^^ 逻辑异或运算符: 补充了中等优先级逻辑运算符。
try/catch 特性不再是实验性的: 从 Perl 5.34.0 开始引入的 try/catch 错误处理机制现在被认为是稳定的。
for 迭代多个值不再是实验性的: 从 Perl 5.36.0 开始引入的 for 迭代多个值特性现在被认为是稳定的。
builtin 模块不再是实验性的: 从 Perl 5.36.0 开始引入的 builtin 模块现在被认为是稳定的,但其中一些函数仍然是实验性的。
:5.40 特性包添加了 try: 最新的版本特性包现在包含最近稳定的 try 特性。
use v5.40; 导入内置函数: 除了导入特性包之外,use v5.40; (或更高版本) 还导入相应的内置版本包。

安全性

CVE-2023-47038: 修复了通过非法用户定义的 Unicode 属性导致的缓冲区溢出漏洞。
CVE-2023-47039: 修复了 Windows 平台上的二进制劫持漏洞。

不兼容的变化

reset EXPR 现在会调用标量的 set-magic 方法: 这可能会导致以前没有效果的代码现在产生效果,甚至抛出异常。
调用未知包的 import 方法会产生警告: 这有助于在不区分大小写的文件系统上检测 use 语句中的大小写错误。
return 不再允许间接对象: 这消除了语法上的歧义和潜在的混乱。

弃用

使用 goto 从外部作用域跳转到内部作用域已被弃用,并将在 Perl 5.42 中完全移除。

性能提升

优化了否定运算符的性能。

模块和编译指示

新增模块: Term::Table 和 Test2::Suite。
更新模块: 包括 Archive::Tar、attributes、autodie、B、B::Deparse、Benchmark、bignum、builtin、bytes、Compress::Raw::Bzip2、Compress::Raw::Zlib、CPAN::Meta::Requirements、Data::Dumper、DB_File、Devel::Peek、Devel::PPPort、diagnostics、DynaLoader、Encode、Errno、experimental、Exporter、ExtUtils::CBuilder、ExtUtils::Manifest、ExtUtils::Miniperl、Fcntl、feature、fields、File::Compare、File::Find、File::Glob、File::Spec、File::stat、FindBin、Getopt::Long、Getopt::Std、Hash::Util、Hash::Util::FieldHash、HTTP::Tiny、I18N::Langinfo、IO、IO-Compress、IO::Socket::IP、IO::Zlib、locale、Math::BigInt、Math::BigInt::FastCalc、Module::CoreList、Module::Metadata、mro、NDBM_File、Opcode、perl5db.pl、perlfaq、PerlIO::encoding、PerlIO::scalar、PerlIO::via、Pod::Checker、Pod::Html、Pod::Simple、podlators、POSIX、re、Safe、SelfLoader、Socket、strict、Test::Harness、Test::Simple、Text::Tabs、Text::Wrap、threads、threads::shared、Tie::File、Time::gmtime、Time::HiRes、Time::Local、Time::localtime、Time::tm、UNIVERSAL、User::grent、User::pwent、version、warnings、XS::APItest 和 XS::Typemap。

文档

更新了文档以反映此版本中的更改。
对 perlapi、perlclass、perlfunc、perlguts、perlclib、perlhacktips、perllol、perlre、perlref、perlop 和 perlvar 进行了其他改进。

诊断

添加了新的错误和警告消息。
改进了现有诊断消息的清晰度和准确性。

配置和编译

移除了 microperl。
修复了在不同语言环境下探测 LC_ALL 语法的 here-doc 问题。
现在可以使用 -Accflags=-DPERL_USE_HWM 和 -Accflags=-DPERL_NO_HWM 分别启用或禁用非调试和调试构建的高水位线检查。

测试

添加和更改了测试以反映此版本中的其他添加和更改。
对测试套件进行了重大改进,包括更新 nm 输出解析、处理 BusyBox 系统上的测试失败、使用更便携的方式获取对象文件中定义的名称以及添加广泛的语言环境处理压力测试。

平台支持

新增平台: Serenity OS。
平台特定说明: Windows、Linux、MacOS/Darwin 和 VMS。

内部变化

添加了 PERL_RC_STACK 构建选项,该选项目前是实验性的,并默认禁用。
添加了一个新的 API 函数 newLISTOPn(),用于简化创建 LISTOP optree 片段的 C (或 XS) 代码。
eval_sv() API 现在接受 G_USEHINTS 标志,该标志使用来自 PL_curcop 的提示(例如 strict 和 features),而不是默认的默认提示。
修复了 PERL_VERSION_LE 以正确检查“小于或等于”,而不是“小于”。
dAX、dITEMS 和 dXSARGS 现在将 AX 和 items 声明为 Stack_off_t,而不是 SSize_t。
为 XS 代码添加了一个新函数 sv_langinfo,它提供与现有 Perl_langinfo8 相同的信息,但返回一个 SV 而不是 char *。
glibc 有一个未记录的等效函数来查询 locale(),当使用此函数时,它消除了 perl 保留自己记录的需要,因此效率更高,并保证准确。可以通过定义 NO_NL_LOCALE_NAME 构建选项来禁用此函数的使用。

相关的错误修复

修复了与 Unicode 定界符、use 5.36、闭包清理、字符串操作、类继承、state 变量、数组操作、-X 标志、内存泄漏、词法作用域、join() 函数、dbstate 操作符、语言环境处理、正则表达式引擎 、临时堆栈、词法子例程和 prepare_export_lexical() 函数相关的大量错误。

已知问题

Windows 上的 perlivp 缺少 streamzip。

先前版本的勘误表

更新了 perl5300delta,以包含与 $[ 同时删除的 arybase 模块的删除。

致谢

感谢所有为 Perl 5.40.0 做出贡献的人员。

报告错误

如果您发现任何问题,请在此提交问题报告。

致谢

可以通过运行 perlthanks 程序来感谢 Perl 5 移植者。

另请参阅

Changes 文件:详细说明如何查看更改的详细信息。
INSTALL 文件:介绍如何构建 Perl。
README 文件:介绍一般内容。
Artistic 和 Copying 文件:版权信息。

perl-5.40.0-perldelta.pod