内容

名称

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 12.1

由于 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 调整来处理这些字符。

Unicode 属性值规范中的通配符现在部分支持

您现在可以在正则表达式模式中执行以下操作

qr! \p{nv= /(?x) \A [0-5] \z / }!

它匹配所有 Unicode 代码点,其数值在 0 到 5(含)之间。因此,它可以匹配泰语或孟加拉语数字,其数值为 0、1、2、3、4 或 5。

这标志着在实现 Unicode 联盟建议的正则表达式功能方面又迈出了一步。

大多数属性都支持,其余的计划在 5.32 中实现。详细信息请参阅 "perlunicode 中的属性值中的通配符"

现在支持 qr'\N{name}'

以前,在单引号正则表达式模式(其评估被延迟到正常位置)中评估命名字符 \N{...} 会导致错误。现在已取消此限制。

现在无缝支持突厥语 UTF-8 本地化

土耳其语的字母 "i""I" 的大小写规则与其他语言不同。"i" 的大写是带点拉丁大写字母 I (U+0130);而 "I" 的小写是无点拉丁小写字母 I (U+0131)。Unicode 为土耳其语提供了备选的大小写规则。以前,Perl 会忽略这些规则,但现在,当它检测到正在土耳其语 UTF-8 环境下运行时,它会使用这些规则。

现在可以编译 Perl 以始终使用线程安全的区域设置操作。

以前,只有在编译 Perl 为多线程时才会使用这些调用。要始终启用它们,请将

-Accflags='-DUSE_THREAD_SAFE_LOCALE'

添加到您的 Configure 标志中。

从核心代码中消除 opASSIGN 宏的使用

此宏仍然定义,但不再在核心代码中使用。

-Drv-DDEBUGGING 构建中现在有意义

现在,将详细标志 (-Dv) 添加到 -Dr 标志会打开所有可能的正则表达式调试。

不兼容的更改

将非零值赋予 $[ 是致命的

$[ 设置为非零值已从 Perl 5.12 开始被弃用,现在会引发致命错误。请参阅 "在 perldeprecation 中将非零值赋予 $[ 是致命的"

分隔符现在必须是字素

请参阅 "在 perldeprecation 中使用未分配的代码点或非独立字素作为分隔符"

正则表达式模式中一些以前被弃用的未转义左大括号 "{" 的用法现在是非法的

但为了避免不必要地破坏代码,大多数发出弃用警告的实例仍然合法,并且现在会引发非弃用警告。请参阅 "在 perldeprecation 中正则表达式中的未转义左大括号"

以前已弃用的 :utf8 处理程序上的 sysread()/syswrite() 现在是致命的

:utf8 处理程序上调用 sysread()、syswrite()、send() 或 recv(),无论显式还是隐式应用,现在都是致命的。这在 perl 5.24 中已弃用。

:utf8 处理程序上调用这些函数存在两个问题

[GH #14839].

在错误条件中禁止使用 my()

不再允许诸如 my $x if 0 之类的声明。

[GH #16702].

使 $* 和 $# 致命

这些长期弃用的特殊变量现在在使用时会抛出异常。

[GH #16718].

使未限定的 dump() 使用致命

dump() 函数长期以来一直不鼓励使用,现在除非完全限定,否则不能使用,即 CORE::dump()

[GH #16719].

删除 File::Glob::glob()

File::Glob::glob() 函数长期以来一直被弃用,现已删除,现在会抛出异常,建议使用 File::Glob::bsd_glob() 代替。

[GH #16721].

pack() 不再能返回格式错误的 UTF-8

如果它会返回包含格式错误的 UTF-8 的 UTF-8 字符串,则会发出警告。这可以防止潜在的安全威胁。这也算是一个错误修复。 [GH #16035].

Common 脚本中包含多组数字。[0-9] 是最常见的。但还有 [\x{FF10}-\x{FF19}](全角数字零 - 全角数字九),以及几组用于数学符号的数字,例如数学双线数字。这些集合中的任何一个都应该能够出现在希腊语的脚本运行中。但是 5.30 的设计忽略了除 ASCII 数字 [0-9] 之外的所有数字,因此设计存在缺陷。这个问题已经修复,因此既是错误修复,也是不兼容性。 [GH #16704].

运行中的所有数字都必须来自同一组十个数字。

JSON::PP 默认情况下启用 allow_nonref

由于 JSON::XS 4.0 改变了其策略,默认情况下启用了 allow_nonref,因此 JSON::PP 也默认启用了 allow_nonref。

弃用功能

在 XS 代码中,使用各种处理 UTF-8 的宏。

此弃用功能计划在 5.30 版本中变为致命错误,但由于一些 CPAN 模块出现问题,已推迟到 5.32 版本。有关受影响内容的详细信息,请参阅 perldeprecation

性能增强

模块和语义

更新的模块和语义

已移除的模块和编译指示

以下模块将在未来版本中从核心发行版中移除,届时需要从 CPAN 安装。CPAN 上需要这些模块的发行版需要将它们列为先决条件。

这些模块的核心版本现在将发出“deprecated”类别的警告,以提醒您这一点。要消除这些弃用警告,请从 CPAN 安装有问题的模块。

请注意,这些模块(除了少数例外)都是很好的模块,我们鼓励您继续使用它们。它们从核心发行版中移除的主要原因是它们对启动一个功能齐全、支持 CPAN 的 Perl 安装的必要性,而不是对它们的设计的担忧。

文档

现有文档的更改

我们已尝试更新文档以反映本文档中列出的更改。如果您发现我们遗漏了任何内容,请发送电子邮件至 [email protected]

perlapi

perlop

perlreapiperlvar

perlfunc

perlreref

perllocale

perlrecharclass

perlvar

诊断信息

对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag

对现有诊断信息的更改

实用程序变更

xsubpp

配置和编译

测试

平台支持

平台特定说明

HP-UX 11.11

在使用 HP C-ANSI-C 编译时,pack() 中的一个模糊问题已通过在 pp_pack.c 中禁用优化来解决。

Mac OS X

Perl 在 Mac OS X 上针对 -Duseshrplib 构建的构建和测试过程现在与 Mac OS X 系统完整性保护 (SIP) 兼容。

SIP 阻止 /bin(以及其他几个位置)中的二进制文件传递 DYLD_LIBRARY_PATH 环境变量。就我们而言,这会阻止将 DYLD_LIBRARY_PATH 传递给 shell,从而阻止该变量传递给测试或构建过程,因此运行 perl 无法找到 libperl.dylib

为了解决这个问题,perl 可执行文件的初始构建预计会在构建目录中找到 libperl.dylib,然后在安装过程中调整库路径以指向已安装的库。

[GH #15057].

Minix3

已重新添加对 Minix3 的一些支持。

Cygwin

Cygwin 不提供 cuserid

Win32 Mingw

现在可以使用 C99 数学函数。

Windows
  • USE_CPLUSPLUS 构建选项长期以来一直存在于 win32/Makefile(用于 nmake)和 win32/makefile.mk(用于 dmake)中,现在也存在于 win32/GNUmakefile(用于 gmake)中。

  • nmake makefile 不再默认使用 Visual C++ 6.0(一个非常旧的版本,今天不太可能被广泛使用)。因此,现在需要指定 CCTYPE,因为没有明显的现代版本选择作为默认值。未指定 CCTYPE 将导致输出错误,构建将停止。

    dmakegmake 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 中意外损坏。现在已修复此问题。

内部更改

选定的错误修复

致谢

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

ArtisticCopying 文件,了解版权信息。