内容

名称

perl5120delta - perl v5.12.0 的新增功能

描述

本文档描述了 5.10.0 版本和 5.12.0 版本之间的差异。

5.12.0 中的许多错误修复已包含在 5.10.1 维护版本中。

您可以在 5.10.1 发行说明 (perl5101delta) 中查看这些更改的列表。

核心增强功能

新的 package NAME VERSION 语法

此新语法允许模块作者在使用 'package' 声明命名空间时设置命名空间的 $VERSION。它消除了对 our $VERSION = ... 和类似构造的需要。例如

package Foo::Bar 1.23;
# $Foo::Bar::VERSION == 1.23

这有几个优点

仅使用package NAME不会破坏旧代码,但使用package NAME VERSION的代码需要限制在 Perl 5.12.0 或更高版本。这类似于将open从两个参数更改为三个参数。需要最新 Perl 的用户将受益,并且可能在几年后,它将成为标准做法。

但是,package NAME VERSION需要一种新的“严格”版本号格式。有关详细信息,请参阅"版本号格式"

... 运算符

添加了一个新的运算符...,绰号为 Yada Yada 运算符。它旨在标记尚未实现的占位符代码。请参阅"perlop 中的 Yada Yada 运算符"

隐式严格

使用use VERSION语法和大于或等于 5.11.0 的版本号将在词法上启用严格,就像use strict一样(除了启用功能)。以下

use 5.12.0;

意味着

use strict;
use feature ':5.12';

Unicode 改进

Perl 5.12 附带 Unicode 5.2,这是我们在发布时可用的最新版本。此版本的 Unicode 于 2009 年 10 月发布。有关此版本标准中更改内容的更多详细信息,请参阅http://www.unicode.org/versions/Unicode5.2.0。有关安装和使用其他版本的 Unicode 的说明,请参阅perlunicode

此外,Perl 的开发人员已显着改进了 Perl 的 Unicode 实现。有关完整详细信息,请参阅下面的"Unicode 大修"

Y2038 兼容性

Perl 的核心时间相关函数现在与 Y2038 兼容。(这对您来说可能意义不大,但您的孩子会喜欢它!)

qr 重载

现在可以重载qr//运算符,即转换为正则表达式,就像以前可以重载转换为对象的布尔值、字符串或数字一样。当对象出现在=~运算符的右侧或被插入正则表达式时,它会被调用。请参阅overload

可插拔关键字

扩展模块现在可以干净地挂接到 Perl 解析器以定义新的关键字引导表达式和复合语句类型。关键字后的语法完全由扩展定义。这允许完全非 Perl 子语言被内联解析,并生成正确的操作。

有关机制,请参阅 "perlapi 中的 PL_keyword_plugin"。Perl 核心源代码分发版还包含一个新的模块 XS::APItest::KeywordRPN,它通过可插拔关键字实现逆波兰表达式算术。此模块主要用于测试目的,通常不会安装,但也可以作为使用新机制的示例。

Perl 开发人员认为此功能是实验性的。我们可能会在 Perl 5.14 中将其删除或以不向后兼容的方式更改。

更多内部的 API

词法分析器的最低层和部分垫系统现在对 XS 扩展提供了 C API。这些是支持正确使用可插拔关键字所必需的,但也具有其他用途。新的 API 是实验性的,并且只涵盖了在这些领域充分利用核心功能所需内容的一小部分。目的是在 Perl 5.13 开发周期中添加一系列完整的、受支持的接口。

Perl 开发人员认为此功能是实验性的。我们可能会在 Perl 5.14 中将其删除或以不向后兼容的方式更改。

可覆盖的函数查找

当扩展模块挂钩 rv2cv 操作的创建以修改子例程查找过程时,这现在对裸字子例程调用有效。这意味着对以这种方式引用的子例程的原型将被正确处理。(以前,裸字子例程名称最初是通过不可挂钩的机制查找的,用于解析目的,因此扩展只能适当地影响带有 `&` 符号的子例程名称。)

可插拔方法解析顺序的适当接口

从 Perl 5.12.0 开始,有一个新的接口用于插入和使用除默认线性深度优先搜索之外的方法解析顺序。在 5.10.0 中添加的 C3 方法解析顺序已作为插件重新实现,而没有更改其 Perl 空间接口。有关更多信息,请参阅 perlmroapi

\N 实验性正则表达式转义

Perl 现在支持 \N,这是一种新的正则表达式转义,您可以将其视为 \n 的反义词。它将匹配任何不是换行符的字符,独立于单行匹配修饰符 /s 的存在与否。它不能在字符类中使用。\N{3} 表示匹配 3 个非换行符;\N{5,} 表示匹配至少 5 个。\N{NAME} 仍然表示名为 NAME 的字符或序列,但 NAME 不再可以是 35, 之类的东西。

这将破坏一个 自定义 charnames 翻译器,它允许使用数字作为字符名称,因为 \N{3} 现在将表示匹配 3 个非换行符字符,而不是名称为 3 的字符。(Unicode 标准定义的名称不是数字,因此只有自定义翻译器可能会受到影响。)

Perl 开发人员对可能与现有的 \N{...} 结构(通过其 Unicode 名称匹配字符)造成用户混淆感到担忧。因此,此功能是实验性的。我们可能会在 Perl 5.14 中将其删除或以不向后兼容的方式更改。

DTrace 支持

Perl 现在对 DTrace 提供了一些支持。请参阅 INSTALL 中的“DTrace 支持”。

CPAN 模块元数据中对 configure_requires 的支持

CPANCPANPLUS 现在都支持 META.yml 元数据文件中 configure_requires 关键字,该文件包含在大多数最新的 CPAN 发行版中。这允许发行版作者指定在运行 Makefile.PLBuild.PL 之前必须安装的配置先决条件。

有关在为 CPAN 创建发行版时如何指定 configure_requires 的更多信息,请参阅 ExtUtils::MakeMakerModule::Build 的文档。

eachkeysvalues 现在更加灵活

eachkeysvalues 函数现在可以对数组进行操作。

when 作为语句修饰符

when 现在可以作为语句修饰符使用。

$, 灵活性

变量 $, 现在可以被绑定。

// 在 when 子句中

// 在 when 子句中现在表现得像 || 一样

从 shell 环境中启用警告

您现在可以从 PERL5OPT 环境变量中设置 -W

delete local

delete local 现在允许您在本地删除哈希条目。

对抽象命名空间套接字的新支持

抽象命名空间套接字是 Linux 特定的套接字类型,它们存在于 AF_UNIX 族中,略微滥用它以能够使用任意字符数组作为地址:它们以空字节开头,不以空字节结尾,而是以传递给 socket() 系统调用的长度结尾。

删除了 substr 参数的 32 位限制

substr 参数的 32 位限制现已移除。现在,系统有符号和无符号整数的完整范围可用于 poslen 参数。

可能不兼容的更改

弃用警告默认启用

多年来,Perl 的开发者出于各种原因弃用了一些语言特性。Perl 现在默认情况下会在使用弃用语言特性时发出警告。Perl 现在警告你的许多弃用特性已经弃用了很多年。你可以在对应版本的 perl5xxdelta.pod 文件中找到特定 Perl 版本中弃用内容的列表。

要在给定的词法范围内禁用此功能,你应该使用 no warnings 'deprecated';。有关哪些语言特性已弃用以及各种弃用警告的解释,请参阅 perldiag。有关 Perl 开发者在此版本中弃用的功能和模块列表,请参阅下面的 "弃用"

版本号格式

可接受的版本号格式已正式化为“严格”和“宽松”规则。package NAME VERSION 采用严格的版本号。UNIVERSAL::VERSIONversion 对象构造函数采用宽松的版本号。提供无效的版本将导致致命错误。use NAME VERSION 中的版本参数首先被解析为数字字面量或 v 字符串,然后传递给 UNIVERSAL::VERSION(并且必须通过“宽松”格式测试)。

这些格式在 version 模块中进行了全面记录。简单来说,“严格”版本号是一个正十进制数(整数或十进制小数),不包含指数运算,或者是一个带前导 'v' 字符且至少包含三个组件的点分十进制 v 字符串。“宽松”版本号允许包含少于三个组件或没有前导 'v' 的 v 字符串。在“宽松”规则下,十进制和点分十进制版本都可以在小数部分或点分十进制部分之后使用下划线字符分隔一个尾随的“alpha”组件。

version 模块添加了 version::is_strictversion::is_lax 函数来根据这些规则检查标量。

@INC 重组

@INC 中,ARCHLIBPRIVLIB 现在出现在当前版本的 site_perlvendor_perl 之后。安装在 site_perlvendor_perl 中的模块现在将优先于安装在 ARCHLIBPRIVLIB 中的模块加载。

正则表达式现在是一等公民

在内部,Perl 现在将编译后的正则表达式(例如使用 qr// 创建的正则表达式)视为一等公民。序列化、反序列化或以其他方式与 Perl 内部数据结构进行深度交互的 Perl 模块需要针对此更改进行更新。截至撰写本文时,大多数受影响的 CPAN 模块已更新。

Switch 语句变更

given/when switch 语句比 Perl 5.10.0 更擅长处理复杂语句(这些增强功能在 5.10.1 及后续的 5.10 版本中也可用)。在两种新情况下,when 现在将它的参数解释为布尔值,而不是用于智能匹配的表达式。

翻转操作符

..... 翻转操作符现在在布尔上下文中进行评估,遵循它们通常的语义;请参阅 "perlop 中的范围操作符"

请注意,与 perl 5.10.0 一样,when (1..10) 不会用于测试给定值是否为 1 到 10 之间的整数;您应该使用 when ([1..10]) 代替(注意数组引用)。

但是,与 5.10.0 相反,在布尔上下文中评估翻转操作符确保它现在可以在 when() 中有用,特别是用于实现双稳态条件,例如在

when (/^=begin/ .. /^=end/) {
  # do something
}
定义或操作符

涉及定义或操作符的复合表达式,如 when (expr1 // expr2),如果第一个表达式是布尔值,则将被视为布尔值。(这只是扩展了适用于常规或操作符的现有规则,如 when (expr1 || expr2)。)

智能匹配变更

自 Perl 5.10.0 以来,Perl 的开发人员对智能匹配操作符进行了一些更改。当然,这些也会改变 switch 语句的行为,其中隐式使用智能匹配。这些更改也针对 5.10.1 版本进行了,并将保留在后续的 5.10 版本中。

基于类型的调度变更

智能匹配操作符 ~~ 不再是可交换的。智能匹配的行为现在主要取决于其右侧参数的类型。此外,它的语义在几个情况下进行了调整,以提高一致性或实用性。虽然总体向后兼容性得以保留,但必须注意几个更改。

智能匹配运算符的完整调度表在 "perlsyn 中的智能匹配详解" 中给出。

智能匹配和重载

根据基于最右侧参数类型的调度规则,当重载 ~~ 的对象出现在运算符的右侧时,将始终调用重载例程(第三个参数设置为真值,请参见 overload)。但是,当对象出现在左侧时,只有当最右侧参数是简单标量时才会调用重载例程。这样,智能匹配在数组上的分布性就不会被破坏,以及其他复杂类型(代码引用、哈希、正则表达式)的行为。因此,智能匹配重载例程的编写者主要只需要担心与标量的比较,以及可能与字符串化的重载;其他常见情况将自动一致地处理。

~~ 现在将拒绝对未重载它的对象进行操作(为了避免依赖于对象的底层结构)。(但是,如果对象重载了字符串化或数字化运算符,并且如果重载回退处于活动状态,它将像往常一样使用。)

其他可能不兼容的更改

弃用

随着时间的推移,Perl 的开发人员发现有必要弃用我们之前作为核心发行版一部分提供的功能或模块。我们非常清楚 Perl 的向后不兼容更改会给开发人员在 Perl 中构建或维护软件带来的痛苦和挫折。您可以确信,当我们弃用功能或语法时,这不是我们轻易做出的选择。有时,我们选择弃用功能或语法,因为发现它们设计或实现不当。有时,这是因为它们阻碍了其他功能或导致性能问题。有时,原因更复杂。在可能的情况下,我们尝试将弃用的功能以其以前的形式保留给开发人员至少一个主要版本。只要弃用的功能没有积极地破坏我们维护和扩展 Perl 的能力,我们就会尽可能长时间地保留它。

以下项目现在已弃用

suidperl

suidperl 不再是 Perl 的一部分。它曾经提供了一种机制来模拟不支持它的系统上的 setuid 权限位。

使用 := 表示空属性列表

Perl 解析器的意外情况意味着这些结构都是等效的

my $pi := 4;
my $pi : = 4;
my $pi :  = 4;

其中:被视为属性列表的开始,该列表在=之前结束。由于此处空格不重要,因此所有这些都被解析为一个空属性列表,因此以上所有内容都等效于,并且最好写成

my $pi = 4;

因为对空列表不进行任何属性处理。

照此,这意味着:=不能用作新标记,而不会在不改变现有代码含义的情况下静默地改变其含义。因此,该特定形式现在已弃用,并将成为语法错误。如果绝对有必要使用空属性列表(例如,由于代码生成器),则在=之前添加一个空格以避免警告。

UNIVERSAL->import()

方法UNIVERSAL->import()现在已弃用。尝试将导入参数传递给use UNIVERSAL语句将导致弃用警告。

使用“goto”跳转到构造体中

现在已弃用使用goto从外部作用域跳转到内部作用域。这种罕见的用例在作用域实现中造成了问题。

\N{name}中的自定义字符名称,看起来不像名称

\N{name}中,name可以是几乎任何东西。标准 Unicode 名称具有非常有限的域,但自定义名称转换器可以创建名称,例如,完全由标点符号组成。现在已弃用创建不以字母字符开头,并且不是字母数字或不包含除少数其他字符(即空格、连字符、括号和冒号)以外的其他字符的名称。由于\N的附加含义(参见"\N" 实验性正则表达式转义),看起来像花括号括起来的量词的名称将不起作用。例如,\N{3,4}现在表示匹配 3 到 4 个非换行符;之前可以创建自定义名称3,4

已弃用模块

以下模块将在未来版本中从核心发行版中删除,应从 CPAN 安装。CPAN 上需要这些模块的发行版应将它们添加到其先决条件中。这些模块的内核版本将发出弃用警告。

如果您发布了 Perl 的打包版本,无论是单独发布还是作为更大系统的一部分,那么您应该仔细考虑核心模块弃用的影响。您可能需要考虑将 Perl 的默认构建与一些或所有已弃用模块的包一起发布,这些包安装到vendorsite Perl 库目录中。这将抑制弃用警告。

或者,您可能需要考虑修补lib/deprecate.pm以提供特定于您的打包系统或 Perl 发行版的弃用警告,与您的打包系统或发行版如何管理从单个包提供给定功能的版本到系统管理员需要知道安装多个包以获得相同功能的更高版本的阶段性过渡一致。

您可以通过从 CPAN 安装相关模块来消除这些弃用警告。要安装所有模块的最新版本,只需安装 Task::Deprecations::5_12

Class::ISA
Pod::Plainer
Shell
Switch

Switch 有 bug,应该避免使用。您可能会发现 Perl 的新 given/when 功能是一个合适的替代方案。有关更多信息,请参阅 "perlsyn 中的 Switch 语句"

对 $[ 的赋值
在子例程上使用 :locked 属性
在 attributes pragma 中使用 "locked"
在 attributes pragma 中使用 "unique"
Perl_pmflag

Perl_pmflag 不再是 Perl 公共 API 的一部分。现在调用它会生成弃用警告,并且将在将来的版本中删除。虽然列为 API 的一部分,但它从未被记录,并且仅在 toke.c 中使用,并且在 5.10 之前,在 regcomp.c 中使用。在核心代码中,它已被静态函数替换。

许多 Perl 4 时代的库

termcap.pltainted.plstat.plshellwords.plpwd.plopen3.plopen2.plnewgetopt.pllook.plfind.plfinddepth.plimportenv.plhostname.plgetopts.plgetopt.plgetcwd.plflush.plfastcwd.plexceptions.plctime.plcomplete.plcacheout.plbigrat.plbigint.plbigfloat.plassert.plabbrev.pldotsh.pltimelocal.pl 现在都已弃用。早些时候,Perl 的开发人员打算在 5.14.0 版本中从 Perl 的核心代码中删除这些库。

在 5.12.0 版本发布前的最终测试中,一些开发者发现当前生产代码使用了这些古老的库,其中一些位于 Perl 核心本身。因此,pumpking 允许它们继续使用。它们将在 5.14.0 版本中开始发出弃用警告,并在 5.16.0 版本中被移除。

Unicode 大修

Perl 的开发者已经付出了巨大的努力,将 Perl 更新为与最新的 Unicode 标准保持同步。为此做出的更改包括

Perl 现在可以处理所有 Unicode 字符属性。新的文档,perluniprops,列出了所有可用的非 Unihan 字符属性。默认情况下,perl 不会公开 Unihan、已弃用或 Unicode 内部属性。有关这些属性的更多详细信息,请参见下文;pod 中也有一节专门介绍它们,并解释了为什么它们没有被公开。

Perl 现在完全支持 Unicode 复合风格,在编写正则表达式时使用 =:\p{property=value}\p{property:value}(两者含义相同)。

Perl 现在完全支持 Unicode 松散匹配规则,用于 \p{...} 结构中大括号之间的文本。此外,Perl 允许数字之间使用下划线。

Perl 现在接受所有 Unicode 定义的属性和属性值的同义词。

qr/\X/ 匹配 Unicode 逻辑字符,已被扩展以更好地与各种亚洲语言配合使用。它现在被定义为一个 *扩展字形簇*。(参见 http://www.unicode.org/reports/tr29/)。以前匹配的任何内容,只要有意义,都会继续被接受。此外

否则,对于不受影响的语言,此更改应该是透明的。

\p{...} 使用 Canonical_Combining_Class 属性进行匹配在之前的 Perl 版本中完全失效。现在它们应该可以正常工作了。

在 Perl 5.12 之前,Unicode 的 Decomposition_Type=Compat 属性和一个 Perl 扩展名具有相同的名称,导致两者都没有匹配所有正确的值(一个有超过 100 个错误,另一个有数千个错误)。Perl 扩展名现在已重命名为 Decomposition_Type=Noncanonical(简写:dt=noncanon)。它与之前预期的含义相同,即所有非规范分解类型的并集,其中 Unicode Compat 只是其中之一。

\p{Decomposition_Type=Canonical} 现在包含了韩文字节。

\p{Uppercase}\p{Lowercase} 现在按照 Unicode 标准的要求工作。这意味着它们分别匹配比以前更多的字符。

\p{Cntrl} 现在匹配与 \p{Control} 相同的字符。这意味着它不再匹配私用区 (gc=co)、代理区 (gc=cs) 或格式 (gc=cf) 代码点。格式代码点代表了最大的潜在问题。除了 36 个之外,所有代码点要么正式弃用,要么强烈建议不要使用。在这 36 个中,最广泛使用的可能是软连字符 (U+00AD) 和 BOM、ZWSP、ZWNJ、WJ 以及类似字符,再加上双向控制字符。

\p{Alpha} 现在匹配与 \p{Alphabetic} 相同的字符。在 5.12 之前,Perl 的定义包含了一些实际上不是字母的东西(所有标记),同时省略了许多实际上是字母的东西。\p{Alnum}\p{Word} 的定义取决于 Alpha 的定义,并且相应地发生了变化。

\p{Word} 不再错误地匹配非单词字符,例如分数。

\p{Print} 不再匹配行控制字符:Tab、LF、CR、FF、VT 和 NEL。这使其与标准和文档保持一致。

\p{XDigit} 现在匹配与 \p{Hex_Digit} 相同的字符。这意味着除了它当前匹配的字符 [A-Fa-f0-9] 之外,它还将匹配 22 个全角等效字符,例如 U+FF10:全角数字零。

数字类型属性已扩展到包括统一汉字。

有一个新的 Perl 扩展,即“Present_In”或简称为“In”属性。这是 Unicode Age 属性的扩展,但 \p{In=5.0} 匹配任何在 Unicode 版本 5.0 截至 时已确定其用法的代码点。\p{Age=5.0} 仅匹配恰好在版本 5.0 中添加的代码点。

现在许多属性对未分配的代码点具有正确的值。受影响的属性包括 Bidi_Class、East_Asian_Width、Joining_Type、Decomposition_Type、Hangul_Syllable_Type、Numeric_Type 和 Line_Break。

Default_Ignorable_Code_Point、ID_Continue 和 ID_Start 属性现在已更新为最新的 Unicode 定义。

早期版本的 Perl 错误地暴露了一些应该仅供 Unicode 内部使用的属性。在正则表达式中使用这些属性现在将生成弃用警告消息(如果已启用)。这些属性包括:Other_Alphabetic、Other_Default_Ignorable_Code_Point、Other_Grapheme_Extend、Other_ID_Continue、Other_ID_Start、Other_Lowercase、Other_Math 和 Other_Uppercase。

现在可以在每个安装的基础上更改 Perl 理解的 Unicode 属性。如上所述,某些属性默认情况下处于关闭状态。这些包括所有 Unihan 属性(可以通过 CPAN 模块 Unicode::Unihan 访问)以及 Perl 从未暴露的任何已弃用或仅供 Unicode 内部使用的属性。

lib/unicore/To 目录中生成的文件现在更清楚地标记为稳定,可以直接由应用程序使用。其中的新哈希条目给出了普通条目的格式,这使得机器解析更容易。Perl 可以为任何属性生成此目录中的文件,尽管大多数文件被抑制。您可以在 perluniprops 中找到更改哪些属性的说明。

模块和语义

新模块和语义

autodie

autodieFatal 模块的一种新的词法作用域替代方案。捆绑版本为 2.06_01。请注意,在此版本中,当 autodie 生效时使用字符串 eval 会导致 autodie 行为泄漏到周围作用域。有关更多详细信息,请参阅 "autodie 中的错误"

版本 2.06_01 已添加到 Perl 核心。

Compress::Raw::Bzip2

版本 2.024 已添加到 Perl 核心。

overloading

overloading 允许您在词法作用域内禁用或启用某些或所有操作的重载。

版本 0.001 已添加到 Perl 核心。

parent

parent 在编译时与基类建立 ISA 关系。它提供了 base 的关键功能,而不会产生其他不必要的行为。

版本 0.223 已添加到 Perl 核心。

Parse::CPAN::Meta

版本 1.40 已添加到 Perl 核心。

VMS::DCLsym

版本 1.03 已添加到 Perl 核心。

VMS::Stdio

版本 2.4 已添加到 Perl 核心。

XS::APItest::KeywordRPN

Perl 核心已添加版本 0.003。

更新的语义

base

从版本 2.13 升级到 2.15。

bignum

从版本 0.22 升级到 0.23。

charnames

charnames 现在包含 Unicode NameAliases.txt 数据库文件。这将添加一些额外的 \N 字符名称,这些名称以前无法识别;例如,"\N{LATIN CAPITAL LETTER GHA}"

从版本 1.06 升级到 1.07。

constant

从版本 1.13 升级到 1.20。

diagnostics

diagnostics 现在内部支持 %.0f 格式化。

diagnostics 不再抑制 Use of uninitialized value in range (or flip) 警告。[perl #71204]

从版本 1.17 升级到 1.19。

feature

feature 中,:5.10:5.10.X 特性包的含义略有变化。最后一个组件(如果有)(即 X)将被简单地忽略。这是基于这样的假设:新特性通常不会添加到维护版本中。因此,:5.10:5.10.X 具有相同的效果。这是对 5.10.0 文档中行为的更改。

feature 现在包含 unicode_strings 特性

use feature "unicode_strings";

此语义为不设置内部 UTF-8 标志但包含 128 到 255 之间的单字节字符的字符串的区分大小写操作(uclcucfirstlcfirst)启用 Unicode 语义。

从版本 1.11 升级到 1.16。

less

less 现在包含 stash_name 方法,允许 less 的子类选择在 %^H 中存储其存储的位置。

从版本 0.02 升级到 0.03。

lib

从版本 0.5565 升级到 0.62。

mro

mro 现在作为 XS 扩展实现。文档化的接口没有改变。依赖于某些 mro:: 方法始终可用的实现细节的代码可以“保留两部分”。

从版本 1.00 升级到 1.02。

overload

overload 现在允许对 'qr' 进行重载。

从版本 1.06 升级到 1.10。

threads

从版本 1.67 升级到 1.75。

threads::shared

从版本 1.14 升级到 1.32。

version

version 现在支持 "版本号格式",如本文档前面和其自身文档中所述。

从版本 0.74 升级到 0.82。

warnings

warnings 有一个新的 warnings::fatal_enabled() 函数。它还包含一个新的 illegalproto 警告类别。有关此更改,另请参见 "新的或更改的诊断"

从版本 1.06 升级到 1.09。

更新的模块

Archive::Extract

从版本 0.24 升级到 0.38。

Archive::Tar

从版本 1.38 升级到 1.54。

Attribute::Handlers

从版本 0.79 升级到 0.87。

AutoLoader

从版本 5.63 升级到 5.70。

B::Concise

从版本 0.74 升级到 0.78。

B::Debug

从版本 1.05 升级到 1.12。

B::Deparse

从版本 0.83 升级到 0.96。

B::Lint

从版本 1.09 升级到 1.11_01。

CGI

从版本 3.29 升级到 3.48。

Class::ISA

从版本 0.33 升级到 0.36。

注意:Class::ISA 已弃用,可能会从 Perl 的未来版本中删除。

Compress::Raw::Zlib

从版本 2.008 升级到 2.024。

CPAN

从版本 1.9205 升级到 1.94_56。

CPANPLUS

从版本 0.84 升级到 0.90。

CPANPLUS::Dist::Build

从版本 0.06_02 升级到 0.46。

Data::Dumper

从版本 2.121_14 升级到 2.125。

DB_File

从版本 1.816_1 升级到 1.820。

Devel::PPPort

从版本 3.13 升级到 3.19。

Digest

从版本 1.15 升级到 1.16。

Digest::MD5

从版本 2.36_01 升级到 2.39。

Digest::SHA

从版本 5.45 升级到 5.47。

Encode

从版本 2.23 升级到 2.39。

Exporter

从版本 5.62 升级到 5.64_01。

ExtUtils::CBuilder

从版本 0.21 升级到 0.27。

ExtUtils::Command

从版本 1.13 升级到 1.16。

ExtUtils::Constant

从版本 0.2 升级到 0.22。

ExtUtils::Install

从版本 1.44 升级到 1.55。

ExtUtils::MakeMaker

从版本 6.42 升级到 6.56。

ExtUtils::Manifest

从版本 1.51_01 升级到 1.57。

ExtUtils::ParseXS

从版本 2.18_02 升级到 2.21。

File::Fetch

从版本 0.14 升级到 0.24。

File::Path

从版本 2.04 升级到 2.08_01。

File::Temp

从版本 0.18 升级到 0.22。

Filter::Simple

从版本 0.82 升级到 0.84。

Filter::Util::Call

从版本 1.07 升级到 1.08。

Getopt::Long

从版本 2.37 升级到 2.38。

IO

从版本 1.23_01 升级到 1.25_02。

IO::Zlib

从版本 1.07 升级到 1.10。

IPC::Cmd

从版本 0.40_1 升级到 0.54。

IPC::SysV

从版本 1.05 升级到 2.01。

Locale::Maketext

从版本 1.12 升级到 1.14。

Locale::Maketext::Simple

从版本 0.18 升级到 0.21。

Log::Message

从版本 0.01 升级到 0.02。

Log::Message::Simple

从版本 0.04 升级到 0.06。

Math::BigInt

从版本 1.88 升级到 1.89_01。

Math::BigInt::FastCalc

从版本 0.16 升级到 0.19。

Math::BigRat

从版本 0.21 升级到 0.24。

Math::Complex

从版本 1.37 升级到 1.56。

Memoize

从版本 1.01_02 升级到 1.01_03。

MIME::Base64

从版本 3.07_01 升级到 3.08。

Module::Build

从版本 0.2808_01 升级到 0.3603。

Module::CoreList

从版本 2.12 升级到 2.29。

Module::Load

从版本 0.12 升级到 0.16。

Module::Load::Conditional

从版本 0.22 升级到 0.34。

Module::Loaded

从版本 0.01 升级到 0.06。

Module::Pluggable

从版本 3.6 升级到 3.9。

Net::Ping

从版本 2.33 升级到 2.36。

NEXT

从版本 0.60_01 升级到 0.64。

Object::Accessor

从版本 0.32 升级到 0.36。

Package::Constants

从版本 0.01 升级到 0.02。

PerlIO

从版本 1.04 升级到 1.06。

Pod::Parser

从版本 1.35 升级到 1.37。

Pod::Perldoc

从版本 3.14_02 升级到 3.15_02。

Pod::Plainer

从版本 0.01 升级到 1.02。

注意:Pod::Plainer 已被弃用,可能会从 Perl 的未来版本中删除。

Pod::Simple

从版本 3.05 升级到 3.13。

Safe

从版本 2.12 升级到 2.22。

SelfLoader

从版本 1.11 升级到 1.17。

Storable

从版本 2.18 升级到 2.22。

Switch

从版本 2.13 升级到 2.16。

注意:Switch 已被弃用,可能会从 Perl 的未来版本中删除。

Sys::Syslog

从版本 0.22 升级到 0.27。

Term::ANSIColor

从版本 1.12 升级到 2.02。

Term::UI

从版本 0.18 升级到 0.20。

Test

从版本 1.25 升级到 1.25_02。

Test::Harness

从版本 2.64 升级到 3.17。

Test::Simple

从版本 0.72 升级到 0.94。

Text::Balanced

从版本 2.0.0 升级到 2.02。

Text::ParseWords

从版本 3.26 升级到 3.27。

Text::Soundex

从版本 3.03 升级到 3.03_01。

Thread::Queue

从版本 2.00 升级到 2.11。

Thread::Semaphore

从版本 2.01 升级到 2.09。

Tie::RefHash

从版本 1.37 升级到 1.38。

Time::HiRes

从版本 1.9711 升级到 1.9719。

Time::Local

从版本 1.18 升级到 1.1901_01。

Time::Piece

从版本 1.12 升级到 1.15。

Unicode::Collate

从版本 0.52 升级到 0.52_01。

Unicode::Normalize

从版本 1.02 升级到 1.03。

Win32

从版本 0.34 升级到 0.39。

Win32API::File

从版本 0.1001_01 升级到 0.1101。

XSLoader

从版本 0.08 升级到 0.10。

已移除的模块和语义

attrs

已从 Perl 核心移除。先前版本为 1.02。

CPAN::API::HOWTO

已从 Perl 核心移除。先前版本为 'undef'。

CPAN::DeferedCode

已从 Perl 核心移除。先前版本为 5.50。

CPANPLUS::inc

已从 Perl 核心移除。先前版本为 'undef'。

DCLsym

已从 Perl 核心移除。先前版本为 1.03。

ExtUtils::MakeMaker::bytes

已从 Perl 核心移除。先前版本为 6.42。

ExtUtils::MakeMaker::vmsish

已从 Perl 核心移除。先前版本为 6.42。

Stdio

已从 Perl 核心移除。先前版本为 2.3。

Test::Harness::Assert

已从 Perl 核心移除。先前版本为 0.02。

Test::Harness::Iterator

已从 Perl 核心移除。先前版本为 0.02。

Test::Harness::Point

已从 Perl 核心移除。先前版本为 0.01。

Test::Harness::Results

已从 Perl 核心移除。先前版本为 0.01。

Test::Harness::Straps

已从 Perl 核心移除。先前版本为 0.26_01。

Test::Harness::Util

已从 Perl 核心移除。先前版本为 0.01。

XSSymSet

已从 Perl 核心移除。先前版本为 1.1。

已弃用的模块和语义

参见上面 "已弃用的模块"

文档

新文档

现有文档的更改

选定的性能增强

安装和配置改进

内部更改

每个版本的 Perl 都会进行大量内部更改,这些更改不会影响日常使用,但对于使用 Perl 源代码的开发人员来说可能仍然值得注意。

测试

测试改进

并行测试

核心发行版现在可以在类 Unix 平台上并行运行其回归测试。而不是运行 make test,在您的环境中设置 TEST_JOBS 为要并行运行的测试数量,然后运行 make test_harness。在类 Bourne 的 shell 上,这可以通过以下方式完成

TEST_JOBS=3 make test_harness  # Run 3 tests in parallel

使用环境变量而不是并行 make 本身,因为 TAP::Harness 需要能够自行调度单个无冲突的测试脚本,并且没有与 make 实用程序交互以与其作业调度程序交互的标准接口。

请注意,目前某些测试脚本在并行运行时可能会失败(最明显的是ext/IO/t/io_dir.t)。如有必要,请再次按顺序运行失败的脚本,看看是否可以解决问题。

测试工具灵活性

现在可以在t/TEST中覆盖PERL5OPT及其相关变量。

测试看门狗

一些可能在失败时无限期挂起的测试现在包含了“看门狗”功能,该功能会在超时后杀死这些测试,这有助于确保make testmake test_harness自动运行完成。

新增测试

Perl 开发人员在核心代码中添加了许多新的测试。除了下面列出的内容外,许多从 CPAN 更新的模块也包含新的测试。

新的或更改的诊断信息

新的诊断信息

更改的诊断信息

许多现有的诊断消息已得到改进或更正

以下诊断消息已删除

实用程序更改

选定的错误修复

平台特定更改

Perl 具有极高的可移植性。一般来说,如果一个平台有 C 编译器,那么有人已经将 Perl 移植到它(或者很快就会移植)。我们很高兴地宣布 Perl 5.12 包含对几个新平台的支持。同时,也是时候告别一些(非常)老朋友了。

新平台

Haiku

Perl 的开发人员已经合并了来自 Haiku 维护者的补丁。Perl 现在应该可以在 Haiku 上构建。

MirOS BSD

Perl 现在应该可以在 MirOS BSD 上构建。

已停产平台

域/操作系统
MiNT
Tenon MachTen

更新的平台

AIX
  • 已为 AIX 5L 和 6.1 删除 libbsd。仅从 libbsd 使用 flock()

  • 如果安装了 libgdbm < 1.8.3-5,则已为 AIX 5L 和 6.1 删除 libgdbmlibgdbm 作为 AIX 工具箱中的可选包提供。不幸的是,低于 1.8.3-5 的版本已损坏。

  • 提示更改意味着 AIX 4.2 应该可以再次工作。

Cygwin
  • Perl 现在支持 Cygwin 1.7 及更高版本上的 IPv6。

  • 在 Cygwin 上,我们现在从 DLL 中删除最后一个数字。多年来,cygwin.com 构建一直是这种行为。提示文件已更新。

Darwin (Mac OS X)
  • 跳过在 Darwin 10 (Mac OS X 10.6) 上测试 be_BY.CP1131 本地化,因为它仍然存在错误。

  • 更正用于识别 Darwin 8 和 9 (分别为 Mac OS X 10.4 和 10.5) 上有错误的本地化的正则表达式中的不当之处。

DragonFly BSD
  • 修复线程库选择 [perl #69686]

FreeBSD
  • 提示文件现在识别 FreeBSD 7 及更高版本上的正确线程库。

Irix
  • 我们现在解决 Irix 6.5 编译器中一个奇怪的预处理器错误:cc -E - 不幸地进入了 K&R 模式,但 cc -E file.c 却没有。

NetBSD
  • 提示现在支持 5.* 版本。

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

    就像它在其他地方已经存在了很长时间一样。还在 configure.com 中使命令行选择 -UDEBUGGING 和 -DDEBUGGING 工作;之前唯一关闭它的方法是在回答交互式问题时说不。

  • VMS 上的默认管道缓冲区大小已在 64 位系统上更新为 8192。

  • 如果 $/ 设置为数字引用(表示记录样式读取),则从 PerlIO::scalar 的内存中临时文件读取将失败。现在已修复。

  • VMS 现在支持 getgrgid

  • 对 VMS 文件名处理和转换代码进行了许多改进和清理。

  • 启用 PERL_VMS_POSIX_EXIT 逻辑名称现在将在 VMS 条件值中编码 POSIX 退出状态,以便更好地与 GNV 的 bash shell 和其他依赖于 POSIX 退出值的实用程序进行交互。有关详细信息,请参阅 "$?" in perlvms

  • File::Copy 现在检测 VMS 上的 Unix 兼容模式。

Stratus VOS
  • 已合并来自 Stratus 的各种更改。

Symbian
  • 现在支持 Symbian S60 3.2 SDK 和 S60 5.0 SDK。

Windows
  • Perl 5.12 支持 Windows 2000 及更高版本。对旧版 Windows 的支持代码仍然包含在内,但将在下一个开发周期中删除。

  • 现在可以使用 MinGW-w64 构建 Perl 的初始支持。

  • perl.exe 现在包含一个清单资源,用于指定 Windows Vista 及更高版本的 trustInfo 设置。没有此设置,Windows 会将 perl.exe 视为旧版应用程序,并应用各种启发式方法,例如将对受保护文件系统区域(如“Program Files”文件夹)的访问重定向到用户的“VirtualStore”,而不是生成适当的“权限被拒绝”错误。

    清单资源还请求 Microsoft 公共控件版本 6.0(Windows XP 中引入的主题控件)。查看 CPAN 上的 Win32::VisualStyles 模块,以切换回旧样式的非主题控件,以用于旧版应用程序。

  • -t 文件测试运算符现在仅在文件句柄连接到控制台窗口时才返回 true。在以前的 Perl 版本中,它将对所有字符模式设备返回 true,包括 NULLPT1

  • -p 文件测试运算符现在可以正常工作,并且在 Perl 使用 Microsoft Visual C 编译时定义了 Fcntl::S_IFIFO 常量。在以前的 Perl 版本中,-p 始终返回 false 值,并且未定义 Fcntl::S_IFIFO 常量。

    此错误特定于 Microsoft Visual C,并且从未影响使用 MinGW 构建的 Perl 二进制文件。

  • 套接字错误代码现在得到更广泛的支持:POSIX 模块将定义符号名称,如 POSIX::EWOULDBLOCK,并且 $! 中的套接字错误代码的字符串化现在也可以正常工作;

    C:\>perl -MPOSIX -E "$!=POSIX::EWOULDBLOCK; say $!"
    A non-blocking socket operation could not be completed immediately.
  • flock() 现在将在 $! 中设置合理的错误代码。以前的 Perl 版本将 $^E 的值复制到 $! 中,这造成了很多混乱。

  • select() 现在更正确地支持所有空 fd_set

  • '.\foo''..\foo'dorequire 中的处理方式与 './foo''../foo' 不同 [RT #63492]。

  • 改进的消息窗口处理意味着alarmkill消息在竞争条件下将不再被丢弃。

  • Perl 的构建基础设施的各个部分在发布时不再转换为 win32 行尾。如果这对你造成了困扰,请使用 perl 中包含的 perlbug 程序报告问题。

已知问题

这是一个关于一些重要的未修复错误的列表,这些错误是相对于 5.10.x 或 5.8.x 的回归。

勘误

致谢

Perl 5.12.0 代表了自 Perl 5.10.0 以来大约两年的开发,包含了来自 200 多位作者和提交者的 3000 多个文件中的 750,000 多行更改。

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

Aaron Crane, Abe Timmerman, Abhijit Menon-Sen, Abigail, Adam Russell, Adriano Ferreira, Ævar Arnfjörð Bjarmason, Alan Grover, Alexandr Ciornii, Alex Davies, Alex Vandiver, Andreas Koenig, Andrew Rodland, [email protected], Andy Armstrong, Andy Dougherty, Jose AUGUSTE-ETIENNE, Benjamin Smith, Ben Morrow, bharanee rathna, Bo Borgerson, Bo Lindbergh, Brad Gilbert, Bram, Brendan O'Dea, brian d foy, Charles Bailey, Chip Salzenberg, Chris 'BinGOs' Williams, Christoph Lamprecht, Chris Williams, chromatic, Claes Jakobsson, Craig A. Berry, Dan Dascalescu, Daniel Frederick Crisman, Daniel M. Quinlan, Dan Jacobson, Dan Kogai, Dave Mitchell, Dave Rolsky, David Cantrell, David Dick, David Golden, David Mitchell, David M. Syzdek, David Nicol, David Wheeler, Dennis Kaarsemaker, Dintelmann, Peter, Dominic Dunlop, Dr.Ruud, Duke Leto, Enrico Sorcinelli, Eric Brine, Father Chrysostomos, Florian Ragwitz, Frank Wiegand, Gabor Szabo, Gene Sullivan, Geoffrey T. Dairiki, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Graham Barr, Green, Paul, Hans Dieter Pearcey, Harmen, H. Merijn Brand, Hugo van der Sanden, Ian Goodacre, Igor Sutton, Ingo Weinhold, James Bence, James Mastros, Jan Dubois, Jari Aalto, Jarkko Hietaniemi, Jay Hannah, Jerry Hedden, Jesse Vincent, Jim Cromie, Jody Belka, John E. Malmberg, John Malmberg, John Peacock, John Peacock via RT, John P. Linderman, John Wright, Josh ben Jore, Jos I. Boumans, Karl Williamson, Kenichi Ishigaki, Ken Williams, Kevin Brintnall, Kevin Ryde, Kurt Starsinic, Leon Brocard, Lubomir Rintel, Luke Ross, Marcel Grünauer, Marcus Holland-Moritz, Mark Jason Dominus, Marko Asplund, Martin Hasch, Mashrab Kuvatov, Matt Kraai, Matt S Trout, Max Maischein, Michael Breen, Michael Cartmell, Michael G Schwern, Michael Witten, Mike Giroux, Milosz Tanski, Moritz Lenz, Nicholas Clark, Nick Cleaton, Niko Tyni, Offer Kaye, Osvaldo Villalon, Paul Fenwick, Paul Gaborit, Paul Green, Paul Johnson, Paul Marquess, Philip Hazel, Philippe Bruhat, Rafael Garcia-Suarez, Rainer Tammer, Rajesh Mandalemula, Reini Urban, Renée Bäcker, Ricardo Signes, Ricardo SIGNES, Richard Foley, Rich Rauenzahn, Rick Delaney, Risto Kankkunen, Robert May, Roberto C. Sanchez, Robin Barker, SADAHIRO Tomoyuki, Salvador Ortiz Garcia, Sam Vilain, Scott Lanning, Sébastien Aperghis-Tramoni, Sérgio Durigan Júnior, Shlomi Fish, Simon 'corecode' Schubert, Sisyphus, Slaven Rezic, Smylers, Steffen Müller, Steffen Ullrich, Stepan Kasal, Steve Hay, Steven Schubiger, Steve Peters, Tels, The Doctor, Tim Bunce, Tim Jenness, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tom Wyant, Tony Cook, Torsten Schoenfeld, Tye McQueen, Vadim Konovalov, Vincent Pit, Hio YAMASHINA, Yasuhiro Matsumoto, Yitzchak Scott-Thoennes, Yuval Kogman, Yves Orton, Zefram, Zsban Ambrus

这非常不完整,因为它是由版本控制历史自动生成的。特别是,它不包括报告了先前版本 Perl 中的问题的贡献者(非常感谢)的姓名,这些问题帮助使 Perl 5.12.0 变得更好。有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 5.12.0 发行版中的 AUTHORS 文件。

我们的“退休”南瓜王 Nicholas Clark 和 Rafael Garcia-Suarez 由于他们杰出而实质性的持续贡献而值得特别感谢。Nicholas 个人编写了自 5.10.0 以来超过 30% 的补丁。Rafael 在补丁作者中排名第二,占 11%,但在提交他人编写的补丁方面遥遥领先,推动了自 5.10.0 以来 44% 的提交,通常是在为补丁作者提供了大量指导之后。这些统计数据绝不包含他们所有的贡献,但简而言之,我们离不开他们。

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

报告错误

如果您发现您认为是错误,您可能需要查看最近发布到 comp.lang.perl.misc 新闻组的文章和 Perl 错误数据库,地址为 http://rt.perl.org/perlbug/。您也可以在 Perl 主页 https://www.perl5.cn/ 上找到相关信息。

如果您认为您遇到了一个未报告的错误,请运行您发布版本中包含的 perlbug 程序。请确保将您的错误缩减为一个微小但足够完整的测试用例。您的错误报告以及 perl -V 的输出将被发送到 [email protected],由 Perl 移植团队进行分析。

如果您要报告的错误涉及安全问题,不适合发送到公开存档的邮件列表,请将其发送到 [email protected]。此地址指向一个封闭订阅的未存档邮件列表,其中包括所有核心提交者,他们将能够帮助评估问题的影響,找出解决方案,并帮助协调在所有支持 Perl 的平台上发布补丁以减轻或修复问题。请仅将此地址用于 Perl 核心中的安全问题,不要用于在 CPAN 上独立分发的模块。

另请参阅

Changes 文件,了解如何查看有关更改的详尽信息。

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

README 文件,了解一般信息。

ArtisticCopying 文件,了解版权信息。

https://dev.perl5.cn/perl5/errata.html,列出了此版本发布后发现的问题,以及已知与此版本不兼容的 CPAN 模块列表。