内容

名称

perl5360delta - perl v5.36.0 的新功能

描述

本文档描述了 5.34.0 版本和 5.36.0 版本之间的差异。

核心增强功能

use v5.36

与往常一样,use v5.36 会开启该 Perl 版本的功能包。

5.36 包启用了 signatures 功能。该功能在 Perl 5.20.0 版本中引入,并自此进行了多次修改,现在不再被视为实验性功能。它现在被视为稳定的语言功能,不再发出警告。

use v5.36;

sub add ($x, $y) {
  return $x + $y;
}

尽管如此,签名子例程的某些元素仍然是实验性的;请参见下文。

5.36 包启用了 isa 功能。该运算符在 Perl 5.32.0 版本中引入,自此保持不变。该运算符现在被视为稳定的语言功能。有关更多详细信息,请参见 "perlop 中的类实例运算符"

5.36 包还禁用了indirectmultidimensional 功能。这些功能将分别禁止:使用“间接”方法调用(如 $x = new Class;);使用列表表达式作为哈希键来模拟稀疏多维数组。这些更改的具体细节可以在 feature 中找到,但简而言之:这有点像开启了更多 use strict,禁用了比其价值更多麻烦的功能。

此外,use v5.36 还将启用警告,就像您编写了 use warnings 一样。

最后,在本版本中,自 v5.10 中引入功能包以来,每个功能包中都存在的实验性 switch 功能已从 v5.36 包中删除。如果您想使用它(不建议这样做),您需要显式启用它。

-g 命令行标志

提供了一个新的命令行标志 -g。它是 -0777 的简化别名。

有关更多信息,请参见 "perlrun 中的 -g"

支持 Unicode 14.0

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

正则表达式集合不再被视为实验性功能

在此版本之前,正则表达式集合功能(正式名称为“扩展括号字符类”)被视为实验性功能。该功能在 Perl 5.18.0 版本中引入,并自那时起进行了多次修改,现在被认为是稳定的语言功能,其使用不再发出警告。请参阅 "perlrecharclass 中的扩展括号字符类"

可变长度后顾之忧在很大程度上不再被视为实验性功能

在此版本之前,任何形式的可变长度后顾之忧都被视为实验性功能。在此版本中,实验性状态已缩减至仅涵盖包含捕获括号的后顾之忧。这是因为尚不清楚

"aaz"=~/(?=z)(?<=(a|aa))/

应该匹配并使 $1 等于 "a" 还是 "aa"。目前,它将匹配最长的可能替代方案 "aa"。虽然我们相信该构造现在只会匹配它应该匹配的情况,但我们不确定是否会保留当前的“最长匹配”行为。

SIGFPE 信号不再延迟

浮点异常现在会立即传递,与其他“错误”类信号(如 SIGSEGV)相同。这意味着至少有机会使用 $SIG{FPE} 处理程序捕获此类信号,例如,以便 die 可以报告触发该信号的 perl 代码行。

稳定的布尔值跟踪

“true” 和 “false” 布尔值(通常通过 !!0!!1 等构造访问,以及从许多核心函数和运算符返回)现在即使通过赋值到变量也会记住其布尔值性质。新的函数 is_bool()builtin 中可以检查一个值是否具有布尔值性质。

这在与其他语言或数据类型序列化进行交互时可能很有用,以及在其他地方。

一次迭代多个值(实验性功能)

您现在可以通过在括号内指定一个词法列表来一次迭代多个值。例如,

for my ($key, $value) (%hash) { ... }
for my ($left, $right, $gripping) (@moties) { ... }

在 perl v5.36 之前,尝试在 for my 之后指定一个列表会导致语法错误。

此功能目前处于实验阶段,将导致类别为 experimental::for_list 的警告。有关更多详细信息,请参阅 "perlsyn 中的复合语句"。另请参阅本文档中的 "builtin::indexed",它是 n-at-a-time foreach 的一个便捷伴侣。

内置函数(实验性功能)

添加了一个新的核心模块 builtin,它提供了对内置于解释器中的新始终存在的函数的文档。

say "Reference type of arrays is ", builtin::reftype([]);

它还提供了一种词法导入机制,用于提供这些函数的简短名称版本。

use builtin 'reftype';
say "Reference type of arrays is ", reftype([]);

此内置函数机制及其提供的函数目前均为实验性。我们预计builtin本身将在不久的将来不再是实验性的,但其中的各个函数可能会持续稳定。随着时间的推移,将向builtin添加其他函数。

有关详细信息,请参阅builtin,但以下是 v5.36 中内置函数的摘要

builtin::trim

此函数将它的参数视为字符串,返回删除其开头和结尾的所有空格后的结果。

builtin::indexed

此函数返回一个列表,其大小是其参数列表的两倍,其中每个项目都以其在该列表中的索引为前缀。这主要用于使用新的foreach语法,使用多个迭代器变量来迭代数组或列表,同时跟踪每个项目的索引

use builtin 'indexed';

foreach my ($index, $val) (indexed @array) {
    ...
}
builtin::true, builtin::false, builtin::is_bool

truefalse 返回布尔值 true 和 false。Perl 仍然是 Perl,没有对布尔值的严格类型检查,但这些值将被认为是作为布尔值创建的。is_bool 将告诉您一个值是否被认为是作为布尔值创建的。

builtin::weaken, builtin::unweaken, builtin::is_weak

这些函数将分别:削弱引用;加强引用;并返回引用是否为弱引用。(弱引用不会计入垃圾回收。请参阅perlref。)这些可以代替Scalar::Util中的某些类似例程。

builtin::blessed, builtin::refaddr, builtin::reftype

这些函数提供了有关引用(或非引用,实际上!)的更多数据,并且可以代替Scalar::Util中找到的类似例程。

builtin::ceil, builtin::floor

ceil 返回大于或等于其参数的最小整数。floor 返回小于或等于其参数的最大整数。这些可以代替POSIX中找到的类似例程。

defer 块(实验性)

此版本添加了对defer 块的支持,defer 块是代码块,以defer 修饰符为前缀。它们提供了一段代码,该代码将在稍后的时间(在作用域退出期间)运行。

简而言之,当运行时遇到 defer 块时,它的主体会被搁置,并在封闭作用域退出时运行。它与 UNITCHECK 不同(除其他原因外),如果在到达 defer 块之前退出了包含 defer 块的块,则它不会运行。

defer 块可以用来代替“作用域保护”对象,其中一个对象被传递一个代码块,由它的析构函数运行。

有关更多信息,请参见 "perlsyn 中的 defer 块"

try/catch 现在可以有 finally 块(实验性)

实验性的 try/catch 语法已扩展为支持由 finally 关键字引入的可选第三个块。

try {
    attempt();
    print "Success\n";
}
catch ($e) {
    print "Failure\n";
}
finally {
    print "This happens regardless\n";
}

这提供了在 try/catch 结构结束时运行的代码,即使被异常或控制流关键字中止。它们类似于 defer 块。

有关更多信息,请参见 "perlsyn 中的 Try Catch 异常处理"

用于引号类运算符的非 ASCII 分隔符(实验性)

Perl 传统上只允许四对字符串/模式分隔符:( ) { } [ ]< >,所有都在 ASCII 范围内。Unicode 有数百种可能性,使用此功能可以启用其中许多。启用后,您可以说 qr« »,例如,或 use utf8; q𝄃string𝄂。有关详细信息,请参见 "feature 中的 'extra_paired_delimiters' 功能"

@_ 现在在带签名的子程序中是实验性的

即使子程序签名现在已经稳定,在具有签名的子程序中使用遗留参数数组 (@_) 仍然是实验性的,有自己的警告类别。静默 experimental::signatures 警告类别不足以消除这一点。新的警告以类别名称 experimental::args_array_with_signatures 发出。

任何具有签名的子程序,如果尝试显式或隐式地使用默认参数数组或其元素 (@_$_[INDEX])(例如,没有参数的 shiftpop),都会在编译时引发警告。

use v5.36;

sub f ($x, $y = 123) {
  say "The first argument is $_[0]";
}

Use of @_ in array element with signatured subroutine is experimental
at file.pl line 4.

尝试执行此操作的代码的行为不再指定,并且可能会在将来的版本中发生变化。

不兼容的更改

物理上为空的排序现在是编译时错误

@a = sort @empty; # unaffected
@a = sort;        # now a compile-time error
@a = sort ();     # also a compile-time error

以前,一个裸排序是一种创建空列表的奇怪方式;现在它在编译时会报错。此更改旨在为将来可能对 sort 的增强腾出一些语法空间。

弃用

use VERSION(其中 VERSION 低于 v5.11)在 use v5.11 之后已被弃用

use v5.11 或更高版本的作用域中,use vX 行(其中 X 低于 v5.11)现在会发出警告

Downgrading a use VERSION declaration to below v5.11 is deprecated

例如

use v5.14;
say "The say statement is permitted";
use v5.8;                               # This will print a warning
print "We must use print\n";

这是因为 Perl 团队计划更改此情况下的行为。从 Perl v5.12(以及 v5.11 的部分内容)开始,strict 处于启用状态,除非它之前已被禁用。换句话说

no strict;
use v5.12;  # will not enable strict, because "no strict" preceded it
$x = 1;     # permitted, despite no "my" declaration

将来,此行为将被消除,use VERSION始终为 v5.12 及更高版本启用 strict。

希望以这种方式混合版本的代码应使用带块语法的词法作用域,以确保不同版本区域在词法上保持隔离。

{
    use v5.14;
    say "The say statement is permitted";
}

{
    use v5.8;                           # No warning is emitted
    print "We must use print\n";
}

当然,这可能不是你真正需要做的事情!如果第一个块编译成功,则意味着你正在使用 perl v5.14.0 或更高版本。

性能增强

模块和语义

更新的模块和语义

文档

新增文档

Porting/vote_admin_guide.pod

本文档提供在 Perl 核心团队内管理选举或投票的流程。

现有文档的更改

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

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

perlapi

perldeprecation

perlexperiment

perlgov

perlop

perlre

perlrun

诊断

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

新增诊断

新的错误

新的警告

现有诊断的更改

配置和编译

测试

添加和更改了测试以反映此版本中的其他添加和更改。

平台支持

Windows

VMS

keys %ENV 在 VMS 上返回一致的结果

在 VMS 上,%ENV 哈希中的条目在第一次访问时从操作系统环境加载,因此 %ENV 的第一次迭代需要扫描整个环境以找到所有可能的键。此初始化始终对完整迭代正确执行,但以前对标量上下文中的 %ENV 没有执行,这意味着如果在任何其他 %ENV 访问之前调用 scalar %ENV,它将返回 0,或者如果之前没有迭代,它将只返回已访问键的数量。

这些错误现在已修复 - 标量上下文中的 %ENVkeys %ENV 现在返回正确的结果 - 环境中所有键的数量。

已停产的平台

AT&T UWIN

UWIN 是 Windows 的 UNIX 兼容层。它最后一次发布是在 2012 年,现在已被 Cygwin 取代。

DOS/DJGPP

DJGPP 是 GNU 工具链移植到运行 DOS 的 32 位 x86 系统。最后一次已知的在它上面构建 Perl 的尝试是在 5.20,它只构建了 miniperl。

NetWare

已移除对 Novell NetWare 的支持代码。NetWare 是 Novell 的服务器操作系统。该移植最后一次更新是在 2002 年 7 月,该平台本身是在 2009 年 5 月。

无关的更改在 2009 年 9 月意外破坏了 NetWare 移植的构建,并且在 12 年内没有人报告过此事。

平台特定说明

z/OS

此更新使我们能够构建 EBCDIC 静态/动态和 31 位/64 位寻址模式 Perl。通过的测试数量与这些更新之前的基线一致。

这些更改还提供了基础支持,以便能够提供 ASCII 静态/动态和 31 位/64 位寻址模式 Perl。

z/OS(以前称为 OS/390)自述文件已更新,以描述 ASCII 和 EBCDIC 构建。

内部更改

选定的错误修复

先前版本中的勘误

讣告

Raun "Spider" Boardman(CPAN 上的 SPIDB),在 1996 年至 2002 年间至少为 Perl 5 核心发行版贡献了 66 次提交,于 2021 年 5 月 24 日因 COVID 相关并发症去世。我们将怀念他。

David H. Adler (DHA) 于 2021 年 11 月 16 日去世。1997 年,David 共同创立了第一个 Perl 用户组 NY.pm,1998 年共同创立了 Perl Mongers,以帮助在全球范围内建立其他用户组。他经常参加北美和欧洲的 Perl 大会,并以在这些大会上组织烂片之夜庆祝活动而闻名。他还为 Perl 基金会的工作做出了贡献,包括管理社区服务的白骆驼奖。我们将怀念他。

致谢

Perl 5.36.0 代表了自 Perl 5.34.0 以来大约一年的开发,包含来自 82 位作者的 2,000 个文件中的大约 250,000 行更改。

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

得益于充满活力的用户和开发人员社区,Perl 继续在它的第四个十年蓬勃发展。以下人员已知为 Perl 5.36.0 的改进做出了贡献。

Alyssa Ross,Andrew Fresh,Aristotle Pagaltzis,Asher Mancinelli,Atsushi Sugawara,Ben Cornett,Bernd,Biswapriyo Nath,Brad Barden,Bram,Branislav Zahradník,brian d foy,Chad Granum,Chris 'BinGOs' Williams,Christian Walde (Mithaldu),Christopher Yeleighton,Craig A. Berry,cuishuang,Curtis Poe,Dagfinn Ilmari Mannsåker,Dan Book,Daniel Laügt,Dan Jacobson,Dan Kogai,Dave Cross,Dave Lambley,David Cantrell,David Golden,David Marshall,David Mitchell,E. Choroba,Eugen Konkov,Felipe Gasper,François Perrad,Graham Knop,H.Merijn Brand,Hugo van der Sanden,Ilya Sashcheka,Ivan Panchenko,Jakub Wilk,James E Keenan,James Raspass,Karen Etheridge,Karl Williamson,Leam Hall,Leon Timmermans,Magnus Woldrich,Matthew Horsfall,Max Maischein,Michael G Schwern,Michiel Beijen,Mike Fulton,Neil Bowers,Nicholas Clark,Nicolas R,Niyas Sait,Olaf Alders,Paul Evans,Paul Marquess,Petar-Kaleychev,Pete Houston,Renee Baecker,Ricardo Signes,Richard Leach,Robert Rothenberg,Sawyer X,Scott Baker,Sergey Poznyakoff,Sergey Zhmylove,Sisyphus,Slaven Rezic,Steve Hay,Sven Kirmess,TAKAI Kousuke,Thibault Duponchelle,Todd Rinaldo,Tomasz Konojacki,Tomoyuki Sadahiro,Tony Cook,Unicode Consortium,Yves Orton,Михаил Козачков。

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

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

有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。

报告错误

如果您发现您认为是错误的内容,您可以在 https://github.com/Perl/perl5/issues 上查看 perl 错误数据库。您也可以在 https://www.perl5.cn/(Perl 主页)上找到信息。

如果您认为您遇到了未报告的错误,请在 https://github.com/Perl/perl5/issues 上创建一个问题。请务必将您的错误缩减为一个微小但足够的测试用例。

如果您报告的错误存在安全隐患,不适合发送到公共问题跟踪器,请参阅 "perlsec 中的 SECURITY VULNERABILITY CONTACT INFORMATION",了解如何报告该问题。

致谢

如果您想感谢 Perl 5 维护人员在 Perl 5 中所做的工作,您可以运行 perlthanks 程序。

perlthanks

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

另请参阅

有关更改的详细说明,请参阅 Changes 文件。

有关如何构建 Perl 的说明,请参阅 INSTALL 文件。

有关一般信息,请参阅 README 文件。

有关版权信息,请参阅 ArtisticCopying 文件。