内容

名称

perl5280delta - perl v5.28.0 的新增功能

说明

本文档描述了 5.26.0 版本和 5.28.0 版本之间的差异。

如果您要从早期版本(例如 5.24.0)升级,请先阅读 perl5260delta,其中描述了 5.24.0 和 5.26.0 之间的差异。

核心增强功能

支持 Unicode 10.0

更改列表位于 http://www.unicode.org/versions/Unicode10.0.0

delete 用于键/值哈希切片

delete 现在可用于 键/值哈希切片,返回键及其已删除的值。 [GH #15982]

现在,某些正则表达式断言具有字母同义词(实验性功能)

如果您发现难以记住如何编写某些模式断言,现在可以使用字母同义词。

CURRENT                NEW SYNONYMS
------                 ------------
(?=...)        (*pla:...) or (*positive_lookahead:...)
(?!...)        (*nla:...) or (*negative_lookahead:...)
(?<=...)       (*plb:...) or (*positive_lookbehind:...)
(?<!...)       (*nlb:...) or (*negative_lookbehind:...)
(?>...)        (*atomic:...)

这些断言被视为实验性功能,因此使用任何这些断言都会引发(除非已关闭)experimental::alpha_assertions 类别中的警告。

现在可以检测到混合的 Unicode 脚本

字符串中混合使用脚本(例如西里尔字母和拉丁字母)通常是欺骗攻击的标志。现在,一种新的正则表达式结构允许轻松检测这些脚本。例如,您可以说

qr/(*script_run: \d+ \b )/x

匹配的数字将全部来自同一组 10 个数字。您不会从具有不同于其外观值的不同脚本中获得相似的数字。

或者

qr/(*sr: \b \w+ \b )/x

确保所有字符都来自同一脚本。

您还可以将脚本运行与 (?>...)(或 *atomic:...))结合使用。

不要编写

(*sr:(?<...))

现在您可以运行

(*asr:...)
# or
(*atomic_script_run:...)

这被视为实验性功能,因此使用它会引发(除非已关闭)experimental::script_run 类别中的警告。

请参阅 perlre 中的“Script Runs”

现在使用 perl -i 进行就地编辑更安全了

以前,只要您开始处理新文件,就地编辑 (perl -i) 就会删除或重命名输入文件。

如果没有备份,当写入输出文件时,如果出现错误(例如磁盘已满),这会导致数据丢失。

这种情况已经改变,现在只有在输出文件完全写入并成功关闭后,才会替换输入文件。

该操作通过在同一目录中创建一个工作文件来实现,一旦输出文件完成,该工作文件就会重命名为输入文件。

不兼容性

[GH #15216]

聚合状态变量的初始化

现在可以通过表达式(例如 state @a = qw(x y z))初始化持久词法数组或哈希变量。仍然无法初始化持久词法变量的列表。

全尺寸 inode 号码

在 inode 号码类型大于 perl 的本机整数数值类型的平台上,stat 将通过以十进制数字字符串的形式返回 inode 号码来保留大型 inode 号码的全部内容。因此,可以通过使用 eq 而不是 == 进行比较来实现 inode 号码的精确比较。使用 == 进行比较以及其他数值运算(这些运算通常对 inode 号码没有意义)的效果与以前一样,也就是说它们会退回到浮点数,并最终对相当无用的舍入 inode 号码进行运算,如果真正的 inode 号码对于浮点数格式来说太大。

sprintf %j 格式大小修饰符现可用于 C99 前编译器

实际使用的尺寸取决于平台,因此仍然不可移植。

关闭时执行标志已原子设置

在打开文件描述符时,perl 现在通常在支持这样做的平台上打开它,其关闭时执行标志已设置。这提高了线程安全性,因为这意味着由一个线程发起的 exec 不再可能导致另一个线程正在打开的文件描述符意外传递给已执行的程序。

此外,perl 现在更可靠地设置关闭时执行标志,无论是否以原子方式进行。大多数文件描述符都设置了标志,但有些被遗漏了。

字符串和数字特定的按位运算不再是实验性的

Perl 5.22 中引入的新字符串特定 (&. |. ^. ~.) 和数字特定 (& | ^ ~) 按位运算符在 use feature 'bitwise' 范围内可用,不再是实验性的。由于数字特定运算符的拼写方式与根据其操作数选择其行为的现有运算符相同,因此这些运算符仍必须通过“按位”功能启用,这两种方式之一

use feature "bitwise";

use v5.28; # "bitwise" now included

它们现在也通过 -E 命令行开关启用。

“按位”功能不再发出警告。禁用该功能以前使用的“实验性::按位”警告类别的现有代码将继续工作。

模块作者应该注意的一个警告是,数字运算符现在将第五个 TRUE 参数传递给重载方法。任何检查操作数数量的方法如果超出预期,都可能崩溃。特别是 XS 作者应该意识到这一点

SV *
bitop_handler (lobj, robj, swap)

可能需要将其更改为

SV *
bitop_handler (lobj, robj, swap, ...)

在支持它们的系统上,区域设置现在是线程安全的

这些系统包括从 Visual Studio 2005 开始的 Windows 以及 POSIX 2008 系统。

这意味着你现在可以自由地在多线程环境中使用区域设置并更改它们。你的更改只影响你的线程。请参阅 perllocale 中的“多线程操作”

新的只读预定义变量 ${^SAFE_LOCALES}

如果 Perl 解释器在可以安全使用和更改区域设置的环境中运行,则此变量为 1(请参阅 perllocale。)当 perl 未多线程或在支持线程安全区域设置操作的平台上编译时,此变量为 true(请参阅上一项)。

安全性

[CVE-2017-12837] 堆缓冲区溢出在正则表达式编译器中

使用不区分大小写的修饰符编译某些正则表达式模式可能会导致堆缓冲区溢出并使 perl 崩溃。此问题现已修复。 [GH #16021]

[CVE-2017-12883] 缓冲区在正则表达式解析器中过度读取

对于正则表达式模式中的某些类型的语法错误,错误消息可能包含随机、可能较大的内存块的内容,或者可能使 perl 崩溃。此问题现已修复。 [GH #16025]

[CVE-2017-12814] $ENV{$key} 堆栈缓冲区溢出在 Windows 上

Windows 上 %ENV 代码中可能的堆栈缓冲区溢出已通过完全删除缓冲区得到修复,因为该缓冲区本来就是多余的。 [GH #16051]

默认哈希函数更改

Perl 5.28.0 弃用了各种旧哈希函数,因为这些函数在 Perl 中的使用被认为不够安全。我们现在支持四种通用哈希函数、Siphash(2-4 和 1-3 变体)和 Zaphod32 以及 StadtX 哈希。此外,我们还支持 SBOX32(一种表格哈希形式)来哈希短字符串,并与提供的任何其他哈希函数结合使用。

默认情况下,Perl 被配置为支持对最多 24 个字符的字符串进行 SBOX 哈希,并结合在 64 位版本上使用 StadtX 哈希,在 32 位版本上使用 Zaphod32 哈希。

您可以使用以下选项来控制这些设置以进行配置

-DPERL_HASH_FUNC_SIPHASH
-DPERL_HASH_FUNC_SIPHASH13
-DPERL_HASH_FUNC_STADTX
-DPERL_HASH_FUNC_ZAPHOD32

要禁用 SBOX 哈希,您可以使用

-DPERL_HASH_USE_SBOX32_ALSO=0

要设置使用 SBOX32 哈希的最大长度,可以使用

-DSBOX32_MAX_LEN=16

允许的最大长度为 256。将其设置为高于默认值可能没什么意义。

不兼容的更改

子例程属性和签名顺序

实验性子例程签名功能已更改,因此子例程属性现在必须在签名之前而不是之后出现。这是因为诸如 :lvalue 之类的属性会影响签名中代码的编译,例如

sub f :lvalue ($a = do { $x = "abc"; return substr($x,0,1)}) { ...}

请注意这是它们第二次被翻转

sub f :lvalue ($a, $b) { ... }; # 5.20; 5.28 onwards
sub f ($a, $b) :lvalue { ... }; # 5.22 - 5.26

逗号分隔的变量列表格式不再允许

不再允许省略传递给格式的变量之间的逗号。这已从 Perl 5.000 开始弃用。

:locked:unique 属性已删除

这些属性已成为无操作,并分别从 Perl 5.12 和 5.10 开始弃用。

大括号之间没有内容的\N{}现在是非法的

这已从 Perl 5.24 开始弃用。

同时将同一符号作为文件和目录句柄打开不再允许

使用 open()opendir() 将文件句柄和目录句柄同时关联到同一符号(glob 或标量)已从 Perl 5.10 开始弃用。

使用裸 << 表示 <<"" 不再允许

使用裸终止符已从 Perl 5.000 开始弃用。

将 $/ 设置为对非正整数的引用不再允许

这以前就像将它设置为 undef 一样,但已从 Perl 5.20 开始弃用。

值超过IV_MAX 的 Unicode 代码点现在是致命的

这已从 Perl 5.24 开始弃用。

B::OP::terse 方法已删除

改用 B::Concise::b_terse

不再允许对非方法使用继承的 AUTOLOAD

这在 Perl 5.004 中已弃用。

对于按位字符串运算符,不允许使用代码点超过 0xFF 的字符串

代码点超过 0xFF 对按位运算符没有意义,此类操作现在会 croak,但仍有少数例外。请参阅 perldeprecation

这在 Perl 5.24 中已弃用。

${^ENCODING} 设置为已定义值现在是非法的

自 Perl 5.22 起,此功能已弃用,自 Perl 5.26 起,此功能已成为无操作。

反斜杠不再在 PATH 中为 -S 开关转义冒号

以前,-S 开关在遍历 PATH 环境变量时错误地将反斜杠 ("\") 视为冒号的转义字符。 [GH #15584]

-DH (DEBUG_H) 错误功能已删除

在使用调试支持构建 perl 时,已删除 -D 调试选项的 H 标志。此标志本应转储哈希值,但已损坏多年。

Yada-yada 现在严格为一个语句

在 Perl 5.12 中首次稳定发布时,...(yada-yada)运算符明确旨在用作语句,而不是表达式。但是,原始实现对此感到困惑,导致解析不一致。在某些情况下,运算符被错误地接受,而这些情况下它并未用作完整语句,例如

... . "foo";
... if $a < $b;

现在解析已变得一致,只允许 yada-yada 作为语句。受影响的代码可以使用 do{...} 将 yada-yada 放入任意表达式上下文中。

无法再指定排序算法

自 Perl 5.8 起,sort 实用程序具有子实用程序 _mergesort_quicksort_qsort,可用于指定 perl 应使用哪个算法来实现 sort 内置函数。这始终被认为是一个可能不会持续存在的可疑特性,因此拼写为下划线,并且记录为不可移植到 Perl 5.8 之外。这些子实用程序现已删除,任何尝试使用它们都是错误。 sort 实用程序仍然存在,并且可以中立算法的 stable 子实用程序来控制排序行为。 [GH #13234]

浮点字面量中的超过基数数字

八进制和二进制浮点字面量过去允许任何十六进制数字出现在基数点之后。现在,这些数字仅限于适用于基数的数字,就像基数点之前的数字一样。

unpackstring() 的返回类型

C API 函数 unpackstring()unpack_str() 的返回类型已从 I32 更改为 SSize_t,以便容纳超过 20 亿个项目的 dataset。

废弃

在代码点高于 0xFF 的字符串上使用 vec 已弃用

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

regex 中未转义的 "{" 的某些用法不再致命

Perl 5.26.0 将未转义的左大括号的某些用法标记为致命,但在最后一刻做出了例外,专门设计为对 GNU Autoconf 进行最小更改以使其正常工作。该工具被大量依赖,并且继续使用已弃用的用法。它使用未转义的左大括号,我们无意将 "{" 重新用作它本身以外的东西。

该例外现在已概括为包括其他各种此类情况,其中 "{" 不会被重新使用。

请注意,这些用法会继续引发弃用消息。

在正则表达式模式中紧跟 "(" 之后使用未转义的 "{" 已弃用

在任何地方使用未转义的左大括号都已正式弃用,但不会在它们的使用不会干扰语言预期扩展的情况下强制执行。当大括号紧跟在左括号之后时,此版本中会添加弃用。在此之前,即使大括号是合法量词的一部分,它也不会被解释为量词,而是解释为字面字符,这与紧跟在 "(" 之后的其他量词不同,后者被视为错误。现在,除非关闭,否则使用它们会引发弃用消息。

在 Perl 5.30 中对 $[ 进行赋值将是致命的

自 Perl 5.12 以来,向 $[ 分配非零值已被弃用,但从未给出删除的截止日期。现在已将其安排在 Perl 5.30 中。

hostname() 在 Perl 5.32 中不会接受参数

Sys::Hostname::hostname() 传递参数已弃用,但没有删除日期。现在已将其安排在 Perl 5.32 中。 [GH #14662]

模块删除

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

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

请注意,这些模块(极少数例外)是优秀的模块,我们鼓励您继续使用。它们从核心版本中剔除,主要是因为它们对于引导完全功能的、支持 CPAN 的 Perl 安装是必需的,通常不是因为它们的设计问题。

B::Debug
Locale::Codes 及其关联的国家/地区、货币和语言模块

性能增强

模块和 Pragmata

此版本中跨多个模块的主要亮点

移除 use vars

自 Perl 5.6.0 中引入 our 以来,已不鼓励使用 use vars。在可能的情况下,现已从 Perl 源代码中移除此 pragma 的用法。

这略微改善了 B::Deparse 中 WARNING_BITS 的输出。

在很多模块中,DynaLoader 的用法已更改为 XSLoader

XSLoader 更现代,并且大多数模块已经需要 perl 5.6 或更高版本,因此切换不会丢失任何功能。在某些情况下,我们还对本地实现进行了更改,由于希望保持更多向后兼容性,因此可能不会反映在 CPAN 上的版本中。

更新的模块和 Pragmata

已删除的模块和实用程序

文档

对现有文档的更改

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

此外,已进行以下选定的更改

perlapi

perldata

perldebguts

perldiag

perlembed

perlfunc

perlgit

perlguts

perlintern

perlobj

perlop

perlrequick

perlretut

perlrun

perlsec

perlsyn

perluniprops

perlvar

perlfunc, perlop, perlsyn

诊断

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

新诊断

新错误

新警告

现有诊断的更改

实用程序更改

perlbug

配置和编译

测试

打包

过去几年,我们使用三种不同的归档格式发布 perl:bzip (.bz2)、LZMA2 (.xz) 和 gzip (.gz)。由于 xz 压缩效果更好,解压缩速度更快,而 gzip 兼容性更高且占用内存更少,因此我们在此版本中放弃了 .bz2 归档格式。(如果这会带来问题,请告知我们;请参见下文的 "报告错误"。)

平台支持

已停用平台

PowerUX / Power MAX OS

已移除针对这些明显已停用的平台的编译器提示和其他支持。

特定平台说明

CentOS

现已修复在 CentOS 5 上的编译。

Cygwin

现在可以在 Cygwin 上使用 quadmath 库进行构建。

Darwin

在支持它们的 Darwin 版本上,Perl 现在正确使用可重入函数,如 asctime_r

FreeBSD

FreeBSD 的 /usr/share/mk/sys.mk 为 ARM 和 MIPS 以外的架构指定 -O2。默认情况下,现在使用相同的优化级别编译 perl。

VMS

针对 configure.com 的若干修复,标记 VMS 具有(或不具有)的功能。

嵌入式程序现在可以在调用 Perl 之前使用 decc$feature_setdecc$feature_set_value 函数设置 CRTL 功能。以前,在映像初始化后尝试设置功能会被忽略。

Windows
  • 已添加使用 Microsoft Visual Studio 2017(包含 Visual C++ 14.1)在 Windows 上编译 perl 的支持。

  • 已改进 Visual C++ 编译器版本检测,使其可在非英语语言系统上运行。

  • 我们现在使用早于 14.1 的 Visual C++ 版本为 64 位构建正确设置 $Config{libpth}

内部更改

选定的错误修复

致谢

Perl 5.28.0 代表了自 Perl 5.26.0 以来大约 13 个月的开发,包含来自 77 位作者的 2,200 个文件中大约 730,000 行的更改。

不包括自动生成的文件、文档和发行工具,大约有 580,000 行更改到 1,300 个 .pm、.t、.c 和 .h 文件。

由于活跃的用户和开发人员社区,Perl 在其第四个十年继续蓬勃发展。已知以下人员为 Perl 5.28.0 的改进做出了贡献

Aaron Crane、Abigail、Ævar Arnfjörð Bjarmason、Alberto Simões、Alexandr Savca、Andrew Fresh、Andy Dougherty、Andy Lester、Aristotle Pagaltzis、Ask Bjørn Hansen、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Collins、Daniel Dragan、David Cantrell、David Mitchell、Dmitry Ulanov、Dominic Hargreaves、E. Choroba、Eric Herman、Eugen Konkov、Father Chrysostomos、Gene Sullivan、George Hartzell、Graham Knop、Harald Jörg、H.Merijn Brand、Hugo van der Sanden、Jacques Germishuys、James E Keenan、Jarkko Hietaniemi、Jerry D. Hedden、J. Nick Koston、John Lightsey、John Peacock、John P. Linderman、John SJ Anderson、Karen Etheridge、Karl Williamson、Ken Brown、Ken Cotterill、Leon Timmermans、Lukas Mai、Marco Fontani、Marc-Philip Werner、Matthew Horsfall、Neil Bowers、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Paul Marquess、Peter John Acklam、Reini Urban、Renee Baecker、Ricardo Signes、Robin Barker、Sawyer X、Scott Lanning、Sergey Aleynikov、Shirakata Kentaro、Shoichi Kaji、Slaven Rezic、Smylers、Steffen Müller、Steve Hay、Sullivan Beck、Thomas Sibley、Todd Rinaldo、Tomasz Konojacki、Tom Hukins、Tom Wyant、Tony Cook、Vitali Peil、Yves Orton、Zefram。

上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的(非常感谢的)贡献者的姓名。

此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。

要获得所有 Perl 历史贡献者的更完整列表,请参阅 Perl 源代码发行版中的 AUTHORS 文件。

报告错误

如果您发现您认为是一个错误,您可以在 https://rt.perl.org/ 查看 perl 错误数据库。Perl 主页 https://www.perl5.cn/ 上也可能会有信息。

如果您认为您有一个未报告的错误,请运行发行版中包含的 perlbug 程序。务必将您的错误精简为一个微小但足够的测试用例。您的错误报告以及 perl -V 的输出将被发送到 [email protected],供 Perl 移植团队分析。

如果您报告的错误具有安全影响,不适合发送到公开存档的邮件列表,请参阅 perlsec 中的“安全漏洞联系信息”,了解如何报告该问题。

表示感谢

如果您希望感谢 Perl 5 Porters 在 Perl 5 中所做的工作,您可以通过运行 perlthanks 程序来实现

perlthanks

这会向 Perl 5 Porters 列表发送一封电子邮件,表示您的感谢。

另请参阅

Changes 文件,了解如何查看已更改内容的详尽详细信息。

INSTALL 文件,了解如何构建 Perl。

README 文件,了解一般信息。

ArtisticCopying 文件,了解版权信息。