内容

名称

perl5180delta - perl v5.18.0 的新增功能

描述

本文档描述了 v5.16.0 版本和 v5.18.0 版本之间的差异。

如果您从较早的版本(例如 v5.14.0)升级,请先阅读 perl5160delta,其中描述了 v5.14.0 和 v5.16.0 之间的差异。

核心增强功能

实验性功能的新机制

新添加的实验性功能现在需要此咒语

no warnings "experimental::feature_name";
use feature "feature_name";  # would warn without the prev line

有一个新的警告类别,称为“experimental”,其中包含 feature pragma 在启用实验性功能时发出的警告。

新添加的实验性功能也将被赋予特殊的警告 ID,这些 ID 由“experimental::”后跟功能名称组成。(计划最终将此机制扩展到所有警告,以允许它们被单独启用或禁用,而不仅仅是按类别。)

通过说

no warnings "experimental::feature_name";

您将对未来对该功能的更改或删除可能导致的任何损坏负责。

由于某些功能(如 ~~my $_)现在发出实验性警告,并且您可能希望在也运行在不识别这些警告类别的 perl 上的代码中禁用它们,请考虑使用 if pragma,如下所示

no if $] >= 5.018, warnings => "experimental::feature_name";

现有的实验性功能也可能开始发出这些警告。请参阅 perlexperiment 以了解哪些功能被认为是实验性的。

哈希大修

perl v5.18.0 中对哈希实现的更改将是现有代码行为最明显的更改之一。

默认情况下,具有相同键和值的两个不同的哈希变量现在可能以不同的顺序提供其内容,而以前是相同的。

在遇到这些更改时,清理它们的秘诀是接受 **哈希是无序集合** 并相应地采取行动。

哈希随机化

Perl 的哈希函数使用的种子现在是随机的。这意味着从 keys()values()each() 等函数返回的键/值顺序将在每次运行时有所不同。

引入此更改是为了使 Perl 的哈希对算法复杂性攻击更加健壮,并且还因为我们发现它暴露了哈希排序依赖性错误,并使它们更容易追踪。

工具链维护者可能希望投资额外的基础设施来测试此类问题。多次连续运行测试,然后比较结果将使发现代码中的哈希顺序依赖性变得更容易。强烈建议作者不要将 Perl 哈希的键顺序暴露给不安全的受众。

此外,每个哈希都有自己的迭代顺序,这应该会使确定当前哈希种子变得更加困难。

新的哈希函数

Perl v5.18 包含对多个哈希函数的支持,并更改了默认值(为 ONE_AT_A_TIME_HARD),您可以在编译时定义一个符号来选择不同的算法。有关当前列表,请参阅INSTALL 文档。请注意,从 Perl v5.18 开始,我们只能推荐使用默认值或 SIPHASH。所有其他算法都已知存在安全问题,仅供研究使用。

PERL_HASH_SEED 环境变量现在接受十六进制值

PERL_HASH_SEED 不再接受整数作为参数;相反,该值应为以十六进制字符串编码的二进制值,例如“0xf5867c55039dc724”。这是为了使基础设施支持任意长度的哈希种子,这可能超过整数的长度。(SipHash 使用 16 字节种子。)

添加了 PERL_PERTURB_KEYS 环境变量

PERL_PERTURB_KEYS 环境变量允许您控制应用于 keys 及其朋友的随机化级别。

PERL_PERTURB_KEYS 为 0 时,perl 不会对键顺序进行任何随机化。由于插入而导致 keys 更改的可能性与以前的 perl 相同,基本上只有在桶大小发生更改时才会发生。

PERL_PERTURB_KEYS 为 1 时,perl 将以不可重复的方式对键进行随机化。由于插入而导致 keys 更改的可能性非常高。这是最安全且默认的模式。

PERL_PERTURB_KEYS 为 2 时,perl 将以可重复的方式对键进行随机化。相同程序的重复运行应每次产生相同的输出。

PERL_HASH_SEED 意味着非默认的 PERL_PERTURB_KEYS 设置。将 PERL_HASH_SEED 设置为 0(正好一个 0)意味着 PERL_PERTURB_KEYS=0(哈希键随机化已禁用);将 PERL_HASH_SEED 设置为任何其他值意味着 PERL_PERTURB_KEYS=2(确定性和可重复的哈希键随机化)。显式地将 PERL_PERTURB_KEYS 指定为不同的级别将覆盖此行为。

Hash::Util::hash_seed() 现在返回一个字符串

Hash::Util::hash_seed() 现在返回字符串而不是整数。这是为了让基础设施支持任意长度的哈希种子,这些种子可能超过整数的长度。(SipHash 使用 16 字节的种子。)

PERL_HASH_SEED_DEBUG 的输出已更改

环境变量 PERL_HASH_SEED_DEBUG 现在使 perl 显示 perl 使用的哈希函数,以及该进程使用的种子(以十六进制表示)。解析此输出的代码(如果存在)必须更改以适应新的格式。新格式示例

$ PERL_HASH_SEED_DEBUG=1 ./perl -e1
HASH_FUNCTION = MURMUR3 HASH_SEED = 0x1476bb9f

升级到 Unicode 6.2

Perl 现在支持 Unicode 6.2。Unicode 6.1 的更改列表位于 http://www.unicode.org/versions/Unicode6.2.0

字符名称别名现在可以包含非 Latin1 范围字符

您可以为字符定义自己的名称,以便在 \N{...}charnames::vianame() 等中使用。这些名称现在可以包含来自整个 Unicode 范围的字符。这允许名称使用您的母语,而不仅仅是英语。某些限制适用于可使用的字符(例如,您不能定义包含标点的名称)。请参阅 "charnames 中的自定义别名"

新的 DTrace 探针

已添加以下新的 DTrace 探针

${^LAST_FH}

此新变量提供对最后读取的文件句柄的访问。这是 $. 以及 telleof(无参数)使用的句柄。

正则表达式集合运算

这是一个实验性功能,允许匹配代码点集合的并集、交集等,类似于 Unicode::Regex::Set。它也可以用于将 /x 处理扩展到 [方括号] 字符类,并作为用户定义属性的替代,允许比它们更复杂的表达式。请参阅 "perlrecharclass 中的扩展方括号字符类"

词法子例程

此新功能仍被视为实验性。要启用它

use 5.018;
no warnings "experimental::lexical_subs";
use feature "lexical_subs";

您现在可以使用 state sub foomy sub fooour sub foo 声明子例程。(state sub 要求启用“state”功能,除非您将其写为 CORE::state sub foo。)

state sub 创建一个在声明它的词法作用域内可见的子例程。该子例程在对外部子例程的调用之间共享。

my sub 声明一个词法子例程,该子例程在每次进入封闭块时都会被创建。state sub 通常比 my sub 稍微快一些。

our sub 声明一个指向同名包子例程的词法别名。

有关更多信息,请参阅 "perlsub 中的词法子例程"

计算标签

循环控制 nextlastredo,以及特殊的 dump 运算符,现在允许使用任意表达式在运行时计算标签。以前,任何不是常量的参数都被视为空字符串。

更多 CORE:: 子例程

一些内置函数已作为子例程添加到 CORE:: 命名空间中 - 具体来说,那些不可覆盖的关键字,它们可以在没有自定义解析器的情况下实现:defineddeleteexistsglobposprototypescalarsplitstudyundef

由于其中一些具有原型,prototype('CORE::...') 已更改为不再区分可覆盖和不可覆盖的关键字。这是为了使 prototype('CORE::pos')prototype(&CORE::pos) 保持一致。

使用负信号名称的 kill

kill 一直允许使用负信号编号,它会杀死进程组而不是单个进程。它也允许使用信号名称。但它没有一致的行为,因为负信号名称被视为 0。现在支持负信号名称,例如 -INT,并且与 -2 的处理方式相同 [perl #112990]。

安全

另请参阅:哈希大修

哈希大修 中进行的一些更改是为了增强安全性。请阅读该部分。

Storable 文档中的安全警告

Storable 的文档现在包含一个部分,警告读者接受来自不可信来源的 Storable 文档的危险。简而言之,反序列化某些类型的数据会导致加载模块和其他代码执行。这是有记录的行为,也是想要的行为,但这为恶意实体打开了攻击途径。

Locale::Maketext 允许通过恶意模板进行代码注入

如果用户可以向 Locale::Maketext 提供翻译字符串,则可以使用它来调用当前进程中可用的任意 Perl 子例程。

这个问题已经修复,但仍然可以调用 Locale::Maketext 本身或您正在使用的子类提供的任何方法。这些方法中的一个将依次调用 Perl 内核的 sprintf 子例程。

总之,允许用户在未审核的情况下提供翻译字符串是一个坏主意。

此漏洞记录在 CVE-2012-6329 中。

避免使用负数调用 memset

编写不良的 perl 代码,允许攻击者为 perl 的 x 字符串重复运算符指定计数,已经可以导致内存耗尽拒绝服务攻击。perl v5.15.5 之前的版本中的一个缺陷会导致这种情况升级为堆缓冲区溢出;与 2.16 之前的 glibc 版本结合使用,它可能允许执行任意代码。

针对此提交解决的缺陷已分配标识符 CVE-2012-5195,由 Tim Brown 研究。

不兼容的更改

另请参阅:哈希大修

哈希大修中的一些更改与以前版本的 perl 不完全兼容。请阅读该部分。

\N{...} 中的未知字符名称现在是语法错误

以前,它会发出警告,并替换 Unicode 替换字符。Unicode 现在建议这种情况是语法错误。此外,以前的行为会导致一些令人困惑的警告和行为,并且由于替换字符除了作为某些未知字符的替身之外没有其他用途,因此任何存在此问题代码都是有错误的。

\N{} 字符名称别名中以前已弃用的字符现在是错误。

从 v5.12.0 开始,在用户定义的 \N{...} 字符名称中使用某些字符已被弃用。这些字符现在会导致语法错误。例如,现在以数字开头的名称是错误的,例如

my $undraftable = "\N{4F}";    # Syntax error!

或者在名称中包含逗号。请参阅 "charnames 中的 CUSTOM ALIASES"

\N{BELL} 现在指的是 U+1F514 而不是 U+0007

Unicode 6.0 将 "BELL" 这个名称重新用于与传统含义不同的代码点。从 Perl v5.14 开始,使用这个名称仍然指的是 U+0007,但会发出弃用警告。现在,"BELL" 指的是 U+1F514,而 U+0007 的名称是 "ALERT"。charnames 中的所有函数都已相应更新。

正则表达式方括号字符类中多字符不区分大小写匹配的新限制

Unicode 现在已撤回其先前关于正则表达式自动处理单个字符不区分大小写匹配多个字符的建议,例如,字母 LATIN SMALL LETTER SHARP S 和序列 ss。这是因为事实证明,在所有情况下正确执行此操作是不切实际的。由于 Perl 尽其所能尝试执行此操作,因此它将继续这样做。(我们正在考虑一个将其关闭的选项。)但是,当此类匹配发生在 [方括号] 字符类中时,将添加一个新的限制。人们指定了诸如 /[\0-\xff]/i 之类的内容,并对它匹配两个字符序列 ss 感到惊讶(因为 LATIN SMALL LETTER SHARP S 出现在此范围内)。这种行为也与使用属性而不是范围不一致:\p{Block=Latin1} 也包含 LATIN SMALL LETTER SHARP S,但 /[\p{Block=Latin1}]/i 不匹配 ss。新规则是,要在一个方括号字符类中进行多字符不区分大小写匹配,该字符必须明确列出,而不是作为范围的端点。这更符合最小惊奇原则。请参阅 "perlrecharclass 中的方括号字符类"。请注意,一个错误 [perl #89774],现在已作为此更改的一部分修复,阻止了先前行为完全正常工作。

变量名和标识符的明确规则

由于疏忽,v5.16 中的单字符变量名完全不受限制。这为各种疯狂行为打开了大门。从 v5.18 开始,这些变量名现在遵循其他标识符的规则,此外还接受与 \p{POSIX_Punct} 属性匹配的字符。

使用大括号和不使用大括号指定标识符的解析方式不再有任何区别。例如,perl 以前允许使用 ${foo:bar}(带单个冒号),但不允许使用 $foo:bar。现在,由于两者都由单个代码路径处理,因此它们都以相同的方式处理:两者都被禁止。请注意,此更改是关于允许的文字标识符范围,而不是其他表达式。

垂直制表符现在是空白符

没有人能回忆起为什么 \s 不匹配 \cK(垂直制表符)。现在它匹配了。鉴于该字符的极端稀有性,预计很少出现故障。也就是说,以下是它的含义

在正则表达式中,\s 现在在所有情况下都匹配垂直制表符。

当使用 /x 修饰符时,正则表达式文字中的文字垂直制表符将被忽略。

当将字符串解释为数字时,单独的或与其他空白符混合的领先垂直制表符现在将被忽略。例如

$dec = " \cK \t 123";
$hex = " \cK \t 0xF";

say 0 + $dec;   # was 0 with warning, now 123
say int $dec;   # was 0, now 123
say oct $hex;   # was 0, now  15

/(?{})//(??{})/ 已被彻底修改

此功能的实现已几乎完全重写。虽然其主要目的是修复错误,但某些行为(尤其是与词法变量范围相关的行为)将发生变化。这将在 "选定的错误修复" 部分中更详细地描述。

更严格的替换替换解析

不再可能像这样滥用解析器解析 s///e 的方式

%_=(_,"Just another ");
$_="Perl hacker,\n";
s//_}->{_/e;print

given 现在为全局 $_ 创建别名

given 现在不再分配给隐式词法 $_,而是使全局 $_ 成为其参数的别名,就像 foreach 一样。但是,如果作用域中存在词法 $_,它仍然使用词法 $_(同样,就像 foreach 一样)[perl #114020]。

智能匹配功能系列现在处于实验阶段

智能匹配是在 v5.10.0 中添加的,并在 v5.10.1 中进行了重大修改,一直是经常抱怨的点。虽然它在很多方面都很有用,但它也被证明对 Perl 的用户和实现者来说存在问题和令人困惑。关于如何最好地解决这个问题,已经提出了很多建议。很明显,智能匹配几乎肯定会改变或在将来消失。不建议依赖其当前行为。

当解析器看到 ~~givenwhen 时,现在将发出警告。要禁用这些警告,可以在适当的作用域中添加以下行

no if $] >= 5.018, warnings => "experimental::smartmatch";

不过,请考虑替换这些功能的使用,因为它们在稳定之前可能会再次改变行为。

词法 $_ 现在是实验性的

自从它在 Perl v5.10 中引入以来,它引起了很多困惑,没有明显的解决方案

我们希望词法 $_ 可以恢复,但这可能会导致其行为发生变化。在它变得稳定之前,请谨慎使用它。

$/ = \N 的 readline() 现在读取 N 个字符,而不是 N 个字节

以前,从具有 I/O 层(如 encoding)的流中读取时,readline() 函数(也称为 <> 运算符)将从最顶层读取 N 个字节。[perl #79960]

现在,读取 N 个字符。

从没有额外层的流中读取时,行为没有变化,因为字节与字符完全匹配。

重写的 glob 现在传递一个参数

glob 重写以前传递一个神奇的未记录的第二个参数,该参数标识调用者。CPAN 上没有任何东西在使用它,它妨碍了错误修复,因此它被删除了。如果您确实需要识别调用者,请参阅 CPAN 上的 Devel::Callsite

Here 文档解析

现在,在类似引号的操作符中,here 文档的主体始终从 "<<foo" 标记后的下一行开始。以前,文档中说明它从包含类似引号的操作符后的下一行开始,但实际上并非总是如此 [perl #114040]。

字母数字操作符现在必须与正则表达式的结束分隔符分开

您不再可以像这样编写

m/a/and 1

相反,您必须编写

m/a/ and 1

使用空格将操作符与正则表达式的结束分隔符分开。从 Perl v5.14.0 开始,没有空格会导致弃用警告。

qw(...) 不能再用作括号

qw 列表曾经欺骗解析器,使其认为它们始终被括号包围。这允许一些令人惊讶的构造,例如 foreach $x qw(a b c) {...},它实际上应该写成 foreach $x (qw(a b c)) {...}。这些有时会使词法分析器进入错误的状态,因此它们无法完全正常工作,而类似的 foreach qw(a b c) {...} 可能会被允许,但从未真正起作用。

qw 的这种副作用现在已被废除。它从 Perl v5.13.11 开始就被弃用。现在需要在语法要求的地方使用真正的括号。

词法警告和默认警告的交互

如果词法警告尚未启用,则启用任何词法警告都会先禁用所有默认警告

$*; # deprecation warning
use warnings "void";
$#; # void warning; no deprecation warning

现在,当启用词法警告时,debuggingdeprecatedglobinplacemalloc 警告类别将保持启用状态(当然,除非它们被 no warnings 禁用)。

这可能会导致以前没有警告的代码出现弃用警告。

这些是唯一仅包含默认警告的类别。其他类别中的默认警告仍然会被 use warnings "category" 禁用,因为我们还没有控制单个警告的机制。

state subour sub

由于历史原因,state subour sub 等同于普通的 sub,因此甚至可以使用 our sub { ... } 创建匿名子例程。这些现在在 "lexical_subs" 特性之外被禁止。在 "lexical_subs" 特性下,它们具有在 "perlsub 中的词法子例程" 中描述的新含义。

存储在环境中的定义值强制转换为字节字符串

存储在环境变量中的值在被子进程继承时始终会被字符串化。

在本版本中,当赋值给%ENV时,值会立即被转换为字符串,并转换为仅包含字节的字符串。

首先,它被强制转换为字符串。然后,如果字符串是 utf8 并且等效于utf8::downgrade()有效,则使用该结果;否则,将使用等效于utf8::encode()的结果,并发出有关宽字符的警告("诊断")。

require 对于不可读文件会终止

require遇到不可读文件时,它现在会终止。它以前会忽略该文件并继续搜索@INC 中的目录 [perl #113422]。

gv_fetchmeth_* 和 SUPER

各种gv_fetchmeth_* XS 函数以前会对名称以::SUPER结尾的包进行特殊处理。对Foo::SUPER 包的 方法查找将被视为对Foo 包的SUPER 方法查找。这种情况不再存在。要进行SUPER 查找,请传递Foo 存储区和GV_SUPER 标志。

split 的第一个参数被更一致地解释

在 v5.17 中进行了一些更改后,split 的行为已简化:如果 PATTERN 参数计算结果为包含一个空格的字符串,则它将以与以前包含一个空格的字面字符串相同的方式处理。

弃用

模块移除

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

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

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

encoding

现在强烈建议不要使用此 pragma。它将源文本的编码与 I/O 数据的编码混淆,重新解释源文本中的转义序列(这是一个有争议的选择),并将 UTF-8 错误引入到所有字符字符串的运行时处理中。它在设计上存在缺陷,无法修复。

要在源文本中使用非 ASCII 字面字符,请参考 utf8。要处理文本 I/O 数据,请参考 Encodeopen

Archive::Extract
B::Lint
B::Lint::Debug
CPANPLUS 和所有包含的 CPANPLUS::* 模块
Devel::InnerPackage
Log::Message
Log::Message::Config
Log::Message::Handlers
Log::Message::Item
Log::Message::Simple
Module::Pluggable
Module::Pluggable::Object
Object::Accessor
Pod::LaTeX
Term::UI
Term::UI::History

已弃用的实用程序

以下实用程序将在未来版本中从核心发行版中删除,因为它们关联的模块已弃用。它们将继续在适用的 CPAN 发行版中提供。

cpanp
cpanp-run-perl
cpan2dist

这些项目是 CPANPLUS 发行版的一部分。

pod2latex

此项目是 Pod::LaTeX 发行版的一部分。

PL_sv_objcount

此解释器全局变量用于跟踪解释器中的 Perl 对象总数。它不再维护,将在 Perl v5.20 中完全删除。

在使用 /x 的模式中,应转义五个额外字符

当使用 /x 编译正则表达式模式时,Perl 将 6 个字符视为要忽略的空白字符,例如 SPACE 和 TAB。但是,Unicode 建议将 11 个字符视为空白字符。我们将在未来的 Perl 版本中符合此标准。在此期间,使用任何缺少的字符将引发弃用警告,除非已关闭。这五个字符是

U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR

用户定义的字符名称包含意外空格

用户定义的字符名称如果在末尾或中间包含多个空格,很可能是一个错误。现在,在定义时会生成警告,假设使用该名称时不太可能包含多余的空格。

各种 XS 可调用函数已弃用

所有用于对字符进行分类的函数将在 Perl 的未来版本中移除,不应再使用。使用支持的 C 编译器(例如 gcc)编译任何使用这些函数的文件都会生成警告。这些函数并非用于公开使用;对于大多数函数,都存在等效的、更快的宏。

请参阅 "perlapi 中的字符类"。完整的列表如下:

is_uni_alnumis_uni_alnumcis_uni_alnumc_lcis_uni_alnum_lcis_uni_alphais_uni_alpha_lcis_uni_asciiis_uni_ascii_lcis_uni_blankis_uni_blank_lcis_uni_cntrlis_uni_cntrl_lcis_uni_digitis_uni_digit_lcis_uni_graphis_uni_graph_lcis_uni_idfirstis_uni_idfirst_lcis_uni_loweris_uni_lower_lcis_uni_printis_uni_print_lcis_uni_punctis_uni_punct_lcis_uni_spaceis_uni_space_lcis_uni_upperis_uni_upper_lcis_uni_xdigitis_uni_xdigit_lcis_utf8_alnumis_utf8_alnumcis_utf8_alphais_utf8_asciiis_utf8_blankis_utf8_charis_utf8_cntrlis_utf8_digitis_utf8_graphis_utf8_idcontis_utf8_idfirstis_utf8_loweris_utf8_markis_utf8_perl_spaceis_utf8_perl_wordis_utf8_posix_digitis_utf8_printis_utf8_punctis_utf8_spaceis_utf8_upperis_utf8_xdigitis_utf8_xidcontis_utf8_xidfirst

此外,以下三个从未正常工作的函数也已弃用:to_uni_lower_lcto_uni_title_lcto_uni_upper_lc

正则表达式中某些罕见的反斜杠用法已弃用

Perl 在正则表达式模式中识别三对字符作为元字符:{}[]()。这些字符也可以用作模式的定界符,例如:

m{foo}
s(foo)(bar)

由于它们是元字符,因此对正则表达式模式具有特殊含义,事实证明,如果在由它们定界的模式中成对使用它们,则无法通过在它们前面加上反斜杠来关闭这种特殊含义。例如,在

m{foo\{1,3\}}

中,反斜杠不会改变行为,它匹配 "f o" 后面跟一个到三个 "o"

像这样将它们解释为元字符的用法非常罕见;我们认为,例如,在整个 CPAN 中都没有这样的用法。因此,此弃用应该对很少的代码产生影响。但是,它确实通知任何此类代码需要更改,这反过来将允许我们在未来的 Perl 版本中更改行为,以便反斜杠确实起作用,并且不会担心我们正在默默地破坏任何现有代码。

在正则表达式中拆分标记 (?(*

如果在 (?...) 正则表达式结构中,(? 之间存在空格或注释,则现在会发出弃用警告。类似地,如果在 (*VERB...) 结构中,(* 之间存在空格。

Pre-PerlIO IO 实现

理论上,您目前可以构建不使用 PerlIO 的 perl。相反,您将使用围绕 stdio 或 sfio 的包装器。在实践中,这并没有什么用。它没有经过充分测试,并且没有对 IO 层(因此也没有对 Unicode)的支持,它并不是一个真正的 perl。在下一个版本的 perl 中,很可能将删除不使用 PerlIO 的构建方式。

如果需要使用 stdio,PerlIO 支持 stdio 层。类似地,如果需要,将来可以生成 sfio 层。

未来弃用

性能增强

模块和语义

新的模块和语义

更新的模块和语义

有关更新的完整列表,请运行

$ corelist --diff 5.16.0 5.18.0

您也可以用您喜欢的版本替换 5.16.0

已移除的模块和语义

文档

现有文档的变更

perlcheat

perldata

perldiag

perlfaq

perlfunc

perlop

诊断信息

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

新的诊断信息

新的错误

新的警告

对现有诊断的更改

实用程序变更

h2xs

配置和编译

测试

平台支持

已停产的平台

BeOS

BeOS 是由 Be Inc 为其 BeBox 硬件开发的个人计算机操作系统。Haiku 操作系统是作为 BeOS 的开源替代品/延续而编写的,其 perl 移植是当前的,并且得到积极维护。

UTS 全球

与 UTS 全球相关的支持代码已被移除。UTS 是由 Amdahl 创建的 System V 的大型机版本,后来出售给 UTS 全球。该端口自 Perl v5.8.0 之前就未被触碰,而 UTS 全球现已停止运营。

VM/ESA

对 VM/ESA 的支持已被移除。该端口在 2.3.0 上进行了测试,IBM 于 2002 年 3 月停止了对该版本的维护。2.4.0 于 2003 年 6 月停止维护,并被 Z/VM 取代。当前版本的 Z/VM 是 V6.2.0,计划于 2015 年 4 月 30 日停止维护。

MPE/IX

对 MPE/IX 的支持已被移除。

EPOC

与 EPOC 相关的支持代码已被移除。EPOC 是 Psion 为移动设备开发的一系列操作系统。它是 Symbian 的前身。该端口最后一次更新是在 2002 年 4 月。

Rhapsody

对 Rhapsody 的支持已被移除。

平台特定说明

AIX

在 AIX 上使用 xlC 时,Configure 现在始终将 -qlanglvl=extc99 添加到 CC 标志中。这将使编译许多假设 C99 的基于 XS 的模块变得更容易 [perl #113778]。

clang++

现在有一个解决方法可以解决自 Perl v5.15.7 以来阻止使用 clang++ 编译的编译器错误 [perl #112786]。

C++

在将 Perl 核心编译为 C++ 时(这只是半支持的),mathom 函数现在被编译为 extern "C",以确保正确的二进制兼容性。(但是,在这种情况需要时,二进制兼容性通常并不保证。)

Darwin

停止将对齐硬编码为 8 字节边界,以修复使用 -Dusemorebits 构建的构建。

Haiku

Perl 现在应该可以在 Haiku R1 Alpha 4 上开箱即用。

MidnightBSD

libc_r 已从最新版本的 MidnightBSD 中移除,而旧版本在使用 pthread 时效果更好。现在使用 pthread 启用线程,这可以纠正 0.4-CURRENT 上启用线程时的构建错误。

Solaris

在配置时,避免运行在 Solaris 上不支持标志的 sed 命令。

VMS

Win32

WinCE

现在可以在 WinCE 上构建,尽管需要更多工作才能完全恢复干净的构建。

内部更改

已修复的错误

已知问题

讣告

来自韩国首尔的 24 岁的 Yoon Hojung (AMORETTE) 于 2013 年 5 月 8 日与一只羊驼雕像和一张签名的 TIMTOADY 卡片一起长眠。他是一位才华横溢的年轻 Perl 5 & 6 黑客,也是 Seoul.pm 的忠实成员。他编写 Perl,谈论 Perl,吃 Perl,热爱 Perl。我们相信他仍然在某个地方用他坏掉的 IBM 笔记本电脑编写 Perl 程序。我们会想念他。

致谢

Perl v5.18.0 代表了自 Perl v5.16.0 以来大约 12 个月的开发,包含来自 113 位作者的 2,100 个文件中的大约 400,000 行更改。

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

Aaron Crane, Aaron Trevena, Abhijit Menon-Sen, Adrian M. Enache, Alan Haggai Alavi, Alexandr Ciornii, Andrew Tam, Andy Dougherty, Anton Nikishaev, Aristotle Pagaltzis, Augustina Blair, Bob Ernst, Brad Gilbert, Breno G. de Oliveira, Brian Carlson, Brian Fraser, Charlie Gonzalez, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Colin Kuskie, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Daniel Perrett, Darin McBride, Dave Rolsky, David Golden, David Leadbeater, David Mitchell, David Nicol, Dominic Hargreaves, E. Choroba, Eric Brine, Evan Miller, Father Chrysostomos, Florian Ragwitz, François Perrad, George Greer, Goro Fuji, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, Igor Zaytsev, James E Keenan, Jan Dubois, Jasmine Ahuja, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Joaquin Ferrero, Joel Berger, John Goodyear, John Peacock, Karen Etheridge, Karl Williamson, Karthik Rajagopalan, Kent Fredric, Leon Timmermans, Lucas Holt, Lukas Mai, Marcus Holland-Moritz, Markus Jansen, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Schroeder, Moritz Lenz, Nicholas Clark, Niko Tyni, Oleg Nesterov, Patrik Hägglund, Paul Green, Paul Johnson, Paul Marquess, Peter Martini, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Rhesa Rozendaal, Ricardo Signes, Robin Barker, Ronald J. Kimball, Ruslan Zakirov, Salvador Fandiño, Sawyer X, Scott Lanning, Sergey Alekseev, Shawn M Moore, Shirakata Kentaro, Shlomi Fish, Sisyphus, Smylers, Steffen Müller, Steve Hay, Steve Peters, Steven Schubiger, Sullivan Beck, Sven Strickroth, Sébastien Aperghis-Tramoni, Thomas Sibley, Tobias Leich, Tom Wyant, Tony Cook, Vadim Konoval, Vincent Pit, Volker Schatz, Walt Mankowski, Yves Orton, Zefram.

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

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

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

报告错误

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

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

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

另请参阅

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

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

README 文件,了解一般信息。

ArtisticCopying 文件,了解版权信息。