内容

名称

perl5320delta - perl v5.32.0 的新增功能

描述

本文档描述了 5.30.0 版本和 5.32.0 版本之间的差异。

如果您要从 5.28.0 等早期版本升级,请先阅读 perl5300delta,其中描述了 5.28.0 和 5.30.0 之间的差异。

核心增强功能

isa 运算符

一个名为 isa 的新的实验性中缀运算符测试给定对象是否是给定类的实例,或者是否是该类的派生类的实例。

if( $obj isa Package::Name ) { ... }

有关更多详细信息,请参阅 "perlop 中的类实例运算符"

支持 Unicode 13.0

有关详细信息,请参阅 https://www.unicode.org/versions/Unicode13.0.0/

链式比较功能

一些比较运算符,以及它们的结合性,会与一些具有相同优先级的运算符链式(但绝不会与不同优先级的运算符链式)。

if ( $x < $y <= $z ) {...}

行为与

if ( $x < $y && $y <= $z ) {...}

完全相同(假设"$y"是一个看起来很简单标量)。

您可以在perlop"运算符优先级和结合性"中了解更多信息。

支持新的 Unicode 属性Identifier_StatusIdentifier_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()mbtowcwctomb

POSIX::mblen()mbtowcwctomb 函数现在可以在移位状态区域设置中工作,并且在 C99 及更高版本的编译器上执行时,在具有区域设置线程安全的平台上是线程安全的;长度参数现在是可选的。

这些函数始终在当前 C 语言区域设置下执行。(请参阅perllocale。)大多数区域设置是无状态的,但少数区域设置(特别是很少遇到的 ISO 2022)在对这些函数的调用之间保持状态。以前,状态在每次调用时都会被清除,但现在状态不会被重置,除非相应的参数为 undef

在多线程 Perl 中,C99 函数 mbrlen(3)mbrtowc(3)wcrtomb(3)(如果可用)将替换普通函数。这使得这些函数在执行于区域设置线程安全的平台上时是线程安全的。

mblenmbtowc 中的字符串长度参数现在是可选的;仅当您希望将解析的源字符串长度限制为小于实际长度时才有用。

Alpha 断言不再是实验性功能

参见 "(*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 上开发

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) 的作用域内编译的。(除了第二种情况外,其他情况也会显示其他信息。)

安全

[CVE-2020-10543] 由精心制作的正则表达式引起的缓冲区溢出

Perl 正则表达式编译器中嵌套正则表达式量词的存储空间计算中的带符号 size_t 整数溢出会导致堆缓冲区溢出,从而用攻击者提供的数据覆盖正则表达式存储空间之后分配的内存。

目标系统需要足够的内存来分配嵌套量词的部分扩展,然后才能发生溢出。在 64 位系统上不太可能满足此要求。

发现者:The Tarantula Team 的 ManhND,VinCSS(Vingroup 成员)。

[CVE-2020-10878] 通过精心制作的正则表达式生成的格式错误的字节码导致的整数溢出

在计算正则表达式引擎指令之间偏移量的过程中,整数溢出可能会导致编译后的正则表达式的中间语言状态损坏。攻击者可以利用此行为将指令插入到 Perl 正则表达式的编译形式中。

发现者:Hugo van der Sanden 和 Slaven Rezic。

[CVE-2020-12723] 由精心构造的正则表达式引起的缓冲区溢出

Perl 正则表达式编译器对 S_study_chunk() 的递归调用,用于优化正则表达式的中间语言表示,可能会导致编译后的正则表达式的中间语言状态损坏。

发现者:Sergey Aleynikov。

附加说明

如果 Perl 编写的应用程序评估攻击者提供的正则表达式,则该应用程序可能会受到上述任何缺陷的影响。以这种方式评估正则表达式是危险的,因为正则表达式引擎在这种使用场景中不提供针对拒绝服务攻击的保护。

不兼容的更改

在编译 Unicode 属性值通配符子模式时,某些模式匹配功能现在被禁止

这些功能要么不合适,要么会干扰用于完成此任务的算法。完整的列表在 "perlunicode 中的属性值通配符" 中。

已删除未使用的函数 POSIX::mbstowcsPOSIX::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]

禁止对代码点大于 0xFF 的字符串使用 vec

此类字符串在内部以 UTF-8 表示,而 vec 是一个面向位的操作,在这些字符串上可能会产生意外的结果。这在 perl 5.28.0 中已弃用。

禁止在字符串按位运算符中使用代码点大于 0xFF 的代码点

在之前的弃用周期之后,这些操作中的某些操作已经是非法的。现在禁止使用剩余的操作,这些操作在 perl 5.28.0 中已弃用。参见 perldeprecation

Sys::Hostname::hostname() 不接受参数

此用法在 perl 5.28.0 中已弃用,现在是致命的。

现在,对于范围运算符,普通字符串 "0" 被视为数字

以前,范围 "0" .. "-1" 会生成从 "0" 到 "99" 的数字字符串范围;现在它会生成一个空列表,就像 0 .. -1 一样。这也意味着 "0" .. "9" 现在会生成一个整数列表,而以前它会生成一个字符串列表。

这是由于一个特殊情况,它将以 "0" 开头的字符串视为字符串,因此像 "00" .. "03" 这样的范围会生成 "00", "01", "02", "03",但没有专门处理字符串 "0"[GH #16770]

\K 现在在先行断言和后行断言中被禁止

这是因为它会导致意外行为,并且没有人能够定义期望的行为应该是什么。 [GH #14638]

性能增强

模块和语义

更新的模块和语义

已删除的模块和语义

文档

对现有文档的更改

我们已尝试更新文档以反映本文档中列出的更改。 如果您发现我们遗漏了任何内容,请在 https://github.com/Perl/perl5/issues 上打开一个问题。

此外,还进行了以下选定更改

perldebguts

perlapi

perldiag

perlfunc

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() 部分已进行了重大翻新。

perlguts

perlhacktips

perlintro

perlipc

perlop

perlpod

perlport

perlreref

perlvar

perlapi, perlintern

perlxs

POSIX

此外,还进行了以下选定更改

诊断信息

诊断输出中添加或更改了以下内容,包括警告和致命错误消息。有关诊断消息的完整列表,请参见 perldiag

新的诊断

新的错误

新的警告

现有诊断的更改

实用程序更改

perlbug

streamzip

配置和编译

Configure

测试

添加和更改了测试以反映此版本中的其他添加和更改。此外,还进行了以下重大更改

平台支持

已停用平台

Windows CE

现在已删除在 Windows CE 上构建 perl 的支持。

平台特定说明

Linux

如果ccclang,则将使用cc填充plibpth[GH #17043]

NetBSD 8.0

修复了在 NetBSD 8.0 上使用 g++ 编译 Perl 的问题。[GH #17381]

Windows
  • ccflagsoptimize的配置现在与 POSIX 平台一样是分开的。[GH #17156]

  • 现在已删除使用 Visual C++ 6.0 构建 perl 的支持。

  • 区域设置测试可能会在 Win32 上崩溃,原因是 Windows 错误,以及由于 CRT 在区域设置名称在当前代码页中未有效编码时抛出异常。

    对于第二个问题,我们现在自己解码区域设置名称,并始终将其解码为 UTF-8。 [GH #16922]

  • t/op/magic.t 如果已经存在以FOO开头的环境变量,则可能会失败。

  • MYMALLOC (PERL_MALLOC) 构建已修复。

Solaris
  • Configure现在将找到 Oracle Developer Studio 编译器的最新版本,这些版本位于/opt/developerstudio*下。

  • Configure现在使用检测到的gethostby*函数类型,允许 Perl 再次在某些 Solaris 配置上编译。

VMS
  • 随着补丁包 C99 V2.0 的发布,VSI 为许多以前缺少的 C99 功能提供了支持。在安装了该补丁包的系统上,Perl 的配置过程现在将检测到stdint.h头文件和以下函数的存在:fpclassifyisblankislessllrintllrintlllroundllroundlnearbyintroundscalbnscalbnl

  • -Duse64bitint现在是 VMS 上的默认值。

z/OS

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 平台上根本无法工作。

内部更改

选定的错误修复

讣告

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 文件,了解一般信息。

ArtisticCopying 文件,了解版权信息。