Perl 5.32发布

2020-06-22 01:55:27

如果要从较早版本(如5.28.0)升级,请先阅读perl5300Delta,它描述了5.28.0和5.30.0之间的区别。

名为isa的新的实验性中缀操作符测试给定对象是给定类的实例还是从它派生的类:

一些比较运算符作为它们的结合性,与一些具有相同优先级的运算符链接在一起(但绝不会与具有不同优先级的运算符链接)。

您可以在perlop中的";运算符优先级和结合性";中的perlop中阅读更多关于这方面的内容。

unicode正在修改其正则表达式要求:https://www.unicode.org/draft/reports/tr18/tr18.html.。作为其中的一部分,他们希望公开更多的属性,这些属性不是严格的UCD(Unicode字符数据库)的一部分。这两个用于出于安全目的检查输入。有关它们用法的详细信息,请访问https://www.unicode.org/reports/tr39/proposed.html.。

Unicode Name属性现在可以在正则表达式模式中访问,作为\N{.}的替代。这两种方法的比较载于Perlunicode中的\n{.}和\p{name=.}&34;。

上面的第二个示例显示通配符子模式也可在此属性中使用。请参阅perlunicode中属性值中的通配符。

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

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

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

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

参见Perlre中的";(*plb:Pattern)";,Perlre中的";(*NLA:Pattern)";和Perlre中的";(*NLB:Pattern)";。使用这些代码不再生成警告;禁用警告类别实验性::Alpha_Assertions的现有代码将继续工作,无需任何更改。启用该类别不起作用。

请参见Perlre中的脚本运行。使用这些代码不再生成警告;禁用警告类别ENTERATIONAL::SCRIPT_RUN的现有代码将继续工作,不需要任何更改。启用该类别不起作用。

以前,当功能设置在功能包之外时,解析器中的功能检查需要散列查找,这已优化为位掩码检查。[GH#17229]。

非安全错误现在应该通过GitHub报告。安全问题应继续按照Perlsec中的记录进行报告。

这主要用于跟踪正则表达式编译器中的错误。如果您在命令行中指定-drv,则此转储发生在-DDEBUGGING Perls上;或者,如果模式是在使用re QW(Debug DUMP_PRE_OPTIMIZATE)或使用re QW(Debug Compile Extra)的范围内编译的,则此转储发生在任何Perl上。(除第二个案例外,所有案例还显示其他信息。)

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

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

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

Perl的正则表达式编译器为优化正则表达式的中间语言表示而递归调用S_Study_Chunk()可能会导致已编译正则表达式的中间语言状态损坏。

使用Perl编写的应用程序只有在评估攻击者提供的正则表达式时才容易受到上述任何缺陷的攻击。众所周知,以这种方式计算正则表达式是危险的,因为在此使用方案中,正则表达式引擎不能保护其免受拒绝服务攻击。

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

由于接口规范有缺陷,这些函数永远不会工作。显然没有对它们的需求,因为多年来没有人抱怨过这些功能被声称是可用的,因此对它们的所谓支持现在被放弃了。

请参阅";选定的错误修复";。以前使用的试探法可能会让一些结构编译(可能没有达到程序员预期的效果),而这本应是错误的。没有一个是已知的,但可能是一些错误的构造不再编译。

以前,如果且仅当在编译包含用户定义的属性的正则表达式模式之前声明了该属性,才会使用其定义,而不使用任何同名的官方Unicode属性。现在,它总是凌驾于官方财产之上。此更改可能会破坏依赖(可能无意中)以前行为的现有代码。如果没有此修复,如果Unicode发布了一个新版本,其新属性恰好与您长期使用的版本同名,则当您升级到使用该新Unicode版本的Perl时,您的程序将崩溃。请参阅Perlunicode中的用户定义字符属性(";User-Defined Character Properties";)。[GH#17205]。

在某种可修改的上下文中引用$var的位置现在定义SUB时会产生异常。

这样的字符串在内部以UTF-8表示,而vec是面向位的操作,可能会在这些字符串上产生意想不到的结果。这在Perl 5.28.0中已弃用。

在之前的一个弃用周期之后,这些药物的一些使用已经是非法的。Perl 5.28.0中已弃用其余用途,现在已禁止使用。请参见Perldeplation。

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

这是因为有一种特殊情况,它将以";0";开头的字符串视为字符串,因此范围类似于";00";。";03";生产";00";、";01";、";02";、";03";,但没有专门处理字符串";0";。[PERL#133695]。

这是不允许的,因为它会导致意想不到的行为,而且没有人能定义期望的行为应该是什么。[PERL#124256]。

现在,在排序{$a<;=>;$b}或排序{$b<;=>;$a}等情况下,排序速度明显加快。[GH#17608]

现在,在Win32上生成的测试文件与在类似POSIX的系统上生成的测试文件完全相同。

以前,当转储数组的元素并遇到未定义的值时,打印的字符串将是空数组。这已经被更改为显然是最初想要的:空插槽。

添加了一个新的间接功能,该功能默认情况下处于启用状态,但允许关闭间接对象语法。

在Win32上,测试不再需要驱动器根目录中的文件或可写根目录。

当示例代码停止使用较新的Perl时,概要已更新。[GH#17399]。

套接字不再缓存零协议值,因为这表明实现将选择协议。这意味着在没有为给定套接字类型实现SO_PROTOCOL的平台上,PROTOCOL方法可能返回undef。

现在,提供给的在调用send()方法时总是有效的。[PERL#133936]。

现在,在测试中使用Test::More中的note()是可选的。当从CPAN安装到非常旧的Perls上时,这可以绕过Test::More的循环依赖。

正则表达式对象在检索时没有为对象ID目的正确计数。这会损坏结果结构,或者在某些情况下导致运行时错误。[PERL#134179]。

Pod::Parser已从核心发行版中删除。它仍然可以从CPAN下载。这解决了[perl#119439]。

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

此节点类似于ANYOFHb,但在所有匹配的代码点中有多个前导字节相同时使用。

ANYOFHb用于避免将不匹配的内容从UTF-8转换为代码位。它检查UTF-8编码目标中的第一个字节是否为所需的字节,从而排除大多数可能的代码点。

sv_setpvn已更新,提到此函数不会更改UTF-8标志,并保证终止NUL字节。

(s实验性::ISA)如果使用(ISA)运算符,则会发出此警告。该操作符目前处于实验阶段,其行为可能会在未来的Perl版本中发生变化。

与__FILE__和__LINE__类似,此处返回的文件名和行号可以通过perlsyn中的";Plain Old Comments(NOT!)";中描述的机制进行更改。

它可以通过perlsyn中的Plain Old Comments(NOT!)&34;中描述的机制进行更改。

它可以通过perlsyn中的Plain Old Comments(NOT!)&34;中描述的机制进行更改。

不再建议使用Perl的malloc。现代系统malloc被认为比现在的Perl实现要好得多。

已删除有关embed.fnc标志的文档。embed.fnc现在其中有足够的注释。任何更改该文件的人都将首先看到这些注释,因此这里的条目现在是多余的。

围绕open和Handle用法的文档已经过现代化,可以使用3个参数的open和词法变量,而不是赤裸裸的单词。

各种更新和修复,包括使所有示例都严格安全,并用使用警告替换-w。

这是一个试验性功能,使用功能启用后即可使用。它在实验::ISA类别中发出警告。

更新timegm示例以使用正确的年份格式1970而不是70。[GH#16431]

有关线程化构建的setlocale警告已更新,注意它不适用于Perl 5.28.X和更高版本。

POSIX::SigSet->;新建(.)。更新为声明如果无法将任何提供的信号添加到集合中,则它将引发错误。

指向现已停业的https://search.cpan.org站点的链接现在指向等效的https://metacpan.org网址。[GH#17393]。

ExtUtils::XSSymSet的手册页现在只安装在VMS上,这是安装模块的唯一平台。[GH#17424]。

如果适用,文档中的URL已从使用http://协议移至https://.。这也会影响https://rt.perl.org.上错误跟踪器的位置。

一些指向OS/2库、地址消毒器和其他系统工具的链接已经过时。这些已使用工作链接进行了更新。

perl5-porters上一些旧电子邮件地址的链接已经失效。这些已使用工作链接进行了更新。

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

(F)0x后未找到十六进制数字或0b后未找到二进制数字。

这实际上不是一条新消息,但现在在启用警告类别便携时输出。

当在正则表达式模式编译期间引发时,警告会在末尾添加额外的文本,以精确标记它在模式中出现的位置。

这取代了不明确得多的警告,它给出了错误的信息。此新警告与为\o{}提出的类似现有警告类似。

.现在,当在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以精确地标记它在模式中出现的位置。

.现在,当在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以精确地标记它在模式中出现的位置。

.现在,当在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以精确地标记它在模式中出现的位置。

.现在,当在正则表达式模式编译期间引发时,会在末尾添加额外的文本,以精确地标记它在模式中出现的位置。

.现在包括短语";,在正则表达式模式编译过程中引发时,会在\o提前终止";,并在末尾添加额外的文本,以精确地标记它在模式中出现的位置。在某些情况下,决议的案文已经澄清。

从Perl 5.32开始,不再生成此消息。相反,";非八进制字符';%c';提前\o终止。改为使用Perldiag中的";%s";解析。

此消息的某些实例以前以小写形式输出十六进制数字A、B、C、D、E和F。现在它们都是一致的大写字母。

以下三个诊断已删除,取而代之的是期望regex中的内插扩展charclass;标记为<;--此处为m/%s/:期望regex中嵌套扩展charclass的关闭Paren;标记为<;--此处为m/%s/中嵌套扩展charclass的包装器关闭Paren;标记为<;--此处为m/%s/中的嵌套扩展charclass,期望为';(?标志:(?[.';in。

代码点0x%X不是Unicode,不可移植警告删除了0xFFFF_FFFF以上的行代码点要求大于32位字。作为代码点,那么大的代码点在32位平台上不再是合法的。

此错误消息已从原始的不能在";%s&34;中使用全局%s略微重新格式化,特别是像不能使用全局$_in&34;my&34;这样的误导性错误消息现在呈现为不能使用全局$_in子例程签名。

此错误消息取代了以前可能在其他地方修改的词法变量中的常量,这些常量已弃用。这在Perl 5.32中是不允许的,以反映这样一个事实,即这种以前不推荐使用的用法现在已转换为异常。邮件的分类也已从D(已弃用)更新为F(致命)。

\n这里的{}被限制为一个字符,现在发出的情况与以前\N{}在反转字符类中或作为范围端点被限制为一个字符的情况相同。

这是由于Perl5.30中添加了先前措辞没有涉及的新情况。

Streamzip从标准输入创建一个zip文件。该程序将从stdin读取数据,将其压缩到一个zip容器中,并在默认情况下将一个流式zip文件写入stdout。

对于clang++,添加#include<;stdlib.h>;以配置';的探测,用于futime、stroll、stroul、stroull、strouq,否则探测将无法编译。

使用lchown的编译和运行测试来满足clang++的要求,这样可以更可靠地检测到它。

对于C++编译器,添加#include<;stdio.h>;来配置';的getpgrp和setpgrp探测器,因为它们使用printf,C++编译器可能会编译失败,而不只是警告。

Configure Now正确处理GCC-10。此前,它将其解释为GCC-1,并打开了-fpc-struct-return。

Perl现在不再探测d_u32ign,默认在所有平台上定义。此检查在完成时很容易出错,因为它只在32位平台上进行。[PERL#133495]。

在Z/OS(原生EBCDIC)上构建Perl的文档和提示已经更新。这仍是一项正在进行的工作。

在C++和clang++中配置为检测方面的改进。安迪·多尔蒂(Andy Dougherty)正在进行的工作。[PERL#134171]。

这个重新生成perlintern和perrapi的工具已经过重大改进,恢复了embed.fnc和devel::PPPort中使用的标志的一致性,并允许删除代码中apidoc条目的许多冗余=。

现在定义了ECHO宏。这是在最初为FreeBSD更改的DTrace规则中使用的,FreeBSD make显然预定义了它。Solaris制造商没有预定义ECHO,这在Solaris上违反了这一规则。[PERL#134218]。

添加和更改了测试,以反映此版本中的其他添加和更改。此外,我们还作出了以下重大改变:

t/run/switches.t不再使用(和重用)t/下的tmpinplace/目录。这可以防止虚假故障。[GH#17424]。

修复了POSIX::MBTowc中的各种错误。现在避免了与其他线程的潜在竞争,以前返回的宽字符很可能是垃圾。

修复了POSIX::wctomb中的各种错误。现在避免了与其他线程的潜在竞争,以前,如果字符串参数是共享的,或者没有预先分配足够长度的字符串来保存结果,就会出现段错误。

EBCDIC上修复了包含控制字符和Unicode的标量的某些测试输出。

与POSIX平台一样,ccflag和Optimize的配置现在是分开的。[GH#17156]。

如果区域设置名称未在当前代码页中进行有效编码,则区域设置测试可能会由于Windows错误和CRT引发异常而在Win32上崩溃。

对于第二个,我们现在自己解码语言环境名称,并始终将其解码为UTF-8。[PERL#133981]。

Configure现在将在/opt/developerstudio*下找到Oracle Developer Studio编译器的最新版本。

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

随着补丁工具包C99 V2.0的发布,VSI提供了对许多以前缺少的C99功能的支持。在安装了该补丁程序工具包的系统上,Perl的配置进程现在将检测是否存在标头stdint.h和以下函数:fpategfy、isBlank、isless、llrint、llrintl、llround、llround、neearbyint、round、scalbn和scalbnl。

使用语言环境时,z/OS不能正确处理LC_MESSAGES类别,因此在编译Perl时,您应该将以下内容添加到配置选项中。

z/OS不支持带线程的区域设置,因此在编译线程化Perl时,您应该将以下内容添加到您的配置选项中

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:

失败的原因有自检I。

..