内容

名称

perl5160delta - perl v5.16.0 的新增功能

描述

本文档描述了 5.14.0 版本和 5.16.0 版本之间的差异。

如果您要从 5.12.0 等早期版本升级,请先阅读 perl5140delta,其中描述了 5.12.0 和 5.14.0 之间的差异。

此版本中的一些错误修复已移植到 5.14.x 的后续版本中。这些修复在括号中用 5.14.x 版本表示。

注意

随着 Perl 5.16.0 的发布,5.12.x 版本系列现在已超出其支持期限。将来可能会有 5.12.x 版本发布,但仅在出现严重的安全问题时才会发布。使用 Perl 5.12 或更早版本的用户应考虑升级到更新的 Perl 版本。

此策略在 perlpolicy 中有更详细的描述。

核心增强

use VERSION

从本版本开始,像 use v5.16 这样的版本声明现在会先禁用所有功能,然后再启用新的功能包。这意味着以下内容是正确的

use 5.016;
# only 5.16 features enabled here
use 5.014;
# only 5.14 features enabled here (not 5.16)

use v5.12 及更高版本继续启用 strict,但显式的 use strictno strict 现在会覆盖版本声明,即使它们出现在前面

no strict;
use 5.012;
# no strict here

有一个新的 ":default" 功能包,它代表在任何版本声明或 use feature 被看到之前启用的功能集。低于 5.10 的版本声明现在启用 ":default" 功能集。这实际上不会改变 use v5.8 的行为,因为添加到 ":default" 集中的功能是那些传统上默认启用的功能,在它们可以被关闭之前。

no feature 现在重置为默认功能集。要禁用所有功能(这可能是一个非常特殊的请求,因为它可能不匹配任何命名的语义集),你现在可以写 no feature ':all'

$[ 现在在 use v5.16 下被禁用。它是默认功能集的一部分,可以通过 use feature 'array_base' 显式地打开或关闭。

__SUB__

新的 __SUB__ 标记,在 current_sub 功能(参见 feature)或 use v5.16 下可用,返回对当前子例程的引用,使编写递归闭包更容易。

新的和改进的内置函数

更一致的 eval

eval 运算符有时将字符串参数视为字符序列,有时视为字节序列,具体取决于内部编码。内部编码不应该有任何区别,但有一些代码依赖于这种不一致。

新的 unicode_evalevalbytes 特性(在 use 5.16.0 下启用)解决了这个问题。unicode_eval 特性使 eval $string 始终将字符串视为 Unicode。evalbytes 特性提供了一个名为 evalbytes 的函数,它始终将参数评估为字节字符串。

这些特性还修复了源过滤器泄漏到外部动态作用域的奇特现象。

有关更多详细信息,请参阅 feature

substr 左值改造

substr 在左值或潜在左值上下文中使用两个或三个参数调用时,将返回一个特殊的左值标量,它在赋值时会修改原始字符串(第一个参数)。

以前,传递给 substr 的偏移量(第二个和第三个参数)会立即转换为与字符串匹配,负偏移量会转换为正偏移量,超出字符串末尾的偏移量会被截断。

现在,偏移量在返回的特殊左值标量中被记录下来,没有修改,substr 本身甚至不会查看原始字符串,而是在读取或修改返回的左值时才会查看。

这些更改导致了不兼容的更改

如果原始字符串在调用 substr 后但在赋值给其返回值之前改变了长度,负偏移量将记住它们在字符串末尾的位置,影响如下代码

my $string = "string";
my $lvalue = \substr $string, -4, 2;
print $$lvalue, "\n"; # prints "ri"
$string = "bailing twine";
print $$lvalue, "\n"; # prints "wi"; used to print "il"

省略第三个参数也会发生同样的情况。返回的左值将始终扩展到字符串的末尾,即使字符串变得更长。

由于此更改还允许修复许多错误(请参阅 "substr 运算符"),并且由于负偏移量的行为从未被指定,因此该更改被认为是可以接受的。

tied 的返回值

tied 在绑定变量上返回的值现在是实际保存绑定变量所绑定对象的标量。这使得可以使用 Scalar::Util::weaken(tied $tied_variable) 来削弱绑定。

Unicode 支持

支持(几乎)Unicode 6.1

除了添加全新的脚本和现有脚本中的新字符外,这个新版本的 Unicode,一如既往地对现有字符进行了一些更改。其中一项可能会影响某些应用程序的更改是,Latin-1 范围内的两个字符 PILCROW SIGN 和 SECTION SIGN 的通用类别已从 Other_Symbol 更改为 Other_Punctuation。藏文、埃塞俄比亚语和爱琴海语中的每个字符都进行了相同的更改。代码点 U+3248..U+324F(黑色方块上的圆圈数字十到黑色方块上的圆圈数字八十)的通用类别已从 Other_Symbol 更改为 Other_Numeric。换行属性对希伯来语和日语进行了更改;由于 6.1 中的其他更改,Perl 正则表达式构造 \X 现在对泰语和老挝语中的一些字符的工作方式有所不同。

已为许多属性值定义了新的别名(同义词);这些别名与之前存在的别名一起,都已在 perluniprops 中进行交叉索引。

charnames::viacode() 的返回值会受到其他更改的影响

Code point      Old Name             New Name
  U+000A    LINE FEED (LF)        LINE FEED
  U+000C    FORM FEED (FF)        FORM FEED
  U+000D    CARRIAGE RETURN (CR)  CARRIAGE RETURN
  U+0085    NEXT LINE (NEL)       NEXT LINE
  U+008E    SINGLE-SHIFT 2        SINGLE-SHIFT-2
  U+008F    SINGLE-SHIFT 3        SINGLE-SHIFT-3
  U+0091    PRIVATE USE 1         PRIVATE USE-1
  U+0092    PRIVATE USE 2         PRIVATE USE-2
  U+2118    SCRIPT CAPITAL P      WEIERSTRASS ELLIPTIC FUNCTION

Perl 将接受所有这些名称作为输入,但 charnames::viacode() 现在返回每对的新名称。对于 U+2118 的更改被 Unicode 认为是更正,即原始名称是错误的(但同样,使用它来引用 U+2118 将永远有效)。但这些更改中的大多数是 Unicode 6.0 在命名日本手机中使用的字符为“BELL”时所犯错误的后续影响,这与该名称在行业中的长期使用(以及 Unicode 建议使用该名称)相冲突,即指代 U+0007 处的 ASCII 控制字符。因此,该名称在 Perl v5.14 之后已弃用,任何使用它都会引发警告消息(除非关闭)。“ALERT”现在是此代码点的首选名称,“BEL”是可接受的简短形式。对于新手机字符的名称,其代码点为 U+1F514,在此版本的 Perl 中仍未定义(因此我们没有完全实现 Unicode 6.1),但从 v5.18 开始,BELL 将指代此字符,而不是 U+0007。

Unicode 已经采取措施确保此类错误不再发生。该标准现在包含所有普遍接受的控制字符名称和缩写,而以前没有(尽管大多数控制字符都有推荐名称,Perl 使用了这些名称)。这意味着大多数这些推荐名称现在已正式包含在标准中。Unicode 没有为上面列出的 U+008E 和 U+008F 之间的四个代码点推荐名称,在标准化这些代码点时,Unicode 微妙地改变了 Perl 之前为它们提供的名称,将每个名称末尾的空格替换为连字符。Unicode 还正式接受 Perl 已弃用的名称,例如 FILE SEPARATOR。现在唯一弃用的名称是 BELL。最后,Perl 现在使用新的官方名称,而不是旧的(现在被认为已过时)名称,用于上面列表中的前四个代码点(包含括号的代码点)。

现在名称已包含在 Unicode 标准中,此类更改应该不会再发生,尽管仍然可能进行更正,例如针对 U+2118 的更正。

Unicode 还添加了一些名称缩写,Perl 现在接受这些缩写:SP 代表 SPACE;TAB 代表 CHARACTER TABULATION;NEW LINE、END OF LINE、NL 和 EOL 代表 LINE FEED;LOCKING-SHIFT ONE 代表 SHIFT OUT;LOCKING-SHIFT ZERO 代表 SHIFT IN;ZWNBSP 代表 ZERO WIDTH NO-BREAK SPACE。

有关此版本的 Unicode 的更多详细信息,请参阅 http://www.unicode.org/versions/Unicode6.1.0/

use charnames 不再需要用于 \N{name}

当遇到 \N{name} 时,charnames 模块现在会在需要时自动加载,就像指定了 :full:short 选项一样。有关更多信息,请参阅 charnames

\N{...} 现在可以进行 Unicode 松散名称匹配

这在下面 "更新的模块和语义" 中的 charnames 项目中进行了描述。

Unicode 符号名称

Perl 现在对 Unicode 符号名称提供了适当的支持。以前,*{$foo} 会忽略内部 UTF8 标志,并使用底层表示的字节来查找符号。这意味着 *{"\x{100}"}*{"\xc4\x80"} 会返回相同的值。Perl 的所有这些部分都已修复,以考虑 Unicode

此外,已修复一个解析错误,该错误阻止了 *{é} 隐式引用名称,而是将其解释为 *{+é},这会导致严格违规。

*{"*a::b"} 会自动剥离 *,如果它后面跟着一个 ASCII 字母。这已扩展到所有 Unicode 标识符字符。

现在,单个字符的非 ASCII 非标点符号变量(如 )会受到“仅使用一次”警告。它们以前是豁免的,因为它们被视为标点符号变量。

此外,现在支持单个字符的 Unicode 标点符号变量(如 $‰)[perl #69032]。

改进混合区域设置和 Unicode 的能力,包括 UTF-8 区域设置

use locale 中添加了一个可选参数

use locale ':not_characters';

它告诉 Perl 使用当前区域设置的所有部分,除了 LC_CTYPELC_COLLATE 部分。相反,字符集被假定为 Unicode。这允许无缝地混合区域设置和 Unicode,包括越来越多的 UTF-8 区域设置。当使用这种混合形式的区域设置时,open pragma 的 :locale 层可用于与文件系统交互,并且有可用于 ARGV 和环境变量转换的 CPAN 模块。

完整详细信息请参见 perllocale

新的函数 fc 和相应的转义序列 \F 用于 Unicode 折叠大小写

Unicode 折叠大小写是对小写的扩展,在不区分大小写地比较两个字符串时会产生更好的结果。它长期以来一直用于正则表达式 /i 匹配中的内部。现在可以通过新的 fc 函数调用(通过 "use feature 'fc'"use v5.16 启用,或通过 CORE::fc 显式调用)或通过双引号字符串中的新 \F 序列显式使用。

完整详细信息请参见 "fc" in perlfunc

现在支持 Unicode Script_Extensions 属性。

这是 Unicode 6.0 中的新增功能,它是 Script 属性的改进版本。详细信息请参见 "Scripts" in perlunicode

XS 更改

某些内置类型的改进类型映射

大多数 XS 作者都知道 T_AVREF (AV*)、T_HVREF (HV*)、T_CVREF (CV*) 和 T_SVREF (SVREF\$foo) 的 OUTPUT 类型映射中存在一个长期存在的错误,该错误要求手动递减返回值的引用计数,而不是类型映射来处理此问题。为了向后兼容,这无法在默认类型映射中更改。但我们现在提供了额外的类型映射 T_AVREF_REFCOUNT_FIXED 等,它们没有表现出此错误。在您的扩展中使用它们就像在您的 TYPEMAP 部分中有一行代码一样简单

HV*	T_HVREF_REFCOUNT_FIXED

is_utf8_char()

当遇到格式错误的 UTF-8 输入时,XS 可调用函数 is_utf8_char() 可以读取字符串末尾最多 12 个字节。这无法在不更改其 API 的情况下修复,因此现在不建议使用它。请改用 is_utf8_char_buf()(如下所述)。

添加了 is_utf8_char_buf()

此函数旨在替换已弃用的 "is_utf8_char()" 函数。它包含一个额外的参数以确保它不会读取输入缓冲区的末尾。

其他 is_utf8_foo() 函数,以及 utf8_to_foo()

大多数其他接受 UTF-8 编码输入的 XS 可调用函数隐式假设 UTF-8 相对于缓冲区长度是有效的(没有格式错误)。不要在没有首先确保它是有效的 UTF-8 的情况下执行诸如更改字符的大小写或查看它是否为字母数字之类的操作。这可以通过使用以下函数之一来安全地对整个字符串执行:is_utf8_string()is_utf8_string_loc()is_utf8_string_loclen()

新的 Pad API

许多新函数已添加到用于操作词法垫的 API 中。有关更多信息,请参阅 "perlapi 中的 Pad 数据结构"

特殊变量的更改

$$ 可以被赋值

$$ 在 Perl 5.8.0 中被设为只读。但只是有时:local $$ 会使其再次可写。一些 CPAN 模块正在使用 local $$ 或 XS 代码来绕过只读检查,因此没有理由将 $$ 保持为只读。(此更改还允许在保持向后兼容性的同时修复一个错误。)

$^X 在 FreeBSD、OS X 和 Solaris 上转换为绝对路径

$^X 现在在 OS X、FreeBSD(无需挂载 /proc)和 Solaris 10 及 11 上被转换为绝对路径。这增强了之前在 Linux、FreeBSD 和 NetBSD 上使用 /proc 的方法(在所有情况下,如果已挂载)。

这使得可重定位的 Perl 安装在这些平台上更加有用。(参见 INSTALL 中的“可重定位的 @INC”)

调试器更改

调试器内部功能

当前 Perl 的 feature 包现在已在交互式调试器中输入的命令中启用。

调试器 t 命令的新选项

调试器中的 t 命令(切换跟踪模式)现在接受一个数字参数,该参数确定要跟踪的子例程调用级别。

enabledisable

调试器现在具有 disableenable 命令,用于禁用现有断点并重新启用它们。参见 perldebug

带文件名断点

调试器的“b”命令用于设置断点,现在允许行号以文件名作为前缀。参见 "b [file]:[line] [condition]" in perldebug

CORE 命名空间

CORE:: 前缀

CORE:: 前缀现在可以在 feature.pm 启用的关键字上使用,即使在 use feature 的作用域之外。

CORE 命名空间中的子例程

许多 Perl 关键字现在在 CORE 命名空间中可用作子例程。这使它们可以被别名化

BEGIN { *entangle = \&CORE::tie }
entangle $variable, $package, @args;

以及绕过原型

    sub mytie(\[%$*@]$@) {
	my ($ref, $pack, @args) = @_;
	... do something ...
	goto &CORE::tie;
    }

其中一些不能通过引用或通过 &foo 语法调用,而必须作为裸词调用。

有关详细信息,请参见 CORE

其他更改

匿名句柄

当无法确定变量名时,自动生成的句柄现在命名为 __ANONIO__,而不是 $__ANONIO__。

自动加载排序子例程

现在可以自动加载自定义排序子例程 [perl #30661]

sub AUTOLOAD { ... }
@sorted = sort foo @list; # uses AUTOLOAD

continue 不再需要 "switch" 特性

continue 关键字有两个含义。它可以在循环后引入一个 continue 块,也可以退出当前的 when 块。到目前为止,后一种含义仅在启用 "switch" 特性时才有效,否则将是语法错误。由于 feature.pm 的主要目的是避免与用户定义的子例程发生冲突,因此 continue 没有理由依赖它。

DTrace 探针用于解释器阶段更改

当解释器的阶段发生变化时,phase-change 探针将触发,它跟踪 ${^GLOBAL_PHASE} 变量。arg0 是新的阶段名称;arg1 是旧的阶段名称。这对于将您的检测限制在以下一个或多个阶段很有用:编译时、运行时或析构时。

__FILE__() 语法

__FILE____LINE____PACKAGE__ 标记现在可以在它们后面写一对空括号。这使得它们解析方式与 timefork 和其他内置函数相同。

\$ 原型接受任何标量左值

\$\[$] 子例程原型现在接受任何标量左值参数。以前它们只接受以 $ 开头的标量以及哈希和数组元素。此更改使它们与内置 readrecv 函数(以及其他函数)解析其参数的方式保持一致。这意味着可以将自定义子例程覆盖内置函数,这些子例程以相同的方式解析其参数。

子例程原型中的 _

子例程原型中的 _ 字符现在允许在 @% 之前。

安全

使用 is_utf8_char_buf() 而不是 is_utf8_char()

后者现在已被弃用,因为它的 API 不足以保证它不会读取(最坏情况下最多 12 个字节)超出其输入字符串的末尾。请参阅 is_utf8_char_buf()

格式错误的 UTF-8 输入可能会导致尝试读取超出缓冲区的末尾

现在提供了两个新的 XS 可访问函数 utf8_to_uvchr_buf()utf8_to_uvuni_buf() 来防止这种情况,并且 Perl 核心已转换为使用它们。请参阅 "内部更改"

File::Glob::bsd_glob() 使用 GLOB_ALTDIRFUNC 时的内存错误 (CVE-2011-2728)。

使用不支持的标志 GLOB_ALTDIRFUNC 调用 File::Glob::bsd_glob 会导致访问冲突/段错误。接受来自外部来源的标志值的 Perl 程序可能会使自己暴露于拒绝服务或任意代码执行攻击。目前没有已知的漏洞。通过明确禁用所有不支持的标志并将未使用的函数指针设置为 null 来解决此问题。由 Clément Lecigne 报告的错误。(5.14.2)

现在在分配给 $( 时正确设置权限

一个假设的错误(在实践中可能无法利用),因为在设置 $( 时有效组 ID 设置不正确已被修复。该错误只会影响具有 setresgid() 但没有 setregid() 的系统,但据知不存在此类系统。

弃用

不要读取 lib/unicore 中的 Unicode 数据库文件

现在直接读取 Unicode 数据库文件已被弃用。这些文件存储在 lib/unicore 目录中。相反,您应该使用 Unicode::UCD 中的新函数。这些函数提供稳定的 API,并提供完整的信息。

Perl 可能会在将来的某个时间点更改或删除这些文件。应用程序最有可能使用的文件是 lib/unicore/ToDigit.pl。可以使用 "Unicode::UCD 中的 prop_invmap()" 来获取其数据。

XS 函数 is_utf8_char()utf8_to_uvchr()utf8_to_uvuni()

此函数已弃用,因为它可能会读取输入字符串的末尾。请使用新的 is_utf8_char_buf()utf8_to_uvchr_buf()utf8_to_uvuni_buf() 代替。

未来弃用

本节作为对可能在下一个 Perl 版本 (5.18.0) 中被移除或 弃用 的功能的通知。如果您的代码依赖于这些功能,您应该通过 邮件列表perlbug 联系 Perl 5 维护者,解释您的用例并告知弃用流程。

核心模块

这些模块可能会被标记为 从核心 中弃用。这仅仅意味着它们将不再默认安装在核心发行版中,但仍将在 CPAN 上可用。

没有支持程序员的平台

这些平台的特殊构建支持可能会在 5.17.0 开发系列中被移除。

其他未来弃用

不兼容的更改

在空上下文中的特殊块调用

特殊块(BEGINCHECKINITUNITCHECKEND)现在在空上下文调用。这避免了对最后一个语句结果的浪费复制 [perl #108794]。

overloading 编译指示和正则表达式对象

使用no overloadingqr//返回的正则表达式对象现在被字符串化为 "Regexp=REGEXP(0xbe600d)" 而不是正则表达式本身 [perl #108780]。

两个 XS 类型映射条目被移除

两个可能未使用的 XS 类型映射条目已从核心类型映射中移除:T_DATAUNIT 和 T_CALLBACK。如果您是这些条目的用户(这不太可能),请参阅 perlxstypemap 中关于如何恢复它们的说明。

Unicode 6.1 与 Unicode 6.0 不兼容

这些在上面 "支持(几乎)Unicode 6.1" 中有详细说明。您可以编译此版本的 Perl 以使用 Unicode 6.0。请参阅 "在 perlunicode 中的“为非常严肃的黑客准备的,将 Perl 改造成在早期 Unicode 版本上工作”"

Borland 编译器

所有对 Borland 编译器的支持已被删除。代码很久以前就无法工作了。

某些已弃用的 Unicode 属性不再默认支持

Perl 永远不应该公开某些 Unicode 属性,这些属性被 Unicode 内部使用,并不打算公开。使用这些属性自 Perl 5.12 以来一直产生弃用警告消息。已删除的属性包括 Other_Alphabetic、Other_Default_Ignorable_Code_Point、Other_Grapheme_Extend、Other_ID_Continue、Other_ID_Start、Other_Lowercase、Other_Math 和 Other_Uppercase。

Perl 可以重新编译以包含任何或所有这些属性;说明在 "在 perluniprops 中的“Unicode 字符属性,Perl 不接受”" 中给出。

将 IO 对象作为类型全局变量解引用

*{...} 运算符在传递对 IO 对象的引用时(如 *{*STDIN{IO}}),会创建一个新的类型全局变量,其中只包含该 IO 对象。以前,它会字符串化为一个空字符串,但一些运算符会将其视为未定义,从而产生 "未初始化" 警告。现在它字符串化为 __ANONIO__ [perl #96326]。

用户定义的大小写转换操作

此功能在 Perl 5.14 中已弃用,现已移除。CPAN 模块 Unicode::Casing 提供了更好的功能,而没有此功能所具有的缺点,如 5.14 文档中所述:https://perldoc.perl5.cn/5.14.0/perlunicode.html#User-Defined-Case-Mappings-%28for-serious-hackers-only%29

XSUB 现在为 'static'

XSUB C 函数现在为 'static',也就是说,它们在编译单元之外不可见。用户可以使用新的 XS_EXTERNAL(name)XS_INTERNAL(name) 宏来选择所需的链接行为。XSUB 的普通 XS(name) 声明将继续为兼容性声明非 'static' XSUB,但 XS 编译器,ExtUtils::ParseXS (xsubpp) 默认情况下将发出 'static' XSUB。 ExtUtils::ParseXS 的行为可以通过 XS 使用 EXPORT_XSUB_SYMBOLS 关键字重新配置。有关详细信息,请参阅 perlxs

削弱只读引用

不再允许削弱只读引用。它本来就不应该起作用,有时会导致崩溃。

绑定包含类型全局变量的标量

尝试在将类型全局变量分配给标量后绑定标量,将改为绑定类型全局变量的 IO 槽中的句柄。这意味着不可能绑定标量本身。类似的问题影响了 tieduntie:如果最后返回的是类型全局变量,则 tied $scalar 将在绑定标量上返回 false,而对这种绑定标量的 untie $scalar 将不会执行任何操作。

我们在 Perl 5.14.0 之前修复了这个问题,但它导致了一些 CPAN 模块出现问题,因此我们改为进行弃用周期。

现在弃用已移除,此错误已修复。因此,tie $scalar 将始终绑定标量,而不是它持有的句柄。要绑定句柄,请使用 tie *$scalar(带有显式的星号)。同样适用于 tied *$scalaruntie *$scalar

IPC::Open3 不再提供 xfork()xclose_on_exec()xpipe_anon()

所有三个函数都是私有的、未公开的,并且未导出。它们似乎没有被 CPAN 上的任何代码使用。两个已被内联,一个已被完全删除。

$$ 不再缓存 PID

以前,如果从 C 中调用 fork(3),Perl 对 $$ 的概念可能会与 getpid() 返回的值不同步。通过始终通过 getpid() 获取 $$ 的值,消除了此潜在的错误。依赖缓存行为的代码将中断。如 核心增强 中所述,$$ 现在是可写的,但它将在 fork 期间重置。

$$getppid() 在 LinuxThreads 下不再模拟 POSIX 语义

已删除在过时的 LinuxThreads 实现下 $$getppid() 的 POSIX 模拟。这只会影响 Linux 2.4 用户和 Debian GNU/kFreeBSD 6.0 及更早版本的用户,而不会影响使用 NPTL 线程的大多数 Linux 安装。

这意味着 getppid()$$ 一样,现在始终保证返回操作系统对进程当前状态的理解,而不是 perl 的缓存版本。

有关详细信息,请参阅 $$ 的文档。

$<$>$($) 不再缓存

与对 $$getppid() 的更改类似,已删除 $<$>$($) 的内部缓存。

当我们缓存这些值时,如果有人(例如,嵌入 perl 的人)调用 sete?[ug]id() 而不更新 PL_e?[ug]id,我们对它们是什么的理解将与现实脱节。考虑到 gete?[ug]id() 系统调用有多便宜,处理这种复杂性并不值得。

此更改将破坏少数使用 XS 级 PL_uidPL_gidPL_euidPL_egid 变量的 CPAN 模块。

解决这些问题的方法是使用 PerlProc_gete?[ug]id() 来检索它们(例如,PerlProc_getuid()),并且如果更改了 UID/GID/EUID/EGID,不要赋值给 PL_e?[ug]id。由于 perl 将始终从操作系统检索这些值的最新版本,因此不再需要这样做。

quotemeta\Q 引用哪些非 ASCII 字符已更改

这不太可能导致实际问题,因为 Perl 不会对任何非 ASCII 字符赋予特殊含义,因此目前引用与否无关紧要。此更改修复了 bug [perl #77654],并将 Perl 的行为更符合 Unicode 的建议。参见 "quotemeta" in perlfunc.

性能增强

模块和语义

已弃用模块

Version::Requirements

Version::Requirements 现已弃用,请使用 CPAN::Meta::Requirements,它是一个直接替换。它将在 v5.17.0 中从 perl.git blead 中删除。

新模块和语义

更新的模块和语义

这只是对选定模块更新的概述。有关更新的完整列表,请运行

$ corelist --diff 5.14.0 5.16.0

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

已移除的模块和语义

正如 Perl 5.14.0 的发行说明中所承诺的那样,以下模块已从核心发行版中移除,如果需要,应从 CPAN 安装。

文档

新文档

perldtrace

perldtrace 描述了 Perl 的 DTrace 支持,列出了提供的探针并提供了使用示例。

perlexperiment

本文档旨在提供 Perl 中实验性功能的列表。它仍在开发中。

perlootut

这是一个新的 OO 教程。它侧重于基本的 OO 概念,然后建议读者从 CPAN 中选择一个 OO 框架。

perlxstypemap

新手册以空前的详细程度描述了 XS 类型映射机制,并将新文档与从 perlxs 中提取的信息以及以前非官方的所有核心类型映射列表相结合。

现有文档的变更

perlapi

perlfunc

perlguts

perlobj

perlop

perlpragma

"perlsec 中的“清洗和检测污染数据”"

perllol

perlmod

perlpodstyle

perlre

perlrun

perlsub

perltie

perlvar

其他更改

已删除的文档

旧的 OO 文档

旧的 OO 教程,perltoot、perltooc 和 perlboot,已被删除。perlbot(对象技巧包)文档也被删除。

开发增量

开发版本的 perldelta 文件不再与 perl 打包在一起。这些文件仍然可以在 perl 源代码库中找到。

诊断信息

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

新的诊断信息

新的错误

新的警告

已移除的错误

对现有诊断的更改

实用程序更改

h2ph

splain

zipdetails

配置和编译

平台支持

平台特定说明

Cygwin

HP-UX

VMS

GNU/Hurd

OpenVOS

SunOS

CC workshop C++ 编译器现在在没有 cc 的系统上被检测到并使用。

内部更改

选定的错误修复

数组和哈希

C API 修复

编译时提示

写时复制标量

写时复制或共享哈希键标量在 5.8.0 中引入,但大多数 Perl 代码没有遇到它们(它们主要用于内部)。Perl 5.10.0 扩展了它们,使得将 __PACKAGE__ 或哈希键分配给标量会使其成为写时复制。Perl 的几个部分没有更新以考虑它们,但现在已修复。

调试器

解除引用运算符

文件句柄,最后访问

Perl 有一个内部变量,用于存储最后访问的文件句柄。它被 $. 以及没有参数的 telleof 使用。

文件测试和 stat

术语 "文件测试" 指的是由连字符后跟单个字母组成的运算符:-r-x-M 等。术语 "堆叠" 当应用于文件测试时,表示后面跟着另一个共享相同操作数的文件测试运算符,如 -r -x -w $fooo

格式

givenwhen

glob 运算符

左值子例程

重载

内置关键字的原型

正则表达式

智能匹配

sort 运算符

substr 运算符

支持嵌入空字符

Perl 的某些部分在处理字符串中嵌入的空字符 (chr 0) 时无法正常工作。这意味着,例如,$m = "a\0b"; foo->$m 会调用“a”方法,而不是$m 中包含的实际方法名称。这些 Perl 部分已修复以支持空字符。

这些更改的一个副作用是,祝福到“\0”不再导致ref() 返回 false。

线程错误

绑定变量

版本对象和 vstring

警告,重新定义

警告,“未初始化”

弱引用

其他值得注意的修复

已知问题

致谢

Perl 5.16.0 代表了自 Perl 5.14.0 发布以来的大约 12 个月的开发,包含了来自 139 位作者的 2,500 个文件中的大约 590,000 行代码变更。

Perl 凭借其充满活力的用户和开发者社区,在进入其第三个十年后依然蓬勃发展。以下人员已知为 Perl 5.16.0 的改进做出了贡献

Aaron Crane,Abhijit Menon-Sen,Abigail,Alan Haggai Alavi,Alberto Simões,Alexandr Ciornii,Andreas König,Andy Dougherty,Aristotle Pagaltzis,Bo Johansson,Bo Lindbergh,Breno G. de Oliveira,brian d foy,Brian Fraser,Brian Greenfield,Carl Hayter,Chas. Owens,Chia-liang Kao,Chip Salzenberg,Chris 'BinGOs' Williams,Christian Hansen,Christopher J. Madsen,chromatic,Claes Jacobsson,Claudio Ramirez,Craig A. Berry,Damian Conway,Daniel Kahn Gillmor,Darin McBride,Dave Rolsky,David Cantrell,David Golden,David Leadbeater,David Mitchell,Dee Newcum,Dennis Kaarsemaker,Dominic Hargreaves,Douglas Christopher Wilson,Eric Brine,Father Chrysostomos,Florian Ragwitz,Frederic Briere,George Greer,Gerard Goossen,Gisle Aas,H.Merijn Brand,Hojung Youn,Ian Goodacre,James E Keenan,Jan Dubois,Jerry D. Hedden,Jesse Luehrs,Jesse Vincent,Jilles Tjoelker,Jim Cromie,Jim Meyering,Joel Berger,Johan Vromans,Johannes Plunien,John Hawkinson,John P. Linderman,John Peacock,Joshua ben Jore,Juerd Waalboer,Karl Williamson,Karthik Rajagopalan,Keith Thompson,Kevin J. Woolley,Kevin Ryde,Laurent Dami,Leo Lapworth,Leon Brocard,Leon Timmermans,Louis Strous,Lukas Mai,Marc Green,Marcel Grünauer,Mark A. Stratman,Mark Dootson,Mark Jason Dominus,Martin Hasch,Matthew Horsfall,Max Maischein,Michael G Schwern,Michael Witten,Mike Sheldrake,Moritz Lenz,Nicholas Clark,Niko Tyni,Nuno Carvalho,Pau Amma,Paul Evans,Paul Green,Paul Johnson,Perlover,Peter John Acklam,Peter Martini,Peter Scott,Phil Monsen,Pino Toscano,Rafael Garcia-Suarez,Rainer Tammer,Reini Urban,Ricardo Signes,Robin Barker,Rodolfo Carvalho,Salvador Fandiño,Sam Kimbrel,Samuel Thibault,Shawn M Moore,Shigeya Suzuki,Shirakata Kentaro,Shlomi Fish,Sisyphus,Slaven Rezic,Spiros Denaxas,Steffen Müller,Steffen Schwigon,Stephen Bennett,Stephen Oberholtzer,Stevan Little,Steve Hay,Steve Peters,Thomas Sibley,Thorsten Glaser,Timothe Litt,Todd Rinaldo,Tom Christiansen,Tom Hukins,Tony Cook,Vadim Konovalov,Vincent Pit,Vladimir Timofeev,Walt Mankowski,Yves Orton,Zefram,Zsbán Ambrus,Ævar Arnfjörð Bjarmason。

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

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

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

报告错误

如果您发现疑似错误,可以查看最近发布到 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 文件,了解版权信息。