perl5140delta - perl v5.14.0 的新增内容
本文档描述了 5.12.0 版本和 5.14.0 版本之间的差异。
如果您要从 5.10.0 等早期版本升级,请先阅读 perl5120delta,其中描述了 5.10.0 和 5.12.0 之间的差异。
此版本中的一些错误修复已移植到 5.12.x 的后续版本。这些修复在括号中用 5.12.x 版本表示。
如 perlpolicy 中所述,Perl 5.14.0 的发布标志着 Perl 5.10 支持的正式结束。Perl 5.10 或更早版本的用户应考虑升级到更新版本的 Perl。
Perl 附带了 Unicode 6.0 数据库,该数据库已使用 勘误表 #8 更新,但有一个例外,如下所述。有关新版本的详细信息,请参阅 http://unicode.org/versions/Unicode6.0.0/。Perl 不支持任何 Unicode 临时属性,包括此版本中的新属性。
Unicode 6.0 选择使用名称 BELL
来表示 U+1F514 处的字符,该字符看起来像一个铃铛,在日本手机中使用。这与 Perl 长期以来将 BELL
作为 ASCII BEL
字符(U+0007)的用法冲突。在 Perl 5.14 中,\N{BELL}
仍然表示 U+0007,但其使用会生成弃用警告消息,除非此类警告被关闭。U+0007 在 Perl 中的新名称是 ALERT
,这与它的现有简写序列 "\a"
很好地对应。\N{BEL}
表示 U+0007,不会发出警告。U+1F514 处的字符在 5.14 中没有名称,但可以通过 \N{U+1F514}
来引用。在 Perl 5.16 中,\N{BELL}
将引用 U+1F514;所有使用 \N{BELL}
的代码都应该在升级之前转换为使用 \N{ALERT}
、\N{BEL}
或 "\a"
。
use feature 'unicode_strings'
的完整功能此版本为 use feature 'unicode_strings'
提供了完整的功能。在其作用域下,执行的所有字符串操作和编译的正则表达式(即使在作用域之外执行)都具有 Unicode 语义。请参阅 "feature 中的 'unicode_strings' 特性"。但是,请参阅下面的 "反向括号字符类和多字符折叠"。
此特性避免了大多数形式的“Unicode 错误”(有关详细信息,请参阅 "perlunicode 中的“Unicode 错误”")。如果您的代码有可能处理 Unicode 字符串,强烈建议您使用此子pragma 以避免出现意外情况。
\N{NAME}
和 charnames
增强功能\N{NAME}
和 charnames::vianame
现在了解 Unicode 列出的缩写字符名称,例如 NBSP、SHY、LRO、ZWJ 等;所有 C0 和 C1 控制字符的常用缩写(例如 ACK、BEL、CAN 等);以及一些 C1 全名的新的变体,这些变体在常用中。
Unicode 有几个命名字符序列,其中特定代码点的序列被赋予名称。\N{NAME}
现在识别这些序列。
\N{NAME}
、charnames::vianame
和 charnames::viacode
现在可以识别 Unicode 中的每个字符。在早期的 Perl 版本中,它们无法识别韩语音节和一些中日韩 (CJK) 字符。
现在可以使用自定义别名覆盖 Perl 的缩写。
现在可以为字符的序数创建自定义别名,该序数由 \N{NAME}
、charnames::vianame()
和 charnames::viacode()
识别。以前,别名必须是官方的 Unicode 字符名称。这使得无法为未命名的代码点创建别名,例如为私用保留的代码点。
新函数 charnames::string_vianame()
是 \N{NAME}}
的运行时版本,返回其 Unicode 名称与其参数匹配的字符字符串。它可以处理 Unicode 命名的字符序列,而现有的 charnames::vianame()
则不能,因为后者只返回一个代码点。
有关所有这些更改的详细信息,请参阅 charnames。
添加了三个新的“utf8”警告子类别。这些允许您关闭一些“utf8”警告,同时允许其他警告保持开启。这三个类别是:当遇到 UTF-16 代理时为 surrogate
;当遇到 Unicode 非字符代码点时为 nonchar
;当遇到超过 0x10FFFF 的合法 Unicode 最大值的代码点时为 non_unicode
。
在此版本中,Perl 采用了一种模型,即任何无符号值都可以被视为代码点,并在内部(作为 utf8)进行编码,而不会发出警告,而不仅仅是 Unicode 中合法的代码点。但是,除非显式关闭 utf8 或相应的词法警告子类别(参见上一项),否则输出或执行 Unicode 定义的操作(例如将此类代码点大写)将生成警告。尝试使用严格规则(例如使用 :encoding(UTF-8)
层)输入这些代码点将继续失败。在此版本之前,处理不一致,并且在某些地方不正确。
Unicode 非字符,其中一些以前被 Perl 错误地认为在某些地方是非法的,与 Unicode 标准相矛盾,现在在内部始终合法。输入或输出它们的工作方式与非法的 Unicode 代码点相同,因为 Unicode 标准规定它们(仅)对于“开放交换”是非法的。
Unicode 数据库文件不再与 Perl 一起安装。这不会影响 Perl 中的任何功能,并节省了大量的磁盘空间。如果您需要这些文件,可以从 http://www.unicode.org/Public/zipped/6.0.0/ 下载。
(?^...)
结构表示默认修饰符在正则表达式中,紧跟在 "(?"
后的 ASCII 脱字符 "^"
现在表示子表达式不继承周围的修饰符(如 /i
),而是恢复为 Perl 默认值。脱字符后的任何修饰符都将覆盖默认值。
正则表达式的字符串化现在使用此符号。例如,qr/hlagh/i
以前被字符串化为 (?i-xsm:hlagh)
,但现在被字符串化为 (?^i:hlagh)
。
此更改的主要目的是允许依赖字符串化的测试不必在添加新修饰符时进行更改。请参阅 "perlre 中的扩展模式"。
此更改可能会破坏将字符串化的正则表达式与包含 ?-xism
的固定字符串进行比较的代码。
/d
、/l
、/u
和 /a
修饰符添加了四个新的正则表达式修饰符。这些修饰符是互斥的:一次只能启用一个。
/l
修饰符表示将正则表达式编译为在 use locale
的作用域内,即使它不在该作用域内。
/u
修饰符表示将正则表达式编译为在 use feature 'unicode_strings'
编译指示的作用域内。
/d
(默认)修饰符用于覆盖在编译正则表达式时生效的任何 use locale
和 use feature 'unicode_strings'
编译指示。
/a
正则表达式修饰符将 \s
、\d
和 \w
以及 POSIX([[:posix:]]
)字符类限制在 ASCII 范围内。它们的补码以及 \b
和 \B
也会相应地受到影响。否则,/a
的行为类似于 /u
修饰符,在这种情况下,不区分大小写的匹配使用 Unicode 语义。
如果 /a
修饰符重复出现,则在不区分大小写的匹配中,任何 ASCII 字符都不能匹配非 ASCII 字符。例如,
"k" =~ /\N{KELVIN SIGN}/ai
"\xDF" =~ /ss/ai
匹配,但
"k" =~ /\N{KELVIN SIGN}/aai
"\xDF" =~ /ss/aai
不匹配。
有关更多详细信息,请参阅 "perlre 中的修饰符"。
替换 (s///
) 和音译 (y///
) 运算符现在支持 /r
选项,该选项复制输入变量,在副本上执行替换,并返回结果。原始变量保持不变。
my $old = "cat";
my $new = $old =~ s/cat/dog/r;
# $old is "cat" and $new is "dog"
这在使用 map
时特别有用。有关更多示例,请参阅 perlop。
现在可以在正则表达式内的 (?{...})
和 (??{...})
代码块中安全地使用正则表达式。
但是,这些块仍处于实验阶段,并且在词法 (my
) 变量和异常退出方面仍然存在问题。
use re '/flags'
re
准则现在能够在词法作用域结束之前打开正则表达式标志。
use re "/x";
"foo" =~ / (.+) /; # /x implied
有关详细信息,请参阅 "re 中的'/flags' 模式"。
在双引号类上下文中,有一个新的八进制转义序列 "\o"
。此结构允许表示超出当前最大值 0777 的大型八进制序数。它还允许您以八进制形式指定一个字符,该字符可以安全地与其他正则表达式片段连接,并且不会被误认为是正则表达式捕获组的反向引用。请参阅 "perlre 中的捕获组"。
\p{Titlecase}
作为 \p{Title}
的同义词添加此同义词是为了与 Unicode 属性名称 \p{Uppercase}
和 \p{Lowercase}
对称。
正则表达式调试输出(通过 use re 'debug'
打开)现在在转义非 ASCII 字符时使用十六进制,而不是八进制。
delete $+{...}
的返回值自定义正则表达式引擎现在可以确定delete
在%+
或%-
条目上的返回值。
警告:此功能被认为是实验性的,因为其确切行为可能会在未来的 Perl 版本中发生变化。
所有直接操作数组或哈希容器的内置函数现在也接受对数组或哈希的未祝福硬引用
|----------------------------+---------------------------|
| Traditional syntax | Terse syntax |
|----------------------------+---------------------------|
| push @$arrayref, @stuff | push $arrayref, @stuff |
| unshift @$arrayref, @stuff | unshift $arrayref, @stuff |
| pop @$arrayref | pop $arrayref |
| shift @$arrayref | shift $arrayref |
| splice @$arrayref, 0, 2 | splice $arrayref, 0, 2 |
| keys %$hashref | keys $hashref |
| keys @$arrayref | keys $arrayref |
| values %$hashref | values $hashref |
| values @$arrayref | values $arrayref |
| ($k,$v) = each %$hashref | ($k,$v) = each $hashref |
| ($k,$v) = each @$arrayref | ($k,$v) = each $arrayref |
|----------------------------+---------------------------|
这允许这些内置函数在长解引用链或子例程的返回值上进行操作,而无需将它们包装在@{}
或%{}
中
push @{$obj->tags}, $new_tag; # old way
push $obj->tags, $new_tag; # new way
for ( keys %{$hoh->{genres}{artists}} ) {...} # old way
for ( keys $hoh->{genres}{artists} ) {...} # new way
+
原型是$
的特殊替代方案,当给定文字数组或哈希变量时,它就像\[@%]
一样,但否则会强制对参数进行标量上下文。请参阅"perlsub 中的原型"。
package
块语法包声明现在可以包含代码块,在这种情况下,声明仅在该块内有效。因此,package Foo { ... }
与 { package Foo; ... }
完全等效。它也适用于声明中的版本号,如 package Foo 1.2 { ... }
,这是它最吸引人的特性。请参阅perlfunc。
语句标签现在可以出现在任何类型的语句或声明之前,例如 package
。
多个语句标签现在可以出现在单个语句之前。
字面量现在可以使用大写 0X...
或 0B...
前缀,除了已经支持的 0x...
和 0b...
语法 [perl #76296]。
C、Ruby、Python 和 PHP 已经支持这种语法,它使 Perl 在内部更加一致:使用 eval sprintf "%#X", 0x10
进行往返现在返回 16
,就像 eval sprintf "%#x", 0x10
一样。
tie
、tied
和 untie
现在可以被重写 [perl #75902]。
为了提高可靠性和一致性,对 die
、warn
和 $@
的行为进行了多项更改。
当在 eval
内部抛出异常时,异常不再有被析构函数代码在展开过程中覆盖的风险。以前,异常是在抛出过程的早期写入 $@
的,如果在 eval
内部使用 eval
来处理在退出外部 eval
时需要释放的对象的析构函数,则异常会被覆盖。现在,异常是在退出外部 eval
之前的最后一步写入 $@
的,因此之后立即运行的代码可以依赖于 $@
中的值正确地对应于该 eval
。(为了满足依赖于此的析构函数,$@
仍然在退出 eval
之前被设置。)
同样,eval
内部的 local $@
也不再覆盖其作用域内抛出的任何异常。以前,在展开时恢复 $@
会覆盖任何正在抛出的异常。现在,异常可以到达 eval
。因此,local $@
在 die
之前是安全的。
从对象析构函数抛出的异常不再修改周围上下文的 $@
。(如果周围上下文是异常展开,这曾经是覆盖正在抛出的异常的另一种方式。)以前,这种异常有时会作为警告发出,然后根据该异常和周围 $@
是字符串还是对象,将其追加到周围的 $@
中或完全替换周围的 $@
。现在,这种情况下的异常始终作为警告发出,保持周围的 $@
不变。除了对象析构函数之外,这也影响了使用 G_KEEPERR
标志由 XS 代码运行的任何函数调用。
warn
的警告现在可以像 die
的异常一样是对象。如果基于对象的警告得到默认的写入标准错误的处理,它将像以前一样被字符串化,并在后面附加文件名和行号。但是,$SIG{__WARN__}
处理程序现在接收基于对象的警告作为对象,而以前它传递的是对该对象的字符串化的结果。
$0
的赋值使用 prctl() 设置了传统的进程名称在 Linux 上,除了通过 argv[0]
更改 POSIX 名称外,传统的进程名称现在还使用 prctl(2) 设置,正如 Perl 从 4.000 版本开始所做的那样。现在,读取传统进程名称的系统实用程序(如 ps、top 和 killall)可以识别您在将 $0
赋值时设置的名称。您提供的字符串将在 16 个字节处被截断;此限制是由 Linux 强加的。
这允许需要具有可重复结果的程序不必自己创建种子生成机制。相反,它们可以使用 srand() 并存储返回值以供将来使用。一个例子是测试程序,其组合太多,无法在每次运行的可用时间内进行全面测试。它可以每次测试一个随机子集,如果出现故障,则记录用于该运行的种子,以便稍后使用它来生成相同的结果。
Perl 的 printf 和 sprintf 运算符以及 Perl 的内部 printf 替换函数现在理解 C90 尺寸修饰符“hh”(char
)、“z”(size_t
)和“t”(ptrdiff_t
)。此外,当使用 C99 编译器编译时,Perl 现在理解尺寸修饰符“j”(intmax_t
)(但这不可移植)。
因此,例如,在任何现代机器上,sprintf("%hhd", 257)
返回“1”。
${^GLOBAL_PHASE}
添加了一个新的全局变量 ${^GLOBAL_PHASE}
,以允许内省 Perl 解释器的当前阶段。它在 "${^GLOBAL_PHASE}" in perlvar 和 "BEGIN, UNITCHECK, CHECK, INIT and END" in perlmod 中有详细说明。
-d:-foo
调用 Devel::foo::unimport
语法 -d:foo 在 5.6.1 中扩展,使 -d:foo=bar 等效于 -MDevel::foo=bar,它在内部扩展为 use Devel::foo 'bar'
。Perl 现在允许在模块名称前添加 -,其语义与 -M 相同;也就是说
-d:-foo
等效于 -M-Devel::foo:扩展为 no Devel::foo
,如果该方法存在,则调用 Devel::foo->unimport()
。
-d:-foo=bar
等效于 -M-Devel::foo=bar:扩展为 no Devel::foo 'bar'
,如果该方法存在,则调用 Devel::foo->unimport("bar")
。
这对于在加载 Devel::*
模块的 import
方法以进行调试时,抑制其默认操作特别有用。
当对文件句柄的某个方法调用由于无法解析该方法且未加载 IO::File 而导致死亡时,Perl 现在通过 require
加载 IO::File 并再次尝试解析方法。
open my $fh, ">", $file;
$fh->binmode(":raw"); # loads IO::File and succeeds
这也适用于诸如 STDOUT
、STDERR
和 STDIN
之类的全局变量。
STDOUT->autoflush(1);
由于这种按需加载仅在方法解析失败时才会发生,因此手动加载 IO::File 父类以获得部分方法支持的传统方法仍然按预期工作。
use IO::Handle;
open my $fh, ">", $file;
$fh->autoflush(1); # IO::File not loaded
Socket
模块为 IPv6 提供了新的功能,包括 Socket::getaddrinfo()
和 Socket::getnameinfo()
函数的实现,以及相关的常量和一些新函数。请参阅 Socket。
DTrace
探针现在包含一个额外的参数 arg3
,其中包含正在进入或离开的子程序的编译包。
例如,使用以下 DTrace 脚本
perl$target:::sub-entry
{
printf("%s::%s\n", copyinstr(arg0), copyinstr(arg3));
}
然后运行
$ perl -e 'sub test { }; test'
DTrace
将打印
main::test
请参阅 "内部更改"。
"perlunicode 中的“用户定义字符属性”" 文档中说明,您可以通过定义以“In”或“Is”开头的子例程来创建自定义属性。但是,Perl 实际上并没有强制执行该命名限制,因此如果存在 foo::bar(),则 \p{foo::bar}
可以调用它。现在强制执行了记录的约定。
此外,Perl 不再允许受污染的正则表达式调用用户定义的属性。它只是直接报错 [perl #82616]。
Perl 5.14.0 与任何以前的稳定版本不兼容。
除了以下部分,请参阅 "C API 更改"。
在 Unicode 规则下,某些字符在 /i
正则表达式匹配中匹配两个或三个字符的序列。一个例子是 LATIN SMALL LETTER SHARP S
,它匹配序列 ss
。
'ss' =~ /\A[\N{LATIN SMALL LETTER SHARP S}]\z/i # Matches
但是,这会导致非常反直觉的结果,尤其是在反转时。因此,Perl 5.14 在反转的字符类中不使用多字符 /i
匹配。
'ss' =~ /\A[^\N{LATIN SMALL LETTER SHARP S}]+\z/i # ???
这应该匹配任何不是 SHARP S
以及 SHARP S
在 /i
下匹配的字符序列。"s"
不是 SHARP S
,但 Unicode 说 "ss"
是 SHARP S
在 /i
下匹配的。那么哪个“获胜”?由于字符串包含 ss
导致匹配失败,还是由于包含 s
后面跟着另一个 s
导致匹配成功?
早期版本的 Perl 确实允许这种多字符匹配,但由于存在 bug,它大多不起作用。
在某些情况下,正则表达式中的 \400
-\777
的行为与它们在所有其他类似双引号的上下文中不同。从 5.10.1 开始,Perl 在发生这种情况时发出弃用警告。现在,这些字面量在所有类似双引号的上下文中行为相同,即等效于 \x{100}
-\x{1FF}
,并且没有弃用警告。
命令行选项 -0 中使用 \400
-\777
保留其传统含义。它们会将整个输入文件读入内存;以前,这仅针对 -0777 文档化。
由于存在各种歧义,您应该使用新的 \o{...}
结构来用八进制表示字符。
\p{}
属性现在不受大小写不敏感匹配的影响对于大多数 Unicode 属性,让它们在 /i
大小写不敏感匹配下匹配不同没有意义。这样做会导致意外结果和潜在的安全漏洞。例如
m/\p{ASCII_Hex_Digit}+/i
以前可以匹配非 ASCII 字符,因为使用了 Unicode 匹配规则(尽管存在一些错误)。现在,在 /i
下的匹配与非 /i
匹配的结果相同,除了少数几个人们期望有差异的属性,即大小写是其含义的组成部分的属性,例如 m/\p{Uppercase}/i
和 m/\p{Lowercase}/i
,它们都匹配与 m/\p{Cased}/i
匹配的相同代码点。详细信息请参见 "perlrecharclass 中的 Unicode 属性"。
需要在 /i
下进行不同匹配的用户定义属性处理程序必须更改为读取传递给它们的新布尔参数,如果区分大小写匹配生效,则该参数为非零值,否则为 0。请参见 "perlunicode 中的用户定义字符属性"。
在模式中指定 Unicode 属性表示该模式旨在根据 Unicode 规则进行匹配,就像 \N{NAME}
一样。
在 use locale
下编译的正则表达式现在在插值到在 use locale
之外编译的新正则表达式时保留此特性,反之亦然。
以前,一个正则表达式插值到另一个正则表达式会继承周围正则表达式的本地性,从而丢失其最初具有的任何状态。这被认为是一个错误修复,但可能会影响依赖于错误行为的代码。
默认的正则表达式修饰符现在使用 (?^...)
表示。依赖于旧字符串化的代码将失败。这样做是为了当添加新的修饰符时,此类代码不必每次都更改,因为字符串化将自动包含新的修饰符。
需要与旧式和新式正则表达式一起正常工作的代码可以通过使用以下方法来避免整个问题(对于 5.9.5 之后的 perl 版本;请参见 re)
use re qw(regexp_pattern);
my ($pat, $mods) = regexp_pattern($re_ref);
如果实际的字符串化很重要或需要支持旧版本的 Perl,可以使用以下方法
# Accept both old and new-style stringification
my $modifiers = (qr/foobar/ =~ /\Q(?^/) ? "^" : "-xism";
然后使用 $modifiers
而不是 -xism
。
正则表达式中的代码块((?{...})
和 (??{...})
)以前不会继承语义(严格、警告等),如果正则表达式是在运行时编译的,就像下面这两个例子一样
use re "eval";
$foo =~ $bar; # when $bar contains (?{...})
$foo =~ /$bar(?{ $finished = 1 })/;
此错误现已修复,但依赖于错误行为的代码可能需要修复以适应正确的行为。
在以下情况下
tie @a, ...;
{
local @a;
# here, @a is a now a new, untied array
}
# here, @a refers again to the old, tied array
早期版本的 Perl 错误地绑定了新的本地数组。现在已修复此问题。但是,此修复可能会导致某些代码的行为发生变化。
defined %Foo::
现在始终返回 true,即使该包中尚未定义任何符号。
这是从令牌器中删除特殊情况 kludge 的副作用,该 kludge 是为 5.10.0 添加的,以隐藏对哈希内部存储的更改的副作用。此修复极大地减少了哈希的内存开销。
自 5.6.0 起,对存储区调用 defined 已被弃用,自 5.6.0 起对词法变量发出警告,自 5.12.0 起对存储区和其他包变量发出警告。defined %hash
一直暴露了一个实现细节:通过删除哈希中的所有条目来清空哈希不会使 defined %hash
成为 false。因此,defined %hash
不是用于确定任意哈希是否为空的有效代码。相反,请使用空 %hash
在标量上下文中始终返回 false 的行为。
存储区列表赋值 %foo:: = ()
以前会在清空存储区时将其临时设为匿名。因此,任何在其他地方引用的子例程都将变为匿名,在 caller
中显示为“(unknown)”。它们现在保留其包名称,以便如果仍然存在对其类型全局的引用,caller
将返回原始子例程名称,否则返回“foo::__ANON__” [perl #79208]。
如果您将类型全局分配给标量变量
$glob = *foo;
复制到 $glob
的全局将用一个特殊标志标记,该标志指示全局只是一个副本。这允许后续对 $glob
的赋值覆盖全局。但是,原始全局是不可变的。
一些 Perl 运算符没有区分这两种类型的 glob。这会导致边缘情况下的奇怪行为:untie $scalar
不会取消绑定标量,如果最后分配给它的值是一个 glob(因为它将其视为 untie *$scalar
,这会取消绑定句柄)。分配给 glob 槽(例如 *$glob = \@some_array
)只会将 \@some_array
分配给 $glob
。
为了解决这个问题,*{}
运算符(包括其 *foo
和 *$foo
形式)已被修改,如果其操作数是 glob 副本,则会创建一个新的不可变 glob。这允许区分 glob 和标量的运算符被修改为仅将不可变 glob 视为 glob。(tie
、tied
和 untie
为了兼容性而保留,但会发出警告。参见 "弃用"。)
这会导致将 glob 分配给 *{}
的返回值的代码发生不兼容的更改,当该运算符传递了一个 glob 副本时。例如,以下代码
$glob = *foo;
*$glob = *bar;
第二行上的 *$glob
返回一个新的不可变 glob。该新 glob 被设置为 *bar
的别名。然后它被丢弃。因此,第二次赋值没有效果。
有关更多详细信息,请参见 https://github.com/Perl/perl5/issues/10625。
在以前的 Perl 版本中,像 $!
、%SIG
等等的魔法变量会“泄漏”到其他包中。因此,%foo::SIG
可以用来访问信号,${"foo::!"}
(在关闭严格模式的情况下)用来访问 C 的 errno
等等。
这是一个错误,或者是一个“无意”的功能,它会导致各种不良影响,例如在加载模块时信号处理程序被清除等等。
这个问题已经得到修复(或者该功能已被移除,取决于你的看法)。
标量变量上的 local() 会赋予它们一个新值,但会保留所有魔法。这对于默认标量变量 $_ 来说已被证明是有问题的,在 perlsub 中建议,任何分配给 $_ 的子程序都应该先对其进行本地化。如果 $_ 与只读变量别名,这将抛出异常,并且通常会导致各种意想不到的副作用。
因此,作为一般规则的例外,local($_) 不仅会为 $_ 赋值,还会删除其所有现有的魔法。
解析包名和包变量名的方式已更改:现在,多个相邻的冒号对,如 foo::::bar
,都被视为包分隔符。
无论此更改如何,包分隔符的精确解析从未得到保证,并且可能会在将来的 Perl 版本中发生变化。
given
返回值given
块现在返回最后一个计算的表达式,如果块通过 break
退出,则返回空列表。因此,您现在可以编写
my $type = do {
given ($num) {
break when undef;
"integer" when /^[+-]?[0-9]+$/;
"float" when /^[+-]?[0-9]+(?:\.[0-9]+)?$/;
"unknown";
}
};
有关详细信息,请参阅 "perlsyn 中的返回值"。
使用以下原型声明的函数现在可以正确地作为一元函数运行
*
\$ \% \@ \* \&
\[...]
;$ ;*
;\$ ;\% etc.
;\[...]
由于此错误修复 [perl #75904],使用 (*)
、(;$)
和 (;*)
原型的函数的解析优先级高于以前。因此,在以下示例中
sub foo(;$);
foo $a < $b;
第二行现在被正确地解析为 foo($a) < $b
,而不是 foo($a < $b)
。当这些运算符之一在未加括号的参数中使用时,就会发生这种情况
< > <= >= lt gt le ge
== != <=> eq ne cmp ~~
&
| ^
&&
|| //
.. ...
?:
= += -= *= etc.
, =>
以前,以下代码会导致成功匹配
my @a = qw(a y0 z);
my @b = qw(a x0 z);
@a[0 .. $#b] ~~ @b;
此奇怪的行为现已修复 [perl #77468]。
一元否定运算符 -
现在将看起来像数字的字符串视为数字 [perl #57706]。
负零 (-0.0) 转换为字符串后,现在在所有平台上都变为 "0"。它过去在某些平台上变为 "-0",但在其他平台上变为 "0"。
如果您仍然需要确定零是否为负数,请使用 sprintf("%g", $zero) =~ /^-/
或 CPAN 上的 Data::Float 模块。
:=
现在是语法错误以前 my $pi := 4
与 my $pi : = 4
完全等效,:
被视为属性列表的开始,在 =
之前结束。在 5.12.0 中,使用 :=
表示 : =
已被弃用,现在是语法错误。这允许将来使用 :=
作为新的标记。
除了核心测试之外,我们在 CPAN 上没有发现使用这种构造的 Perl 5 代码,因此我们认为此更改对现实世界中的代码库影响很小。
如果绝对有必要使用空属性列表(例如,由于代码生成器),只需在 =
之前添加一个空格来避免错误。
Unicode "XIDStart" 集之外的字符不再允许作为标识符的开头。这意味着某些通常跟随字母字符的重音符号和标记可能不再是标识符的第一个字符。
在没有 fchdir
函数的非 Windows 系统上,新创建的线程不再从其父线程继承目录句柄。此类程序通常会崩溃 [perl #75154]。
close
为了避免死锁,close
函数不再等待子进程退出,如果底层文件描述符仍在其他线程中使用。在这种情况下,它将返回 true。
在 Windows 上,父进程不会终止,直到所有派生的子进程都先终止。但是,kill("KILL", ...)
在伪进程上本质上是不稳定的,并且如果子进程在系统调用中被阻塞,则 kill("TERM", ...)
可能不会被传递。
为了避免死锁并提供一种安全机制来终止托管进程,Perl 现在不再等待已发送 SIGTERM 信号的子进程。父进程有责任等待这些子进程,如果必须允许子进程清理处理完成。但是,父进程也有责任通过确保子进程不会被阻塞在 I/O 上来避免死锁。
有关 Windows 上 fork() 模拟的更多信息,请参阅 perlfork。
Policy_sh.SH 中的几个长期存在的拼写错误和命名混淆已得到修复,标准化了 config.sh 中使用的变量名称。
如果您碰巧依赖于其不正确的行为,这将改变 Policy.sh 的行为。
为了使用 ByteLoader 模块(不再是 Perl 核心的一部分),Perl 脚本在 Windows 上以前是以二进制模式读取的。这会造成对 DATA
文件句柄的各种操作出现问题,包括 seek()/tell(),甚至是在文件句柄被 system()、反引号、fork() 等调用刷新后简单地从 DATA
中读取。
Windows 的默认构建选项已更改为现在以文本模式读取 Windows 上的 Perl 源代码。 ByteLoader 将(希望)在 CPAN 上更新以自动处理这种情况 [perl #28106]。
另请参阅 "已弃用的 C API"。
省略正则表达式运算符或其修饰符与其后的词之间的空格已被弃用。例如,m/foo/sand $bar
目前仍然被解析为 m/foo/s and $bar
,但现在会发出警告。
\cX
反斜杠-c 结构被设计为指定不可打印字符的一种方式,但对 c
后的字符没有限制(在 ASCII 平台上)。现在,如果该字符不是 ASCII 字符,则会发出弃用警告。此外,对于 "\c{"
(与简单地说 ";"
相同)也会发出弃用警告。
"\b{"
和 "\B{"
在正则表达式中,紧跟在 "\b"
(不在方括号字符类中)或 "\B{"
后的字面量 "{"
现在已被弃用,以便 Perl 本身将来可以使用它。
Perl 包含一些早于 Perl 5 的库文件。现在,大多数这些文件的捆绑已被弃用,这些文件现在可以在 CPAN 上获得。如果这些文件作为核心的一部分安装,则在运行时会发出警告。
这是一个强制性警告,不遵守 -X 或词法警告位。该警告的模型是 deprecate.pm 为核心中的已弃用 .pm 库提供的警告。它指向包含 .pl 库的特定 CPAN 发行版。当然,CPAN 版本不会生成警告。
$[
将值赋予 $[
已被弃用,并在 Perl 版本 5.12.0 中开始发出警告。此版本的 Perl (5.14) 现在在列表上下文中将值赋予 $[
时也会发出警告。这修正了 5.12.0 中的疏漏。
从历史上看,解析器会误以为 qw(...)
字面量始终包含在括号中,因此您有时可以省略它们周围的括号。
for $x qw(a b c) { ... }
解析器不再以这种方式欺骗自己。将列表字面量用括号括起来,例如:
for $x (qw(a b c)) { ... }
之所以弃用此功能,是因为 for $i (1,2,3) { ... }
中的括号不是表达式语法的一部分。它们是语句语法的一部分,for
语句需要字面量括号。qw
表达式获得的合成括号仅用于作为表达式语法的一部分。
请注意,这不会改变类似以下情况的行为:
use POSIX qw(setlocale localeconv);
our @EXPORT = qw(foo bar baz);
在这些情况下,表达式周围从未需要括号。
\N{BELL}
这是因为 Unicode 使用该名称来表示不同的字符。有关更多解释,请参阅 "Unicode 版本 6.0 现在已支持(大部分)"。
?PATTERN?
?PATTERN?
(没有初始的 m
)已被弃用,现在会产生警告。这是为了允许在新的运算符中将来使用 ?
。一次匹配功能仍然可以使用 m?PATTERN?
。
使用标量参数调用绑定函数(tie
、tied
、untie
)会在标量恰好保存类型全局变量时作用于文件句柄。
这是一个长期存在的错误,将在 Perl 5.16 中移除,因为目前没有办法在标量包含类型全局变量时绑定标量本身,也没有办法解除绑定已分配类型全局变量的标量。
现在,每当在没有显式 `*` 的句柄上使用 tie 函数时,都会出现弃用警告。
此功能由于其许多问题而被弃用,如 "perlunicode 中的用户定义大小写映射(仅供高级黑客使用)" 中所述。此功能将在 Perl 5.16 中移除。请改用 CPAN 模块 Unicode::Casing,它提供了改进的功能。
以下模块将在未来版本中从核心发行版中移除,应从 CPAN 安装。CPAN 上需要此模块的发行版应将其添加到其先决条件中。这些模块的核心版本现在会发出弃用警告。
如果您发布了 Perl 的打包版本,无论是单独发布还是作为更大系统的一部分,那么您应该仔细考虑核心模块弃用的影响。您可能需要考虑将您的默认 Perl 构建与一个用于弃用模块的包一起发布,该包安装到 `vendor` 或 `site` Perl 库目录中。这将抑制弃用警告。
或者,您可能需要考虑修补 `lib/deprecate.pm` 以提供特定于您的打包系统或 Perl 发行版的弃用警告,与您的打包系统或发行版如何管理从单个包提供给定功能的版本到系统管理员需要知道安装多个包才能获得相同功能的版本的过渡阶段一致。
您可以通过从 CPAN 安装有问题的模块来消除这些弃用警告。要按角色而不是按名称安装其最新版本,只需安装 `Task::Deprecations::5_14`。
我们强烈建议您安装并使用 Devel::NYTProf 而不是 Devel::DProf,因为 Devel::NYTProf 提供了显着改进的性能分析和报告功能。
信号调度已从运行循环移至控制操作。这应该会带来百分之几的速度提升,并且消除了在 5.8.0 中引入 "安全信号" 导致的几乎所有速度损失。信号应该仍然在与以前相同的语句中调度。如果这种情况没有发生,或者如果您发现可以创建不可中断的循环,那么这是一个错误,鼓励报告如何重现此类问题。
对于没有参数(隐式 `@_`)的 shift() 和 pop() 调用,使用了两个更少的 OP。此更改使 shift() 在非线程化的 perl 上比 `shift @_` 快 5%,在线程化的 perl 上快 25%。
用于字符串不区分大小写比较的 foldEQ_utf8
API 函数(正则表达式引擎大量使用)进行了实质性的重构和优化,并且作为免费赠品,其文档也得到了很大改进。
当需要将正则表达式升级到 utf8 时,编译正则表达式速度更快,但在编译开始时并不知道这一点。
在进行大量字符串追加时,构建为使用系统 malloc
的 Perl 可能会以低效的方式最终分配比需要的更多的内存。
sv_grow
是用于在追加到字符串时在必要时分配更多内存的函数,它已被教会将它请求的内存向上舍入到某个几何级数,使其在某些平台和配置上速度更快。在 Win32 上,它现在快了大约 100 倍。
PL_*
访问器函数当 MULTIPLICITY
首次开发时,解释器状态被移入解释器结构体,线程和解释器局部 PL_*
变量被定义为宏,这些宏调用访问器函数(返回值的地址)在 Perl 核心之外。目的是允许解释器结构体内的成员更改大小而不破坏二进制兼容性,以便可以将错误修复合并到需要这种大小更改的维护分支。这种机制是多余的,并且会惩罚行为良好的代码。它已被删除。
当存在许多对某个对象的弱引用时,在某些情况下,释放该对象可能需要 O(N*N) 时间才能释放,其中 N 是引用的数量。发生这种情况的情况已减少 [perl #75254]
早期的优化旨在加速 my @array = ...
和 my %hash = ...
赋值,但导致了一个 bug,并在 Perl 5.12.0 中被禁用。
现在我们找到了另一种加速这些赋值的方法 [perl #82110]。
@_
使用更少的内存以前,@_
在编译时为每个子程序分配了足够容纳四个条目的空间。现在,这种分配是在子程序被调用时按需进行的 [perl #72416]。
xhv_fill
已从 struct xpvhv
中移除,为每个哈希节省了 1 个 IV,并且在某些系统上会使 struct xpvhv
变得缓存对齐。为了避免这种内存节省导致其他地方的性能下降,HvFILL
的布尔值使用现在改为调用 HvTOTALKEYS
(等效),因此,虽然实际需要时填充数据现在是按需计算的,但需要进行此操作的情况应该很少见。
SV 主体中结构元素的顺序已更改。实际上,NV 槽已与 STASH 和 MAGIC 交换位置。由于对 SV 成员的所有访问都是通过宏进行的,因此这应该是完全透明的。此更改允许上面记录的 PVHV 的空间节省,并且可能会减少某些架构上 PVIV 所需的内存分配。
XPV
、XPVIV
和 XPVNV
现在只分配它们实际使用的 SV
主体部分,节省了一些空间。
包含正则表达式的标量现在只分配它们实际使用的 SV
主体部分,节省了一些空间。
@EXPORT_FAIL
AV 只有在需要时才会创建,因此支持它的 typeglob 也不会创建。这为每个使用 Exporter 但不使用此功能的包节省了大约 200 字节。
对于弱引用,每个被引用者只有一个弱引用的常见情况已进行了优化,以减少所需的存储空间。在这种情况下,它节省了相当于每个被引用者一个小型 Perl 数组的空间。
%+
和 %-
使用更少的内存Tie::Hash::NamedCapture
模块的大部分内容以前位于 Perl 核心代码中。现在它已移至 XS 模块,以减少不使用 %+
或 %-
的程序的开销。
线程的内部结构现在减少了 API 调用和分配,从而导致对象代码明显更小。此外,许多线程上下文检查已被推迟,因此它们仅在需要时才执行(尽管这仅适用于非调试版本)。
以前,在以下代码中
use constant DEBUG => 0;
sub GAK {
warn if DEBUG;
print "stuff\n";
}
warn if DEBUG
的操作将折叠为 null
操作(ex-const
),但 nextstate
操作将保留,导致 nextstate
、nextstate
等的运行时操作调度。
执行一系列nextstate
操作与仅执行最后一个nextstate
操作的效果相同,因此 peephole 优化器现在会消除一对nextstate
操作中的第一个,除非第一个操作带有标签,因为标签不能被优化器消除,并且标签的使用情况在编译时无法确定。
CPAN::Meta::YAML 0.003 已被添加为双重生命周期模块。它支持 YAML 的一个子集,足以用于读取和写入 CPAN 发行版中包含的或由模块安装工具链生成的 META.yml 和 MYMETA.yml 文件。它不应用于任何其他通用的 YAML 解析或生成任务。
CPAN::Meta 版本 2.110440 已被添加为双重生命周期模块。它提供了一个标准库来读取、解释和写入 CPAN 发行版元数据文件(如 META.json 和 META.yml),这些文件描述了发行版、其内容以及构建和安装它的要求。最新的 CPAN 发行版元数据规范包含在 CPAN::Meta::Spec 中,有关规范随时间变化的说明在 CPAN::Meta::History 中给出。
HTTP::Tiny 0.012 已被添加为双重生命周期模块。它是一个非常小巧、简单的 HTTP/1.1 客户端,专为简单的 GET 请求和文件镜像而设计。它被添加是为了使 CPAN.pm 和 CPANPLUS 能够使用纯 Perl “引导” 对 CPAN 的 HTTP 访问,而无需依赖外部二进制文件,如 curl(1) 或 wget(1)。
JSON::PP 2.27105 已被添加为双重生命周期模块,以允许 CPAN 客户端读取 CPAN 发行版中的 META.json 文件。
Module::Metadata 1.000004 已被添加为双重生命周期模块。它从 Perl 模块文件中收集包和 POD 信息。它是一个独立的模块,基于 Module::Build::ModuleInfo,供其他模块安装工具链组件使用。 Module::Build::ModuleInfo 已被弃用,取而代之的是此模块。
Perl::OSType 1.002 已被添加为双重生命周期模块。它将 Perl 操作系统名称(如“dragonfly”或“MSWin32”)映射到具有标准化名称的更通用的类型(如“Unix”或“Windows”)。它已从 Module::Build 和 ExtUtils::CBuilder 中重构出来,并将此类映射整合到一个位置,以便于维护。
以下模块由 Unicode::Collate 升级添加。有关详细信息,请参见下文。
Version::Requirements 版本 0.101020 已被添加为双重生命周期模块。它提供了一个标准库来建模和操作在 CPAN::Meta::Spec 中定义的模块先决条件和版本约束。
attributes 已从版本 0.12 升级到 0.14。
Archive::Extract 已从版本 0.38 升级到 0.48。
自 0.38 以来更新包括:一个安全的打印方法,可以保护 Archive::Extract 免受对 $\
的更改;在核心 Perl 中运行时对测试的修复;对 TZ 文件的支持;对 lzma 逻辑的修改,以支持 IO::Uncompress::Unlzma;以及针对 NetBSD-current 及其新的 unzip(1) 可执行文件的问题的修复。
Archive::Tar 已从版本 1.54 升级到 1.76。
自 1.54 以来重要的更改包括以下内容
与 busybox 实现的 tar(1) 兼容。
修复了 write() 和 create_archive() 仅关闭它们自己打开的文件句柄的问题。
修复了有关 extract_archive 的退出代码的错误。
ptar(1) 实用程序有一个新的选项,允许在 Windows 上安全创建 tar 包,而不会创建世界可写文件,从而允许将这些存档上传到 CPAN。
一个新的 ptargrep(1) 实用程序,用于对 tar 存档中文件的内容使用正则表达式。
pax 扩展头现在被跳过。
Attribute::Handlers 已从版本 0.87 升级到 0.89。
autodie 已从版本 2.06_01 升级到 2.1001。
AutoLoader 已从版本 5.70 升级到 5.71。
B 模块已从版本 1.23 升级到 1.29。
它不再在拆解包含八位字节范围之外的字符或在 use utf8
范围内编译的 y///
时崩溃。
共享对象的尺寸已减少约 40%,功能没有减少。
B::Concise 已从版本 0.78 升级到 0.83。
B::Concise 将 rv2sv()、rv2av() 和 rv2hv() 操作标记为新的 OPpDEREF
标志为“DREFed”。
它不再使用 -tree 选项生成混淆的输出 [perl #80632]。
B::Debug 已从版本 1.12 升级到 1.16。
B::Deparse 已从版本 0.96 升级到 1.03。
当 nextstate
操作同时具有相对于先前 nextstate 的包更改,或 %^H
或其他状态更改和标签时,其反解析方式已更改。以前标签先被发出,但现在最后发出 (5.12.1)。
no 5.13.2
或类似形式现在由 B::Deparse 正确处理 (5.12.3)。
B::Deparse 现在可以正确处理将条件模式匹配应用于隐式 $_
的代码,因为它已在 [perl #20444] 中修复。
our
后跟带有奇怪字符的变量的反解析也已修复,这些字符在 use utf8
编译指示下是允许的 [perl #33752]。
B::Lint 已从版本 1.11_01 升级到 1.13。
base 已从版本 2.15 升级到 2.16。
Benchmark 已从版本 1.11 升级到 1.12。
bignum 已从版本 0.23 升级到 0.27。
Carp 已从版本 1.15 升级到 1.20。
Carp 现在可以检测到不完整的 caller() 覆盖,并避免使用虚假的 @DB::args
。为了提供回溯,Carp 依赖于 caller() 内置函数的特定行为。 Carp 现在可以检测到其他代码是否使用不完整的实现覆盖了它,并相应地修改其回溯。以前不完整的覆盖会导致回溯中的错误值(最佳情况),或掩盖致命错误(最坏情况)。
这修复了由模块错误地覆盖 caller() 导致的某些“ARRAY 的奇怪副本”情况 (5.12.2)。
它现在还避免使用导致 Perl 加载其 Unicode 表的正则表达式,以避免在出现语法错误时出现的“BEGIN 在错误后不安全”错误 [perl #82854]。
CGI 已从版本 3.48 升级到 3.52。
此版本包含以下安全修复:multipart_init() 中的 MIME 边界现在是随机的,并且对嵌入在标头值中的换行符的处理已得到改进。
Compress::Raw::Bzip2 已从版本 2.024 升级到 2.033。
此版本已更新为使用 bzip2(1) 1.0.6。
Compress::Raw::Zlib 已从版本 2.024 升级到 2.033。
constant 已从版本 1.20 升级到 1.21。
Unicode 常量再次可用。自 Perl 5.10.0 [CPAN RT #67525] 以来,它们一直无法使用。
CPAN 已从版本 1.94_56 升级到 1.9600。
主要亮点
配置对话框的麻烦大大减少
支持 META/MYMETA.json
支持 local::lib
支持 HTTP::Tiny 以减少对 FTP 站点的依赖
自动镜像选择
修复 configure_requires 中所有已知的错误
支持使用 bzip2(1) 压缩的发布
允许命令行上的 Foo/Bar.pm 代表 Foo::Bar
CPANPLUS 已从版本 0.90 升级到 0.9103。
对 cpanp-run-perl 的更改解决了 RT #55964 和 RT #57106,这两个问题都与使用 Module::Install::DSL
(5.12.2) 的发布安装失败有关。
对 Config 的依赖未被识别为核心模块依赖。此问题已修复。
CPANPLUS 现在包含对 META.json 和 MYMETA.json 的支持。
CPANPLUS::Dist::Build 已从版本 0.46 升级到 0.54。
Data::Dumper 已从版本 2.125 升级到 2.130_02。
当设置 $Data::Dumper::Terse
时,缩进以前是错误的。此问题已修复 [perl #73604]。
此升级还修复了在使用可能导致堆栈更改的自定义排序函数时发生的崩溃 [perl #74170]。
Dumpxs 不会再因 *$io_ref
返回的全局变量而崩溃 [perl #72332]。
DB_File 已从版本 1.820 升级到 1.821。
DBM_Filter 已从版本 0.03 升级到 0.04。
Devel::DProf 已从版本 20080331.00 升级到 20110228.00。
现在,仅仅加载 Devel::DProf 不会再触发分析器启动。use Devel::DProf
和 perl -d:DProf ...
的行为与之前相同,并启动分析器。
注意:Devel::DProf 已被弃用,将在 Perl 的未来版本中移除。我们强烈建议您安装并使用 Devel::NYTProf,因为它提供了显著改进的分析和报告功能。
Devel::Peek 已从版本 1.04 升级到 1.07。
Devel::SelfStubber 已从版本 1.03 升级到 1.05。
diagnostics 已从版本 1.19 升级到 1.22。
现在它可以更好地渲染 pod 链接,并且学会了为与其他消息共享描述的消息查找描述。
Digest::MD5 已从版本 2.39 升级到 2.51。
现在可以安全地在与线程结合的情况下使用此模块。
Digest::SHA 已从版本 5.47 升级到 5.61。
shasum
现在更接近于模仿 sha1sum(1)/md5sum(1)。
addfile
接受所有 POSIX 文件名。
新的 SHA-512/224 和 SHA-512/256 变换(参考 NIST 草案 FIPS 180-4 [2011 年 2 月])
DirHandle 已从版本 1.03 升级到 1.04。
Dumpvalue 已从版本 1.13 升级到 1.16。
DynaLoader 已从版本 1.10 升级到 1.13。
它修复了当传递非常长的文件名时出现的缓冲区溢出问题。
它不再继承自 AutoLoader;因此,它不再对从 DynaLoader 继承的类的失败方法调用产生奇怪的错误消息 [perl #84358]。
Encode 已从版本 2.39 升级到 2.42。
现在,所有 66 个 Unicode 非字符都以与 U+FFFF 一直以来的相同方式处理:在不允许的情况下,所有 66 个都不允许,而在发出警告的情况下,所有 66 个都会发出警告。
Env 已从版本 1.01 升级到 1.02。
Errno 已从版本 1.11 升级到 1.13。
Errno 的实现已经重构,以减少大约 55% 的内存使用。
在某些具有非标准头文件的平台上,例如使用 mingw64
头文件的 Win32 gcc(1),一些实际上不是错误号的常量已被 Errno 公开。这个问题已经修复 [perl #77416]。
Exporter 已从版本 5.64_01 升级到 5.64_03。
导出器不再覆盖$SIG{__WARN__}
[perl #74472]
ExtUtils::CBuilder 已从版本 0.27 升级到 0.280203。
ExtUtils::Command 已从版本 1.16 升级到 1.17。
ExtUtils::Constant 已从 0.22 升级到 0.23。
由 ExtUtils::Constant::ProxySubs
生成的 AUTOLOAD 辅助代码现在可以为缺失的常量 croak(),或者在 XS 中生成完整的 AUTOLOAD
子例程,从而简化许多使用它的模块(Fcntl、File::Glob、GDBM_File、I18N::Langinfo、POSIX、Socket)。
ExtUtils::Constant::ProxySubs 现在可以选择将所有常量的名称推送到包的 @EXPORT_OK
中。
ExtUtils::Install 已从版本 1.55 升级到 1.56。
ExtUtils::MakeMaker 已从版本 6.56 升级到 6.57_05。
ExtUtils::Manifest 已从版本 1.57 升级到 1.58。
ExtUtils::ParseXS 已从版本 2.21 升级到 2.2210。
Fcntl 已从版本 1.06 升级到 1.11。
File::Basename 已从版本 2.78 升级到 2.82。
File::CheckTree 已从版本 4.4 升级到 4.41。
File::Copy 已从版本 2.17 升级到 2.21。
File::DosGlob 已从版本 1.01 升级到 1.04。
它允许包含字面括号的模式:它们不再需要转义。在 Windows 上,当模式是带有驱动器规范的相对 glob(如 C:*.pl)时,它不再向返回的文件名添加额外的 ./ [perl #71712]。
File::Fetch 已从版本 0.24 升级到 0.32。
现在支持 HTTP::Lite 用于 "http" 方案。
在 FreeBSD、NetBSD 和 Dragonfly BSD 上,fetch(1) 实用程序支持 http
和 ftp
方案。
File::Find 已从版本 1.15 升级到 1.19。
它改进了对 Windows 上反斜杠的处理,因此不再生成像 C:\dir\/file 这样的路径 [perl #71710]。
File::Glob 已从版本 1.07 升级到 1.12。
File::Spec 已从版本 3.31 升级到 3.33。
在 File::Spec::VMS 中进行了一些可移植性修复:冒号现在被识别为本机文件规范中的分隔符;插入符号转义的分隔符被识别,以更好地处理扩展文件规范;如果输入目录名称为空,则 catpath() 返回空目录而不是当前目录;abs2rel() 正确处理 Unix 风格的输入 (5.12.2)。
File::stat 已从 1.02 升级到 1.05。
-x
和 -X
文件测试运算符现在在超级用户运行时可以正常工作。
Filter::Simple 已从版本 0.84 升级到 0.86。
GDBM_File 已从 1.10 升级到 1.14。
这修复了使用 DBM 过滤器时的内存泄漏。
Hash::Util 已从 0.07 升级到 0.11。
Hash::Util 在递归锁定具有未定义值的哈希时不再发出虚假的“未初始化”警告 [perl #74280]。
Hash::Util::FieldHash 已从版本 1.04 升级到 1.09。
I18N::Collate 已从版本 1.01 升级到 1.02。
I18N::Langinfo 已从版本 0.03 升级到 0.08。
langinfo() 现在默认使用 $_
,如果未给出参数,就像文档一直声称的那样。
I18N::LangTags 已从版本 0.35 升级到 0.35_01。
if 已从版本 0.05 升级到 0.0601。
IO 已从版本 1.25_02 升级到 1.25_04。
此版本的 IO 包含一个新的 IO::Select,它现在允许 IO::Handle 对象(以及派生类中的对象)从 IO::Select 集合中删除,即使底层文件描述符已关闭或无效。
IPC::Cmd 已从版本 0.54 升级到 0.70。
解决了拆分 Win32 命令行的问题。由单个字符“0”组成的参数以前被省略(CPAN RT #62961)。
IPC::Open3 已从 1.05 升级到 1.09。
如果 exec
调用失败,open3() 现在会产生错误,允许将此条件与以非零状态退出的子进程区分开来 [perl #72016]。
内部 xclose() 例程现在知道如何处理文件描述符,如文档所述,因此使用其文件描述符在子进程中复制 STDIN
现在可以工作 [perl #76474]。
IPC::SysV 已从版本 2.01 升级到 2.03。
lib 已从版本 0.62 升级到 0.63。
Locale::Maketext 已从版本 1.14 升级到 1.19。
Locale::Maketext 现在支持外部缓存。
此升级还修复了 Locale::Maketext::Guts::_compile()
在处理受污染的值时出现的无限循环 (CPAN RT #40727)。
->maketext
调用现在备份并恢复 $@
,因此不会抑制错误消息 (CPAN RT #34182)。
Log::Message 已从版本 0.02 升级到 0.04。
Log::Message::Simple 已从版本 0.06 升级到 0.08。
Math::BigInt 已从版本 1.89_01 升级到 1.994。
此更新修复了包括计算二项式系数时出现错误结果的问题 [perl #77640]。
它还防止了在 use bigrat
下 sqrt($int)
崩溃。[perl #73534]。
Math::BigInt::FastCalc 已从版本 0.19 升级到 0.28。
Math::BigRat 已从版本 0.24 升级到 0.26_02。
Memoize 已从版本 1.01_03 升级到 1.02。
MIME::Base64 已从 3.08 升级到 3.13。
包含用于计算编码和解码 Base64 字符串长度的新函数。
现在提供 encode_base64url()
和 decode_base64url()
函数来处理“URL 应用”的 Base64 方案。
Module::Build 已从版本 0.3603 升级到 0.3800。
一个显著的变化是几个模块的弃用。 Module::Build::Version 已被弃用,Module::Build 现在直接依赖于 version 语言特性。 Module::Build::ModuleInfo 已被弃用,取而代之的是一个独立的副本,名为 Module::Metadata。 Module::Build::YAML 已被弃用,取而代之的是 CPAN::Meta::YAML。
Module::Build 现在还根据 CPAN 分发元数据规范的版本 2,CPAN::Meta::Spec,生成 META.json 和 MYMETA.json 文件。旧格式的 META.yml 和 MYMETA.yml 文件仍然会生成。
Module::CoreList 已从版本 2.29 升级到 2.47。
除了列出此版本更新的核心模块外,它还停止列出 Filespec
模块。该模块从未存在于核心模块中。生成 Module::CoreList 的脚本将其与 VMS::Filespec 混淆,而 VMS::Filespec 实际上是 Perl 5.8.7 中的核心模块。
Module::Load 已从版本 0.16 升级到 0.18。
Module::Load::Conditional 已从版本 0.34 升级到 0.44。
mro 语言特性已从版本 1.02 升级到 1.07。
NDBM_File 已从版本 1.08 升级到 1.12。
这修复了使用 DBM 过滤器时的内存泄漏。
Net::Ping 已从版本 2.36 升级到 2.38。
NEXT 已从版本 0.64 升级到 0.65。
Object::Accessor 已从版本 0.36 升级到 0.38。
ODBM_File 已从版本 1.07 升级到 1.10。
这修复了使用 DBM 过滤器时的内存泄漏。
Opcode 已从版本 1.15 升级到 1.18。
overload 编译指示已从版本 1.10 升级到 1.13。
overload::Method
现在可以处理本身被祝福到重载类中的子例程 [perl #71998]。
文档已大幅改进。请参阅下面 "文档" 部分。
Params::Check 已从版本 0.26 升级到 0.28。
parent 编译指示已从版本 0.223 升级到 0.225。
Parse::CPAN::Meta 已从版本 1.40 升级到 1.4401。
最新的 Parse::CPAN::Meta 现在可以使用 CPAN::Meta::YAML 和 JSON::PP 读取 YAML 和 JSON 文件,它们现在是 Perl 核心的一部分。
PerlIO::encoding 已从版本 0.12 升级到 0.14。
PerlIO::scalar 已从 0.07 升级到 0.11。
在字符串末尾之后进行 seek() 后,read() 不会再认为它有数据要读取 [perl #78716]。
PerlIO::via 已从版本 0.09 升级到 0.11。
Pod::Html 已从版本 1.09 升级到 1.11。
Pod::LaTeX 已从版本 0.58 升级到 0.59。
Pod::Perldoc 已从版本 3.15_02 升级到 3.15_03。
Pod::Simple 已从版本 3.13 升级到 3.16。
POSIX 已从 1.19 升级到 1.24。
它现在包含 POSIX 信号常量的常量。
re 编译指示已从版本 0.11 升级到 0.18。
use re '/flags'
子编译指示是新的。
regmust() 函数在对属于可插拔引擎的正则表达式调用时,以前会崩溃。现在它会发出警告。
regmust() 不会再泄漏内存。
Safe 已从版本 2.25 升级到 2.29。
reval() 和 rdo() 返回的代码引用现在通过 wrap_code_refs() (5.12.1) 进行包装。
这修复了在查找代码引用时可能出现的无限循环。
它将几个 version::vxs::*
例程添加到默认共享中。
SDBM_File 已从版本 1.06 升级到 1.09。
SelfLoader 已从 1.17 升级到 1.18。
它现在可以在 taint 模式下工作 [perl #72062]。
sigtrap 编译指示已从版本 1.04 升级到 1.05。
它不再尝试在生成回溯时修改只读参数 [perl #72340]。
Socket 已从版本 1.87 升级到 1.94。
请参阅上面的 "改进的 IPv6 支持"。
Storable 已从版本 2.22 升级到 2.27。
包括对重载类的性能改进。
这增加了对正确序列化包含 UTF-8 字符串的代码引用的支持。由于此更改,Storable 的次要版本号已更改,这意味着将 $Storable::accept_future_minor
设置为 FALSE
值的 Storable 用户将看到错误(有关更多详细信息,请参阅 "Storable 中的 FORWARD COMPATIBILITY")。
如果 Perl 堆栈在冻结期间被重新分配,冻结将不再混淆 [perl #80074]。
Sys::Hostname 已从版本 1.11 升级到 1.16。
Term::ANSIColor 已从版本 2.02 升级到 3.00。
Term::UI 已从版本 0.20 升级到 0.26。
Test::Harness 已从版本 3.17 升级到 3.23。
Test::Simple 已从版本 0.94 升级到 0.98。
除了其他许多改进之外,没有 plan
或 no_plan
的子测试现在将添加一个隐式的 done_testing()。
Thread::Semaphore 已从版本 2.09 升级到 2.12。
它提供了两种新方法,可以更好地控制信号量的递减:down_nb
和 down_force
。
Thread::Queue 已从版本 2.11 升级到 2.12。
threads 语言特性已从版本 1.75 升级到 1.83。
threads::shared 语言特性已从版本 1.32 升级到 1.37。
Tie::Hash 已从版本 1.03 升级到 1.04。
调用 Tie::Hash->TIEHASH()
以前会无限循环。现在它会 croak
。
Tie::Hash::NamedCapture 已从版本 0.06 升级到 0.08。
Tie::RefHash 已从版本 1.38 升级到 1.39。
Time::HiRes 已从版本 1.9719 升级到 1.9721_01。
Time::Local 已从版本 1.1901_01 升级到 1.2000。
Time::Piece 已从版本 1.15_01 升级到 1.20_01。
Unicode::Collate 已从版本 0.52_01 升级到 0.73。
Unicode::Collate 已更新为使用 Unicode 6.0.0。
Unicode::Collate::Locale 现在支持大量新的语言环境:ar, be, bg, de__phonebook, hu, hy, kk, mk, nso, om, tn, vi, hr, ig, ja, ko, ru, sq, se, sr, to, uk, zh, zh__big5han, zh__gb2312han, zh__pinyin 和 zh__stroke。
已添加以下模块
Unicode::Collate::CJK::Big5 用于 zh__big5han
,它使 CJK 统一表意文字的排序按照 CLDR 的 big5han 排序进行定制。
Unicode::Collate::CJK::GB2312 用于 zh__gb2312han
,它根据 CLDR 的 gb2312han 排序对 CJK 统一表意文字进行排序。
Unicode::Collate::CJK::JISX0208 用于对 JIS X 0208 中的 6355 个汉字(CJK 统一表意文字)进行排序。
Unicode::Collate::CJK::Korean 用于根据 CLDR 的韩语排序对 CJK 统一表意文字进行排序。
Unicode::Collate::CJK::Pinyin 用于 zh__pinyin
,它根据 CLDR 的拼音排序对 CJK 统一表意文字进行排序。
Unicode::Collate::CJK::Stroke 用于 zh__stroke
,它根据 CLDR 的笔画排序对 CJK 统一表意文字进行排序。
这也标志着从使用纯 Perl 版本的该模块切换到 XS 版本。
Unicode::Normalize 已从 1.03 版升级到 1.10 版。
Unicode::UCD 已从 0.27 版升级到 0.32 版。
添加了一个新函数 Unicode::UCD::num()。此函数返回传递给它的字符串的数值,如果字符串整体没有“安全”数值,则返回 undef
。(有关更多详细信息以及“安全”的定义,请参阅 "num()" in Unicode::UCD。)
此升级还包括一些错误修复。
现在已更新到 Unicode 6.0.0 版,包含勘误表 #8,但与 Perl 5.14 一样,U+1F514 处的代码点没有名称。
韩语音节代码点具有正确的名称,并且它们的分解始终输出,无需安装 Lingua::KO::Hangul::Util。
现在正确处理了 CJK(中日韩)代码点 U+2A700 到 U+2B734 和 U+2B740 到 U+2B81D。
现在为具有数值的 CJK 代码点输出数值。
现在为具有多个别名的代码点输出的名称是已更正的名称。
现在对于未分配其他脚本的代码点的脚本,此函数正确返回“Unknown”,而不是 undef
。
现在对于未分配到其他块的代码点的块,此函数正确返回“No_Block”,而不是 undef
。
version 准则已从 0.82 版升级到 0.88 版。
由于一个已修复的错误,is_strict() 和 is_lax() 函数在导出时无法正常工作(5.12.1)。
警告 pragma 已从版本 1.09 升级到 1.12。
现在,在没有参数的情况下调用 use warnings
的效率显著提高。
警告 warnings::register pragma 已从版本 1.01 升级到 1.02。
现在可以使用 warnings::register 注册除包名以外的其他警告类别。有关更多信息,请参阅 perllexwarn(1)。
XSLoader 已从版本 0.10 升级到 0.13。
VMS::DCLsym 已从版本 1.03 升级到 1.05。
已修复两个错误 [perl #84086]
由于 TIEHASH
中的错误,在绑定哈希时符号表名称丢失。结果是所有绑定的哈希都与本地符号表交互。
除非在对构造函数的调用中显式指定了符号表名称,否则查询特殊键 :LOCAL
无法识别与本地符号表连接的对象。
Win32 模块已从版本 0.39 升级到 0.44。
此版本包含几个新函数:Win32::GetSystemMetrics()、Win32::GetProductInfo()、Win32::GetOSDisplayName()。
Win32::GetOSName() 和 Win32::GetOSDisplayName() 返回的名称已更正。
XS::Typemap 已从版本 0.03 升级到 0.05。
如 Perl 5.12.0 发行说明中所述,以下模块已从核心发行版中删除,如果需要,应从 CPAN 安装。
Class::ISA 已从 Perl 核心删除。先前版本为 0.36。
Pod::Plainer 已从 Perl 核心删除。先前版本为 1.02。
Switch 已从 Perl 核心删除。先前版本为 2.16。
删除 Shell 的操作已推迟到 5.14 之后,因为与 5.12.0 一起提供的 Shell 实现没有正确发出有关其将从核心删除的警告。
perlgpl 已更新,包含 GPL 版本 1,该版本包含在 Perl (5.12.1) 附带的 README 中。
Perl 5.12.1 到 5.12.3 的版本差异文件已从维护分支添加:perl5121delta,perl5122delta,perl5123delta。
POD 文档的新样式指南,主要从 pod2man(1) 手册页的 NOTES 部分拆分而来。
参见下面的 "perlhack 和 perlrepository 改进"。
Perl 5.12.0 附带的 perlmodlib 手册页缺少几个模块,因为生成列表的脚本存在错误。此错误已修复 [perl #74332] (5.12.1)。
perlebcdic 包含一个有用的表格,用于在 tr///
中转换 EBCDIC 和 Latin1/ASCII。虽然该表是其描述的表的反向,但使用该表的代码在给定的特定示例中可以正常工作。
该表已更正,示例代码也已更改以对应。
该表也已从八进制更改为十六进制,并且 pod 中的示例已更改为打印前导零,以使所有值具有相同的长度。
perlunicode 现在包含对如何覆盖、修改和以其他方式调整 Perl 处理 Unicode 数据的大写、小写和其他大小写转换的方式的解释,以及如何提供作用域更改以更改自己的代码的行为,而不会踩到其他人的代码。
这本来就是事实,但现在已正式记录在案 (5.12.2)。
\xHH
和 \oOOO
转义的解释perlop 已更新,包含对这两种字符转义的更详细解释。
在 perlrun 中,-0NNN 开关对于 -0400 或更高版本的行为已澄清 (5.12.2)。
perlpolicy 现在包含有关哪些补丁适用于维护分支的策略 (5.12.1)。
perlpolicy 现在包含了关于兼容性和弃用的策略,以及“弃用”等术语的定义(5.12.2)。
以下现有诊断现在已记录
perlbook 已扩展到涵盖更多流行书籍。
SvTRUE
宏perlapi 中 SvTRUE
宏的文档在说明 get-magic 未被处理方面是错误的。它已被更正。
几个处理 optree 的 API 函数已新增文档。
perlvar 重新排列了变量,并按主题进行分组。每个在 Perl 5.000 之后引入的变量都记录了它首次可用的版本。 perlvar 还为弃用的变量新增了一个部分,以记录它们何时被移除。
这些现在已在 perldata 中记录。
use locale
和格式perlform 和 perllocale 已更正,以说明 use locale
会影响格式。
overload 的文档实际上已经过重写。它现在更加直接和清晰。
perlhack 文档现在更短,重点关注 Perl 5 的开发流程和向 Perl 提交补丁。技术内容已移至几个新文档,perlsource、perlinterp、perlhacktut 和 perlhacktips。这些技术内容仅进行了轻微的编辑。
perlrepository 文档已重命名为 perlgit。这个新文档只是关于使用 git 与 Perl 源代码的说明。perlrepository 中以前包含的任何其他内容都已移至 perlhack。
在 perlfaq4 中的示例已更新以显示 Time::Piece 的用法。
诊断输出(包括警告和致命错误消息)已进行以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
如果传递给属性处理程序的子程序引用被调用,并且该子程序是闭包,则会发生此错误 [perl #68560]。
当尝试编译包含对用户定义字符属性函数调用的正则表达式时,Perl 检测到污染数据,这意味着 \p{IsFoo}
或 \p{InFoo}
。请参阅 "perlunicode 中的用户定义字符属性" 和 perlsec。
如果在要释放的 typeglob 中的对象上调用的析构函数创建了一个新的 typeglob 条目,其中包含一个具有析构函数的对象,该析构函数创建了一个新的包含对象的条目,依此类推,则会触发此新错误。
当扩展提供的解析代码以可检测的方式违反解析器的 API 时,会产生此新的致命错误。
此新错误仅在管道即将关闭时内部一致性检查失败时才会发生。
正则表达式模式重复了一个互斥的修饰符。
正则表达式模式具有多个互斥的修饰符。
当 !~
与 s///r
或 y///r
一起使用时,会发生此错误。
在 \b
或 \B
后面直接使用未转义的 "{" 现在已弃用,以便在将来的版本中为 Perl 本身保留其使用。
对 Unicode 代理或非 Unicode 字符执行需要 Unicode 语义的操作(例如大小写折叠)现在会触发此警告。
有关详细信息,请参见上面的 "使用 qw(...) 作为括号"。
在 strict 'vars'
错误之前出现的“变量 $foo 未导入”警告现在已分配给“misc”类别,因此 no warnings
将抑制它 [perl #73712]。
如果 STDERR
是字节大小的句柄,则 warn() 和 die() 在馈送超出字节范围的字符时现在会产生“宽字符”警告。
“层与此 perl 不匹配”错误消息已被替换为以下更有帮助的消息 [perl #73754]
PerlIO 层函数表大小 (%d) 与此 perl 预期的大小 (%d) 不匹配
PerlIO 层实例大小 (%d) 与此 perl 预期的大小 (%d) 不匹配
当在条件中将常量分配给变量时发出的“在条件中找到 =”警告现在如果常量实际上是子例程或由 use constant
生成的,则会被抑制,因为常量的值可能在程序编写时未知 [perl #77762]。
以前,如果在给定平台上未实现 gethostbyaddr()、gethostbyname() 和 gethostent() 函数中的任何一个,它们都会全部以消息“不支持的套接字函数 'gethostent' 被调用”而死,getnet*() 和 getserv*() 也有类似的消息。这已得到纠正。
关于未识别的正则表达式转义符通过的警告消息已更改为包含在两个字符转义符后的任何文字“{”。例如,现在发出 "\q{" 而不是 "\q"。
如果 REPLY-TO 和 REPLYTO 变量为空,perlbug 现在会在 EMAIL 环境变量中查找回复地址。
perlbug 以前没有生成“From:”标题,这可能会导致邮件丢失;现在它包含了该标题。
用户的地址现在用作 Return-Path。
如今,许多系统没有有效的互联网域名,[email protected] 不会接受返回路径无法解析的电子邮件。因此,用户的地址现在被传递给 sendmail,因此它不太可能卡在某个邮件队列中 [perl #82996]。
perlbug 现在始终让报告者有机会更改它为他们猜测的电子邮件地址 (5.12.2)。
perlbug 在使用 -d 和 -v 选项时,不再会警告未初始化的值 (5.12.2)。
远程终端在分叉后工作,并为每个分叉进程生成新的会话。
ptargrep 是一个新的实用程序,用于将模式匹配应用于 tar 存档中的文件内容。它与 Archive::Tar
一起提供。
另请参见上面的 "Policy_sh.SH 中的命名修复可能会使 Policy.sh 无效"。
mingw64 交叉编译器的 CCINCDIR 和 CCLIBDIR 现在正确地位于 $(CCHOME)\mingw\include 和 \lib 下,而不是直接位于 $(CCHOME) 下。
这意味着 Config.pm 和 Config_heavy.pl 中的 "incpath"、"libpth"、"ldflags"、"lddlflags" 和 "ldflags_nolargefiles" 值现在已正确设置。
make test.valgrind
已调整以考虑 cpan/dist/ext 分离。
在支持它的编译器上,-Wwrite-strings 现在默认情况下添加到 cflags。
Encode 模块现在(再次)可以包含在静态 Perl 构建中。此情况的特殊情况处理在 Perl 5.11.0 中被破坏,现在已修复。
PerlIO 缓冲区的先前默认大小(4096 字节)已增加到 8192 字节和您的本地 BUFSIZ 中的较大者。基准测试表明,将这个已有十年的默认值加倍,在使用 unix 之上的 perlio 的默认层时,读写性能提高了约 25% 到 50%。要选择非默认大小,例如恢复旧值或获得更大的值,请使用以下命令配置:
./Configure -Accflags=-DPERLIOBUF_DEFAULT_BUFSIZ=N
其中 N 是所需的字节大小;它可能应该是您页面大小的倍数。
使用 clang
构建时,三元表达式中的 "不兼容的操作数类型" 错误已修复(5.12.2)。
Perl 现在跳过在检测到以 nosuid
方式挂载的分区上的 setuid File::Copy 测试(5.12.2)。
Perl 现在可以在 AIX 4.2 上构建(5.12.1)。
Perl 发行版中已删除对该平台的最后支持。它在 5.12.0 版本中正式停止支持。在此之前,它已经多年无法正常工作。
Perl 发行版中已删除对该平台的最后支持。它在早期版本中正式停止支持。
README.aix 已更新,其中包含有关 XL C/C++ V11 编译器套件 (5.12.2) 的信息。
ARM 上的 d_u32align
配置探测已修复 (5.12.2)。
MakeMaker 已更新,可在 cygwin 上构建手册页。
改进的重新定位行为
如果 cygwin 上的 DLL 更新,则会重用旧的 imagebase 地址。这解决了大多数重新定位错误,尤其是在核心 DLL 上更新时。有关更多信息,请参阅 http://www.tishler.net/jason/software/rebase/rebase-2.4.2.README。
支持标准 cygwin dll 前缀(FFI 所需)
更新的构建提示文件
FreeBSD 7 不再包含 /usr/bin/objformat。在构建时,Perl 现在会跳过 7 及更高版本中的 objformat 检查,并假设 ELF (5.12.1)。
Perl 现在允许在 HP-UX 上使用 -Duse64bitint 而不提升到 use64bitall
(5.12.1)。
IRIX 系统上字符串转换为浮点数现在更加准确 [perl #32380]。
早期版本的 Mac OS X (Darwin) 对 setregid()、setreuid()、setrgid() 和 setruid() 函数的实现存在错误,因此 Perl 会假装这些函数不存在。
这些函数现在在 Mac OS 10.5 (Leopard;Darwin 9) 及更高版本上得到识别,因为它们已修复 [perl #72990]。
以前,如果您在 MirBSD 上使用共享 libperl.so 构建 Perl(默认配置),它将一直工作到安装;但是,安装后,它将无法找到 libperl。路径处理现在与其他 BSD 方言相同。
NetBSD 的 hints 文件已更改,使系统 malloc 成为默认值。
OpenBSD > 3.7 具有新的基于 *mmap* 的 malloc 实现,因此可以将内存释放回操作系统;但是,Perl 使用此 malloc 会导致显着减速,因此我们现在默认使用 Perl 的 malloc [perl #75742]。
Perl 现在可以再次使用 OpenVOS(以前称为 Stratus VOS)构建 [perl #78132] (5.12.3)。
Solaris 上现在支持 DTrace。以前存在构建失败,但这些问题已修复 [perl #73630] (5.12.3)。
在较旧的(7.3-2 之前)VMS 系统上,扩展构建失败,因为 configure.com 遇到了 DCL 符号长度限制 1K。我们现在在核心构建中组装扩展列表时,将在此限制内工作 (5.12.1)。
我们修复了使用 **-Uuseperlio** 配置和构建 Perl (5.12.1)。
PerlIOUnix_open
现在遵守 VMS 上的默认权限。
当 perlio
成为默认值,而 unix
成为默认底层时,从 Perl 创建文件的最常见路径成为 PerlIOUnix_open
,它始终明确地使用 0666
作为权限掩码。这会阻止从 RMS 默认值和 ACL 继承权限,因此为了避免此问题,我们现在将 0777
传递给 open()。在 VMS CRTL 中,0777
具有超出与当前 umask 相交的特殊含义;具体来说,它允许 Unix 系统调用保留本机默认权限 (5.12.3)。
核心 C 源代码和扩展中超过 31 个字符的符号的缩短现在默认由 C 编译器完成,而不是由 xsubpp 完成(它只能对 XS 代码中生成的符号进行缩短)。您可以通过使用 -Uuseshortenedsymbols 配置来重新启用 xsubpp 的符号缩短,但您需要做一些工作才能使核心源代码编译。
由 perlio
层以写入方式打开的记录式文件(记录格式变量或具有固定控制的变量)现在将被行缓冲,以防止每当 perlio 缓冲区填满时引入虚假换行符。
git_version.h 现在已安装在 VMS 上。这是 v5.12.0 中的疏忽,导致一些扩展无法构建 (5.12.2)。
stat() 中的几个内存泄漏已修复 (5.12.2)。
Perl_rename() 中由于双重分配导致的内存泄漏已修复 (5.12.2)。
vms_fid_to_name() 中的内存泄漏(由 realpath() 和 realname() 使用)已修复 (5.12.2)。
另请参见上面的 "fork() 模拟不会等待信号子进程" 和 "Perl 源代码在 Windows 上以文本模式读取"。
修复了 SDK2003SP1 编译器的构建过程。
现在支持使用 Visual Studio 2010 进行编译。
当使用旧的 32 位编译器时,定义 _USE_32BIT_TIME_T
现在已在 $Config{ccflags}
中设置。这在使用新编译器编译 XS 扩展时提高了可移植性,但适用于使用旧的 32 位编译器编译的 Perl。
当使用来自 http://mingw64.org 的 mingw64 编译器构建 Perl 时,$Config{gccversion}
现在已正确设置 [perl #73754]。
当使用 mingw64 x64 交叉编译器构建 Perl 时,Config.pm 和 Config_heavy.pl 中的 incpath
、libpth
、ldflags
、lddlflags
和 ldflags_nolargefiles
值以前没有被正确设置,因为使用该编译器时,包含和库目录不在 $(CCHOME)
的直接下方 (5.12.2)。
由于 Cwd
的修复,当 C:\MSYS\bin 在 PATH 中时,构建过程在使用 mingw 和 dmake 时更加顺利。
使用 Visual C++ 2010 构建的支持正在进行中,但尚未完成。有关更多详细信息,请参阅 README.win32 或 perlwin32。
使用外部提供的 crypt() 或完全不使用 crypt() 构建的选项已被删除。Perl 为 Windows 提供了自己的 crypt() 实现,并且需要此部分分发有时被省略的政治形势早已消失。
创建线程的模块现在应该通过调用新函数 Perl_clone_params_new() 来创建 CLONE_PARAMS
结构,并使用 Perl_clone_params_del() 释放它们。这将确保与 CLONE_PARAMS
结构布局内部的任何未来更改兼容,并确保它被正确分配和初始化。
添加了几个用于解析 Perl 语句和表达式的函数。这些函数旨在由 Perl 解析期间调用的 XS 代码以递归下降的方式使用,以允许模块扩展标准 Perl 语法。
parse_stmtseq() 解析一系列语句,直到遇到闭合大括号或 EOF。
parse_fullstmt() 解析完整的 Perl 语句,包括可选的标签。
parse_barestmt() 解析没有标签的语句。
parse_block() 解析代码块。
parse_label() 解析语句标签,与语句分开。
parse_fullexpr()
、parse_listexpr()
、parse_termexpr()
和 parse_arithexpr()
解析不同优先级的表达式。
添加了一个新的 C API 用于在运行时检查 hinthash %^H
。有关详细信息,请参阅 perlapi 中的 cop_hints_2hv
、cop_hints_fetchpvn
、cop_hints_fetchpvs
、cop_hints_fetchsv
和 hv_copy_hints_hv
。
添加了一个新的实验性 API 用于访问 Perl 用于 %^H
的内部结构。请参阅 perlapi 中以 cophh_
开头的函数。
已添加 caller_cx
函数作为 XSUB 编写者的 caller() 等效项。有关详细信息,请参阅 perlapi。
扩展模块中的 XS 代码现在可以注释一个子例程(无论是在 XS 中实现还是在 Perl 中实现),以便在编译时(具体来说,作为操作检查的一部分)调用指定的 XS 代码来更改该子例程的操作树。编译时检查函数(由扩展模块提供)可以实现无法用原型表达的参数处理,生成自定义的编译时警告,对纯函数执行常量折叠,内联由足够简单的操作组成的子例程,用自定义操作替换整个调用,等等。以前可以通过挂钩 entersub
操作检查器来实现所有这些,但新机制使将钩子绑定到特定子例程变得容易。请参阅 "perlapi 中的 cv_set_call_checker"。
为了帮助编写自定义检查钩子,标准entersub
操作检查中的几个子任务已被分离出来并在 API 中公开。
自定义操作现在可以使用新的 custom_op_register
C 函数和 XOP
结构进行注册。这将使将来更容易添加自定义操作的新属性。已经添加了两个新属性,xop_class
和 xop_peep
。
xop_class
是 OA_*OP 常量之一。它允许 B 和其他内省机制与不是 BASEOP 的自定义操作一起使用。xop_peep
是一个指向函数的指针,该函数将从 Perl_rpeep
为此类型的操作调用。
有关更多详细信息,请参阅 "perlguts 中的自定义操作" 和 "perlapi 中的自定义操作"。
旧的 PL_custom_op_names
/PL_custom_op_descs
接口仍然受支持,但已不再推荐使用。
现在,XS 代码可以使用新的 Perl_blockhook_register
函数在编译时挂接到 Perl 的词法作用域机制。请参阅 "perlguts 中的编译时作用域钩子"。
除了 PL_peepp
(用于挂接到顶层窥视孔优化器)之外,现在还提供了一个 PL_rpeepp
用于挂接到递归到 optree 侧链的优化器。
以下函数/宏已添加到 API 中。*_nomg
宏等效于它们非 _nomg
变体,只是它们忽略 get-magic。那些以 _flags
结尾的允许您指定是否处理 get-magic。
sv_2bool_flags
SvTRUE_nomg
sv_2nv_flags
SvNV_nomg
sv_cmp_flags
sv_cmp_locale_flags
sv_eq_flags
sv_collxfrm_flags
在其中一些情况下,非 _flags
函数已被替换为围绕新函数的包装器。
许多以 pvn 结尾的函数现在都有等效的 pv/pvs/sv
版本。
列表操作构建函数已添加到 API 中。请参阅 op_append_elem、op_append_list 和 op_prepend_elem 在 perlapi 中。
LINKLIST
LINKLIST
宏(操作构建的一部分,用于构建执行顺序操作链)已添加到 API 中。
API 中添加了 save_freeop
、save_op
、save_pushi32ptr
和 save_pushptrptr
函数。
Stash 现在除了通常的名称外,还可以拥有一个有效名称列表。第一个有效名称可以通过 HvENAME
宏访问,现在推荐在 MRO 线性化中使用此名称(如果不存在 HvENAME
,则 HvNAME
为备用名称)。
这些名称通过 hv_ename_add
和 hv_ename_delete
添加和删除。这两个函数不属于 API 的一部分。
API 中添加了 mg_findext()
和 sv_unmagicext()
函数。它们允许扩展作者根据魔术类型和魔术虚拟表查找和删除附加到标量的魔术,类似于 sv_magicext()
如何将特定类型和给定虚拟表的魔术附加到标量。这消除了扩展需要遍历 SV
的 MAGIC
指针列表以查找属于它们的魔术的必要性。
find_rundefsv
此函数返回表示 $_
的 SV,无论它是词法还是动态的。
Perl_croak_no_modify
Perl_croak_no_modify()
是 Perl_croak("%s", PL_no_modify)
的简写。
PERL_STATIC_INLINE
定义PERL_STATIC_INLINE
定义已添加,以提供用于静态内联函数的最佳猜测咒语,如果 C 编译器支持 C99 样式的静态内联。如果它不支持,它将提供一个普通的 static
。
HAS_STATIC_INLINE
可用于检查编译器是否实际支持内联函数。
pv_escape
用于十六进制转义的新选项pv_escape
中添加了一个新选项 PERL_PV_ESCAPE_NONASCII
,用于以十六进制形式转储所有高于 ASCII 的字符。之前,可以将所有字符作为十六进制或 Latin1 非 ASCII 作为八进制获取。
lex_start
lex_start
已添加到 API 中,但被认为是实验性的。
op_scope() 和 op_lvalue() 函数已添加到 API 中,但被认为是实验性的。
PERL_POLLUTE
已被移除定义 PERL_POLLUTE
以公开旧的 5.005 符号以实现向后兼容性的选项已被移除。一直不鼓励使用它,并且 MakeMaker 包含一个更具体的逃生舱口。
perl Makefile.PL POLLUTE=1
这可用于尚未升级到 5.6 命名约定的模块(现在应该完全过时了)。
当 Perl 的 API 以不兼容的方式发生更改时(通常发生在主要版本之间),为先前版本的 Perl 编译的 XS 模块将不再起作用。它们需要针对新的 Perl 重新编译。
XS_APIVERSION_BOOTCHECK
宏已添加以确保模块被重新编译,并防止用户意外地将为旧 Perl 编译的模块加载到较新的 Perl 中。该宏在加载每个新编译的扩展时被调用,它将运行时 Perl 的 API 版本与模块编译的版本进行比较,如果它们不匹配,则会引发异常。
C API 函数 Perl_fetch_cop_label
的第一个参数已从 struct refcounted_he *
更改为 COP *
,以隔离用户免受实现细节的影响。
此 API 函数被标记为“可能会更改”,并且可能不在核心之外使用。(既没有解压缩的 CPAN 也没有 Google 的代码搜索找到了对它的任何其他引用。)
现在提供新的 GvCV_set() 和 GvGP_set() 宏来替换对这两个宏的赋值。
这允许将来的提交消除 GV 和 CV 之间的某些反向引用魔法,这将需要完全控制对 gp_cv
插槽的赋值。
在某些情况下,CV 的 CvGV() 字段现在是引用计数的。为了确保一致的行为,对它的直接赋值,例如 CvGV(cv) = gv
现在是编译时错误。已引入一个新的宏 CvGV_set(cv,gv)
来安全地运行此操作。请注意,无论此新宏如何(以及尽管它列在这个部分中),修改此字段都不属于公共 API 的一部分。
CvSTASH() 宏现在只能用作右值。已添加 CvSTASH_set() 来替换对 CvSTASH() 的赋值。这是为了确保正确处理反向引用。这些宏不是 API 的一部分。
newFOROP
和 newWHILEOP
的调用约定解析器处理标签的方式已清理并重构。因此,newFOROP() 构造函数不再接受一个参数来指定要放在状态操作中的标签。
newWHILEOP() 和 newFOROP() 函数不再接受行号作为参数。
uvuni_to_utf8_flags
和 utf8n_to_uvuni
的标志传递给 uvuni_to_utf8_flags() 和 utf8n_to_uvuni() 的一些标志参数已更改。这是由于 Perl 现在允许内部存储和操作在某些情况下存在问题的代码点。因此,这些函数的默认操作已得到补充,以允许这些代码点。新标志在 perlapi 中有记录。需要拒绝有问题的代码点的代码需要更改为使用新标志。一些标志名称保留用于向后源代码兼容性,尽管它们什么也不做,因为它们现在是默认值。但是,标志 UNICODE_ALLOW_FDD0
、UNICODE_ALLOW_FFFF
、UNICODE_ILLEGAL
和 UNICODE_IS_ILLEGAL
已被删除,因为它们源于一个关于如何处理 Unicode 非字符代码点的根本错误模型,现在在 "perlunicode 中的非字符代码点" 中进行了描述。另请参阅 "选定的错误修复" 下的 Unicode 部分。
Perl_ptr_table_clear
Perl_ptr_table_clear
不再是 Perl 公共 API 的一部分。现在调用它会生成弃用警告,并且将在未来的版本中删除。
sv_compile_2op
sv_compile_2op() API 函数现在已弃用。搜索表明 CPAN 上没有任何东西在使用它,因此这应该不会有任何影响。
它试图提供一个 API 来将代码编译成 optree,但未能正确绑定到封闭范围内的词法变量。在它的参数和返回值的约束下,无法解决这个问题。
find_rundefsvoffset
find_rundefsvoffset
函数已弃用。其设计似乎不足以可靠地获取运行时的词法 $_
。
请使用新的 find_rundefsv
函数或 UNDERBAR
宏。它们直接返回表示 $_
的正确 SV,无论它是词法还是动态的。
CALL_FPTR
和 CPERLscope
这些是使用 C++ 对象的旧 MULTIPLICITY
实现的遗留物,已在 Perl 5.8 中删除。如今,这些宏什么也不做,因此不再应该使用它们。
为了兼容性,它们仍然为外部 XS
代码定义。现在,只有定义了 PERL_CORE
的扩展需要更新。
在 die
的最后阶段展开 C 堆栈的协议已更改了它识别目标堆栈帧的方式。现在它使用一个单独的变量 PL_restartjmpenv
,而以前它依赖于已名义上被丢弃的 eval
上下文帧中的 blk_eval.cur_top_env
指针。此更改意味着在 Perl 级别的展开的各个阶段运行的代码不再需要注意避免破坏幽灵帧。
作用域堆栈上的条目格式已更改,导致内存使用量减少了约 10%。特别是,作用域堆栈用于记录每个活动词法变量的内存已减半。
指针表的内存分配已更改。以前,Perl_ptr_table_store
从与 SV
主体和 HE
相同的竞技场系统分配内存,释放的内存将一直绑定到这些竞技场,直到解释器退出。现在它从特定指针表的私有竞技场分配内存,并且当调用 Perl_ptr_table_free
时,该内存将返回到系统。此外,分配和释放都更少占用 CPU。
UNDERBAR
UNDERBAR
宏现在调用 find_rundefsv
。dUNDERBAR
现在是一个空操作,但仍应使用它来确保过去和将来的兼容性。
ibcmp_*
函数已重命名,现在称为 foldEQ
、foldEQ_locale
和 foldEQ_utf8
。旧名称仍然可用作宏。
chop
和 chomp
实现合并chop
和 chomp
以及 schop
和 schomp
的操作码主体已合并。实现函数 Perl_do_chop() 和 Perl_do_chomp() 从未成为公共 API 的一部分,现已合并并移至 pp.c 中的静态函数。这会稍微缩小 Perl 二进制文件,并且不应影响核心之外的任何代码(除非它依赖于 chomp
传递值列表时的副作用顺序)。
Perl 不再产生此警告
$ perl -we 'open(my $f, ">", \my $x); binmode($f, "scalar")'
Use of uninitialized value in binmode at -e line 1.
通过 open($fh, ">", \*glob)
打开 glob 引用不再导致 glob 在文件句柄被打印时被破坏。这会导致 Perl 在访问 glob 内容时崩溃 [perl #77492]。
PerlIO 在递归调用时不再崩溃,例如来自信号处理程序。现在它只是内存泄漏 [perl #75556]。
大多数 I/O 函数在未打开句柄的情况下不会发出警告,除非同时启用了“closed”和“unopened”警告类别。现在只需要 use warnings 'unopened'
即可触发这些警告,正如一直以来的意图。
PerlIO 层已经过多次修复
当 binmode(FH, ":crlf")
将 :crlf
层推送到堆栈顶部时,它不再启用堆栈中较低层的 crlf 层,以避免出现意外结果 [perl #38456]。
以 :raw
模式打开文件现在会按照其广告进行操作(先打开文件,然后 binmode
它),而不是简单地省略顶层 [perl #80764]。
三个层 :pop
、:utf8
和 :bytes
在打开文件时不允许堆叠。例如,这
open(FH, ">:pop:perlio", "some.file") or die $!;
将抛出“无效参数”错误。此版本已修复此问题 [perl #82484]。
正则表达式引擎在匹配 "\N{LATIN SMALL LIGATURE FF}" =~ /f+/i
和类似表达式时不再循环 [perl #72998] (5.12.1)。
trie 运行时代码不再分配大量内存,修复了 #74484。
(?{...})
块中的语法错误不再导致恐慌消息 [perl #2353]。
类似 (?:(o){2})?
的模式不再导致“恐慌”错误 [perl #39233]。
在处理 UTF-8 数据时,包含 (.*?)
的正则表达式中的致命错误已修复 [perl #75680] (5.12.2)。
已删除导致正则表达式谓词(如 *COMMIT
)有时被忽略的错误正则表达式引擎优化。
正则表达式中带括号的字符类 `[\8\9]` 实际上等同于 `[89\000]`,错误地匹配了空字符。它还会错误地发出警告,指出 `8` 和 `9` 被忽略了。现在 `[\8\9]` 等同于 `[89]`,并会发出合法的警告,指出 `\8` 和 `\9` 是未识别的转义序列,被直接传递。
在全局替换(`s///g`)的右侧进行的正则表达式匹配,如果在同一作用域内,将不再导致匹配变量在后续迭代中具有错误的值。当在右侧插值数组或哈希下标时,可能会发生这种情况,例如 `s|(.)|@a{ print($1), /./ }|g` [perl #19078]。
修复了几个情况下,拉丁-1 非 ASCII 范围(0x80 到 0xFF)中的字符无法匹配自身,或者同时匹配字符类及其补集的问题。例如,U+00E2 可能会同时匹配 `\w` 和 `\W` [perl #78464] [perl #18281] [perl #60156]。
将 Unicode 字符与包含匹配前者 UTF8 表示中的延续字节的字符的交替匹配(例如 `qq{\x{30ab}} =~ /\xab|\xa9/`)会导致错误的警告 [perl #70998]。
Trie 优化没有考虑空组,阻止了 "foo" 匹配 `/\A(?:(?:)foo|bar|zot)\z/` [perl #78356]。
包含在先行断言中的 `+` 的模式有时会导致全局匹配中的错误匹配失败(例如 `/(?=(\S+))/g`) [perl #68564]。
正则表达式优化有时会导致使用 ` {n,m}` 量词的匹配失败,而实际上应该匹配 [perl #79152]。
在 `use locale` 下编译的正则表达式中的不区分大小写的匹配,当模式或目标字符串在内部以 UTF8 编码时,现在工作得更加合理。以前,在这些条件下,区域设置完全丢失了。现在,高于 255 的代码点被视为 Unicode,但 0 到 255 之间的代码点使用当前区域设置规则处理,无论模式或字符串是否以 UTF8 编码。跨越 255/256 边界的少数不区分大小写的匹配是不允许的。例如,0xFF 不区分大小写地匹配 0x178 处的字符,即 LATIN CAPITAL LETTER Y WITH DIAERESIS,因为 0xFF 可能不是当前区域设置中的 LATIN SMALL LETTER Y,并且 Perl 无法知道该字符是否在区域设置中存在,更不用说它的代码点是什么了。
`(?|...)` 正则表达式构造不再在最后一个分支具有比其他任何分支更多的捕获括号组时崩溃。这在 Perl 5.10.1 中针对单个分支的情况进行了修复,但该修复没有考虑多个分支 [perl #84746]。
修复了正则表达式中 `{...}` 量词实现中的一个错误,该错误阻止了 `/((\w+)(?{ print $2 })){2}/` 中的代码块有时看到 `$2` [perl #84294]。
when (scalar) {...}
不再崩溃,但会产生语法错误 [perl #74114] (5.12.1)。
在字符串 eval 之前(foo: eval $string
)的标签不再导致标签也与 eval 中的第一个语句相关联 [perl #74290] (5.12.1)。
no 5.13.2
形式的 no
不再尝试开启功能或语义(如 strict) [perl #70075] (5.12.2)。
BEGIN {require 5.12.0}
现在按文档说明的行为,而不是与 use 5.12.0
行为相同。之前,BEGIN
块中的 require
错误地执行了 use feature ':5.12.0'
和 use strict
行为,而只有 use
被文档说明提供 [perl #69050]。
Perl 5.12.0 中引入的一个回归,导致 my $x = 3; $x = length(undef)
导致 $x
设置为 3
已经修复。$x
现在将为 undef
[perl #85508] (5.12.2)。
当 strict "refs" 模式关闭时,%{...}
在右值上下文中返回 undef
,如果其参数未定义。Perl 5.12.0 中引入的一个优化,用于在用作布尔值时使 keys %{...}
更快,没有考虑到这一点,导致 keys %{+undef}
(以及当 $foo
未定义时 keys %$foo
)成为一个错误,而这应该只在 strict 模式下如此 [perl #81750]。
常量折叠曾经导致
$text =~ ( 1 ? /phoo/ : /bear/)
在编译时变成
$text =~ /phoo/
现在它正确地与 $_
匹配 [perl #20444]。
从 UNITCHECK
块中解析 Perl 代码(使用字符串 eval
或加载模块)不再导致解释器崩溃 [perl #70614]。
字符串 eval
在编译了 20 亿个作用域后不再失败 [perl #83364]。
解析器在遇到某些 Unicode 字符(如 U+387)时不再挂起 [perl #74022]。
使用与 Perl 的特殊块(如 INIT
)相同的名称定义常量在 5.12.0 中停止工作,但现在已修复 [perl #78634]。
对用作哈希键的字面值的引用($hash{\"foo"}
)曾经被字符串化,即使哈希被绑定 [perl #79178]。
包含 if
语句后跟常量或变量的闭包不再被视为常量 [perl #63540]。
state
现在可以与属性一起使用。以前,如果存在任何属性,它与 my
的含义相同 [perl #68658]。
当 $a
未定义时,类似 @$a > 3
的表达式不再导致 $a
在 "Use of uninitialized value in numeric gt" 警告中被提及(因为它不是 >
表达式的一部分,而是 @
的操作数)[perl #72090]。
如果数组不存在,使用硬编码数字(而不是任意表达式)访问包数组的元素会导致崩溃。通常,数组会在编译期间自动创建,但类型全局操作可能会将其删除,例如以下两种会导致崩溃的情况
*d = *a; print $d[0];
undef *d; print $d[0];
在 shebang 行中使用时,-C 命令行选项现在可以后跟其他选项 [perl #72434]。
B
模块为 entertry
返回的是 B::OP
而不是 B::LOGOP
[perl #80622]。这是由于 Perl 内核中的错误,而不是 B
本身。
Perl 5.10.0 引入了一种新的内部机制来缓存 MRO(方法解析顺序,或父类列表;也称为 "isa" 缓存),以使方法查找更快(因此 @ISA
数组不必重复搜索)。不幸的是,这带来了很多错误。现在几乎所有这些错误都已修复,以及一些在 5.10.0 之前存在的与 MRO 相关的错误。
以下内容以前对方法解析有不可预测的影响,因为 "isa" 缓存没有重置或最终列出了错误的类。这些问题已修复。
undef *Foo::
)undef *Foo::ISA
)delete $Foo::{ISA}
)*Foo::ISA = \@Bar::ISA
或 *Foo::ISA = *Bar::ISA
) [perl #77238]undef *Foo::ISA
甚至会阻止新的 @Foo::ISA
数组更新缓存。
如果全局变量的存储空间不再存在,则类型全局变量赋值将崩溃,只要赋值的全局变量名为 ISA
或赋值两侧的全局变量包含子例程。
PL_isarev
,可以通过 mro::get_isarev
访问,现在在删除包或从其他类的 @ISA
中删除包时会正确更新。这允许创建和删除许多包,而不会导致内存泄漏 [perl #75176]。
此外,还修复了与类型全局变量和存储空间相关的各种其他错误。
对连接符号表(存储空间)、类型全局变量和子例程的内部指针进行了一些工作。这使得与删除存储空间或存储空间条目(例如,<%FOO:: = ()>)以及复杂的类型全局变量或代码引用别名相关的各种边缘情况将不再导致解释器崩溃。
将引用分配给全局变量副本现在分配给全局变量槽,而不是用标量覆盖全局变量 [perl #1804] [perl #77508]。
修复了在循环中替换循环变量的全局变量时的错误 [perl #21469]。这意味着以下代码将不再崩溃
for $x (...) {
*x = *y;
}
将全局变量分配给 PVLV 用于将其转换为普通字符串。现在它可以正常工作,并且 PVLV 可以保存全局变量。这将发生在将不存在的哈希或数组元素传递给子例程时
sub { $_[0] = *foo }->($hash{key});
# $_[0] would have been the string "*main::foo"
它也发生在将全局变量分配给或从绑定数组或哈希的元素返回时 [perl #36051]。
在尝试报告 Use of uninitialized value $Foo::BAR
时,如果保存有问题的全局变量的全局变量已通过例如 delete $::{"Foo::"}
从其原始存储空间分离,则可能会发生崩溃。这已通过在这些情况下禁用变量名称的报告来解决。
在范围退出时恢复本地化类型全局变量期间,作为结果调用的任何析构函数都将能够看到处于不一致状态的类型全局变量,其中包含已释放的条目,这可能会导致崩溃。这将影响像这样的代码
local *@;
eval { die bless [] }; # puts an object in $@
sub DESTROY {
local $@; # boom
}
现在,在调用任何析构函数之前,全局条目都会被清除。这也意味着析构函数可以在全局中重新创建条目。因此,Perl 会再次尝试,如果条目被重新创建的次数过多,则会以“panic: gp_free...”错误消息退出。
如果在与之关联的子例程在其他地方仍然被引用时释放了一个类型全局,则该子例程将被重命名为__ANON__
,位于同一个包中,除非该包已被取消定义,在这种情况下,将使用__ANON__
包。这可能会导致包被自动重新创建,例如,如果该包已被删除。现在这种情况不再发生。当原始包不再附加到符号表时,也会使用__ANON__
包。这在某些情况下避免了内存泄漏 [perl #87664]。
现在可以使用完全限定的名称访问以::
结尾的包名的包内的子例程和包变量。
在这个版本中,几乎完全解决了被称为“Unicode Bug”的问题。在use feature 'unicode_strings'
(由use 5.012
及更高版本自动选择)下,字符串的内部存储格式不再影响外部语义。[perl #58182]。
有两个已知的例外
现在已弃用的用户定义的大小写转换函数需要 utf8 编码的字符串才能操作。CPAN 模块 Unicode::Casing 已被编写来替代此功能,而不会出现其缺点,并且该功能计划在 5.16 中删除。
quotemeta()(及其内联等效项\Q
)也会根据字符串是否以 UTF-8 编码给出不同的结果。请参阅 "The "Unicode Bug"" in perlunicode。
Unicode 非字符代码点的处理方式已更改。以前,它们大多被认为是非法的,除了在某些地方只有 66 个中的一个是已知的。Unicode 标准认为它们都是合法的,但禁止其“开放交换”。这是允许内部使用任何代码点(请参阅 "Core Enhancements")的更改的一部分。这些更改共同解决了 [perl #38722]、[perl #51918]、[perl #51936] 和 [perl #63446]。
Unicode 字符的不区分大小写的"/i"
正则表达式匹配,这些字符匹配多个字符,现在更符合预期。例如
"\N{LATIN SMALL LIGATURE FFI}" =~ /ffi/ui
和
"ffi" =~ /\N{LATIN SMALL LIGATURE FFI}/ui
都是真的。以前,此功能存在许多错误。尚未修复的是模式包含多个字符,但这些字符被其他内容隔开的地方,例如在
"\N{LATIN SMALL LIGATURE FFI}" =~ /(f)(f)i/ui
或
"\N{LATIN SMALL LIGATURE FFI}" =~ /ffi*/ui
或
"\N{LATIN SMALL LIGATURE FFI}" =~ /[a-f][f-m][g-z]/ui
没有一个匹配。
此外,这种匹配并不完全符合当前的 Unicode 标准,该标准要求在文本的 NFD(规范化形式分解)上进行匹配。但是,截至本文撰写之时(2010 年 4 月),Unicode 标准目前正在就如何在这些情况下进行推荐而发生变化。他们可能会抛弃多字符匹配的整个概念。[perl #71736]。
在 \N{NAME}
中命名一个已弃用的字符不再导致内存泄漏。
我们修复了一个错误,该错误会导致 \N{NAME}
结构后跟单个 "."
被错误地解析 [perl #74978] (5.12.1)。
chop
现在可以正确处理高于 "\x{7fffffff}"
的字符 [perl #73246]。
当字符串在内部以 UTF8 编码时,将超出字符串末尾的偏移量传递给 index
不会再导致恐慌 [perl #75898]。
warn() 和 die() 现在尊重 utf8 编码的标量 [perl #45549]。
有时 UTF8 长度缓存不会在 substr 返回的值上重置,导致 length(substr($uni_string, ...))
给出错误的答案。当 ${^UTF8CACHE}
设置为 -1 时,它还会产生“恐慌”错误消息 [perl #77692]。
重载现在可以与绑定变量一起正常工作。以前发生的情况是,大多数操作在检查魔法之前检查它们的论证是否重载,因此例如由绑定数组访问返回的重载对象通常被视为没有重载 [RT #57012]。
已修复绑定变量上调用魔法(如绑定方法)次数过多或过少的各种情况
$tied->()
并不总是调用 FETCH [perl #8438]。
文件测试运算符和 y///
和 tr///
调用 FETCH 的次数过多。
=
运算符过去会忽略其右侧的魔法,如果标量恰好包含一个类型全局变量(如果类型全局变量是绑定标量返回或分配的最后一件事) [perl #77498]。
解引用运算符过去会忽略魔法,如果参数已经是引用(例如来自之前的 FETCH) [perl #72144]。
splice
现在调用 set-magic(因此 splice @ISA
做出的更改将受到方法调用的尊重) [perl #78400]。
由 open($fh, ">", \$buffer)
创建的内存文件根本没有调用 FETCH/STORE [perl #43789] (5.12.2)。
utf8::is_utf8() 现在尊重 get-magic(如 $1
)(5.12.1)。
非交换二元运算符在使用相同的绑定标量作为两个操作数并且每次 FETCH 返回不同的值时,会交换其操作数。例如,如果 $t
第一次返回 2,第二次返回 3,那么 $t/$t
将计算为 1.5。这个问题已修复 [perl #87708]。
字符串 eval
现在检测重载或绑定参数的污染 [perl #75716]。
字符串 eval
和针对具有字符串重载的对象的正则表达式匹配不再导致内存损坏或崩溃 [perl #77084]。
readline 现在在绑定参数上尊重 <>
重载。
如果表达式被重载,<expr>
现在始终尊重重载。
因为从 5.6 开始,"<> as glob" 的解析方式不同于 "<> as filehandle",所以类似 <$foo[0]>
的代码不会处理重载,即使 $foo[0]
是一个重载对象。这与 overload 文档相矛盾,这意味着 <>
不能用作通用的重载迭代器运算符。
二元运算符重载的回退行为是不对称的 [perl #71286]。
应用于主包中变量的魔术不再影响其他包。请参阅上面的 "主包之外的魔术变量" [perl #76138]。
有时附加到变量的魔术(绑定、污染等)会导致对象比预期持续更长时间,或者如果在绑定方法中释放了绑定变量,则会导致崩溃。这些问题已修复 [perl #81230]。
实现绑定的对象的 DESTROY 方法不再能够通过弱引用访问绑定变量而导致崩溃 [perl #86328]。
修复了当使用匹配变量作为要杀死的进程 ID 时,kill() 的回归 [perl #75812]。
如果 $AUTOLOAD
曾经被污染,它将永远保持污染。现在,如果调用了自动加载的方法并且方法名没有被污染,它将被正确地取消污染。
当 sprintf
传递被污染的标量作为格式时,它现在会死亡。它已经对任意表达式死亡,但对简单的标量没有死亡 [perl #82250]。
lc
、uc
、lcfirst
和 ucfirst
在参数被污染时不再返回未污染的字符串。这个问题从 perl 5.8.9 开始就存在 [perl #87336]。
Perl 调试器现在也可以在 taint 模式下工作 [perl #76872]。
子程序重新定义在调试器中再次起作用 [perl #48332]。
当在 shebang (#!
) 行上使用 -d 时,调试器现在可以访问主程序的行。在过去,这有时有效,有时无效,具体取决于内存中事物排列的顺序 [perl #71806]。
使用 caller() 设置 @DB::args
时可能发生的内存泄漏已修复 (5.12.2)。
如果这些变量在 $^P
被赋值时已经存在值,Perl 不会再覆盖 $DB::single
、$DB::trace
和 $DB::signal
[perl #72422]。
字符串 eval 中的 #line
指令没有正确更新代码行数组 (@{"_< ..."}
),调试器(或任何调试或分析模块)使用这些数组。在多线程构建中,它们根本没有被更新。在非多线程构建中,行号被忽略,因此对现有行号的任何更改都会导致行被错误编号 [perl #79442]。
Perl 不会再在创建子线程时意外地克隆父级中活动堆栈帧范围内的词法变量 [perl #73086]。
克隆和释放多线程 Perl 解释器中的几个内存泄漏已修复 [perl #77352]。
当目录句柄打开时创建新线程会导致崩溃,因为句柄没有被克隆,而是简单地传递给新线程,导致双重释放。
现在,目录句柄在 Windows 和具有 fchdir
函数的系统上被正确克隆。在其他系统上,新线程 simply do not inherit directory handles from their parent threads [perl #75154]。
类型 glob *,
,它保存标量变量 $,
(输出字段分隔符),在子线程中具有错误的引用计数。
[perl #78494] 当管道在线程之间共享时,close
函数(以及任何隐式关闭,例如在线程退出时)不再阻塞。
Perl 现在及时清理被克隆到新线程但随后被发现是孤儿(即,它们的拥有者 没有 被克隆)的 SV。这消除了在加入线程时出现的几个“标量泄漏”警告。
Lvalue 子程序现在可以再次返回写时复制标量。自版本 5.10.0 以来,此功能一直存在问题 [perl #75656] (5.12.3)。
require
现在不再导致 caller
为调用 require
的作用域以及更高层具有相同文件名的作用域返回错误的文件名 [perl #68712]。
使用 ($$)
原型比较例程的 sort
曾经会导致 @_
的值泄漏到 sort 外。在排序例程中对 @_
进行引用会导致崩溃 [perl #72334]。
匹配变量(如 $1
)不再在对 sort 子程序的调用之间持久存在 [perl #76026]。
使用 foreach
迭代 lvalue 子程序返回的数组现在可以正常工作 [perl #23790]。
$@
现在在调用 binmode
时被局部化,以防止远程操作 [perl #78844]。
调用闭包原型(传递给闭包的属性处理程序的内容)现在会产生“调用闭包原型”错误消息,而不是崩溃 [perl #68560]。
在字符串 eval
中提及封闭作用域中的只读词法变量不再会导致该变量变为可写 [perl #19135]。
在信号处理程序中,$!
现在被隐式局部化。
如果 CHLD 信号之前被 POSIX::sigprocmask
阻塞,则在调用信号处理程序后不再取消阻塞它们 [perl #82040]。
在信号处理程序中调用的信号处理程序可能会导致泄漏或双重释放。现在已修复 [perl #76248]。
修复了加载 XS 模块时的几个内存泄漏 (5.12.2)。
substr()、pos()、keys() 和 vec() 在与 lvalue 结合使用时,可能会导致它们操作的标量值泄漏,并导致其销毁过晚。现在已修复。
后缀递增和后缀递减运算符 ++
和 --
在对引用使用时会导致泄漏。现在已修复。
嵌套的 map
和 grep
块在处理大型列表时不再泄漏内存 [perl #48004]。
use VERSION
和 no VERSION
不再泄漏内存 [perl #78436] [perl #69050]。
.=
后跟 <>
或 readline
如果 $/
包含超出八位字节范围的字符,并且分配给它的标量恰好被内部编码为 UTF8,则会泄漏内存 [perl #72246]。
eval 'BEGIN{die}'
在非线程构建中不再泄漏内存。
当 %File::Glob::
为空且 CORE::GLOBAL::glob
不存在时,glob() 不再崩溃 [perl #75464] (5.12.2)。
当被信号中断时,readline() 已经修复,因此它不再返回之前或随机内存的“相同内容”。
当将包含重复键的列表分配给哈希时,分配以前会返回垃圾和/或已释放的值。
@a = %h = (list with some duplicate keys);
现在已修复 [perl #31865]。
用于在全局变量中释放对象的机制以前会留下指向已释放 SV 的悬空指针,这意味着 Perl 用户在销毁期间可能会看到损坏的状态。
Perl 现在只释放 GV 的受影响的槽,而不是释放 GV 本身。这确保在销毁期间没有悬空引用或损坏的状态。
解释器在释放深度嵌套的数组数组时不再崩溃。哈希尚未修复 [perl #44225]。
在 `use encoding` 下连接长字符串不再导致 Perl 崩溃 [perl #78674]。
在缺少 import 方法的类上调用 `->import` 可能会破坏堆栈,导致奇怪的行为。例如,
push @a, "foo", $b = bar->import;
会将 "foo" 分配给 `$b` [perl #63790]。
当使用 MSG_TRUNC 标志调用 `recv` 函数时,它可能会崩溃 [perl #75082]。
`formline` 在传递被污染的格式图片时不再崩溃。如果其参数被污染,它还会污染 `$^A` [perl #79138]。
我们处理文件测试操作的方式存在一个错误,可能会导致段错误。文件测试并不总是期望堆栈上的操作,因此我们现在仅在确定我们不是 `stat`ing `_` 文件句柄时才使用 TOP。这由 `OPf_KIDS` 指示(如 ck_ftst 中所检查)[perl #74542] (5.12.1)。
unpack() 现在为 `%32H` 和 `%32u` 正确处理标量上下文,修复了潜在的崩溃。split() 会崩溃,因为堆栈上的第三项不是它期望的正则表达式。`unpack("%2H", ...)` 会在堆栈上返回解包结果和校验和,`unpack("%2u", ...)` 也是如此 [perl #73814] (5.12.2)。
`&`、`|` 和 `^` 位运算符不再强制转换只读参数 [perl #20661]。
将包含 "-0.0" 的标量字符串化不再具有将假转换为真的效果 [perl #45133]。
一些数值运算符将整数转换为浮点数,导致在 64 位平台上精度丢失 [perl #77456]。
当使用常量参数调用 sprintf()
时,它会忽略区域设置 [perl #78632]。
将向量 (%v
) 标志和动态精度结合使用会导致 sprintf
混淆其参数的顺序,使其将字符串视为精度,反之亦然 [perl #83194]。
C 级别的 lex_stuff_pvn
函数有时会在文件最后一行的末尾导致一个虚假的语法错误,如果它缺少一个最后的分号 [perl #74006] (5.12.1)。
eval_sv
和 eval_pv
C 函数现在在出现语法错误且没有 G_KEEPERR
标志时会正确设置 $@
,并且如果存在 G_KEEPERR
标志,则永远不会设置它 [perl #3719]。
XS 多次调用 API 不会再导致子例程在通过多次调用接口从这些子例程内部调用时丢失引用计数。这会影响像 List::Util 这样的模块。如果使用一个活动的子例程作为第一个参数调用它的一个函数,可能会导致崩溃 [perl #78070]。
现在,XS 模块可用的 SvPVbyte
函数会在降级 SV 之前调用魔法,以避免有关宽字符的警告 [perl #72398]。
XS 绑定类型映射中的 ref 类型现在支持魔法变量 [perl #72684]。
sv_catsv_flags
现在不再在它的第二个参数(源字符串)上调用 mg_get
,如果传递给它的标志不包含 SV_GMAGIC。因此它现在与文档相匹配。
my_strftime
不会再发生内存泄漏。这修复了 POSIX::strftime
中的内存泄漏 [perl #73520]。
XSUB.h 现在在 PERL_IMPLICIT_SYS 下正确地重新定义了 fgets [perl #55049] (5.12.1)。
在 Windows 上使用 fputc() 或 fputs() 的 XS 代码可能会由于其参数被交换而导致错误 [perl #72704] (5.12.1)。
已修复 T_PTROBJ
默认类型映射中可能发生的段错误 (5.12.2)。
已修复一个错误,该错误会导致在从 XS 析构函数调用 call_sv(code, G_EVAL)
时出现“未知错误”消息 (5.12.2)。
这是一个关于重大未解决问题的列表,这些问题是早期版本的 Perl 的回归,或者会影响广泛使用的 CPAN 模块。
List::Util::first
在存在词法 $_
的情况下行为异常(通常由 my $_
或隐式地由 given
引入)。为每次迭代设置的变量是包变量 $_
,而不是词法 $_
。
类似的问题也可能出现在其他模块中,这些模块提供以代码块作为第一个参数的函数,例如
foo { ... $_ ...} list
当 readline() 被信号中断时,它返回空字符串而不是缓存的先前值
原型处理的更改破坏了 Switch。补丁已发送到上游,希望很快就会出现在 CPAN 上。
升级到 ExtUtils-MakeMaker-6.57_05 导致 CPAN 上 Module-Install 发行版中的一些测试失败。(具体来说,02_mymeta.t 测试 5 和 21;18_all_from.t 测试 6 和 15;19_authors.t 测试 5、13、21 和 29;以及 20_authors_with_special_characters.t 测试 6、15 和 23 在该发行版的 1.00 版本中现在失败。)
在 VMS 上,Time::HiRes
测试将失败,因为 CRTL 中 setitimer
的实现存在错误:如果计时器过期,则先前计时器值将被清除,但如果计时器在过期之前被重置,则不会被清除。HP OpenVMS 工程师已纠正了该问题,并将尽快发布补丁(Quix 案例号 # QXCM1001115136)。
在 VMS 上,在发布之前,我们没有发现一些 Module::Build
测试失败;请关注 CPAN 以获取更新。
您现在可以在数组上使用 keys()、values() 和 each() 内置函数;以前您只能在哈希上使用它们。有关详细信息,请参阅 perlfunc。这实际上是 perl 5.12.0 中引入的更改,但它在该版本的 perl5120delta 中被遗漏了。
@_
split() 在标量或空上下文调用时不再修改 @_
。在空上下文中,它现在会产生“split 的无用使用”警告。这也是 perl 5.12.0 中的更改,但它错过了 perldelta。
Randy Kobes,http://kobesearch.cpan.org/ 的创建者,以及多个核心 Perl 工具链模块的贡献者/维护者,于 2010 年 9 月 18 日因与肺癌作斗争后去世。社区因他的参与而更加丰富。他将被怀念。
Perl 5.14.0 代表了自 Perl 5.12.0 以来一年的开发,包含了来自 150 位作者和提交者的近 3,000 个文件中的近 550,000 行更改。
得益于充满活力的用户和开发者社区,Perl 继续在第三个十年蓬勃发展。以下人员已知为 Perl 5.14.0 的改进做出了贡献。
Aaron Crane, Abhijit Menon-Sen, Abigail, Ævar Arnfjörð Bjarmason, Alastair Douglas, Alexander Alekseev, Alexander Hartmaier, Alexandr Ciornii, Alex Davies, Alex Vandiver, Ali Polatel, Allen Smith, Andreas König, Andrew Rodland, Andy Armstrong, Andy Dougherty, Aristotle Pagaltzis, Arkturuz, Arvan, A. Sinan Unur, Ben Morrow, Bo Lindbergh, Boris Ratner, Brad Gilbert, Bram, brian d foy, Brian Phillips, Casey West, Charles Bailey, Chas. Owens, Chip Salzenberg, Chris 'BinGOs' Williams, chromatic, Craig A. Berry, Curtis Jewell, Dagfinn Ilmari Mannsåker, Dan Dascalescu, Dave Rolsky, David Caldwell, David Cantrell, David Golden, David Leadbeater, David Mitchell, David Wheeler, Eric Brine, Father Chrysostomos, Fingle Nark, Florian Ragwitz, Frank Wiegand, Franz Fasching, Gene Sullivan, George Greer, Gerard Goossen, Gisle Aas, Goro Fuji, Grant McLean, gregor herrmann, H.Merijn Brand, Hongwen Qiu, Hugo van der Sanden, Ian Goodacre, James E Keenan, James Mastros, Jan Dubois, Jay Hannah, Jerry D. Hedden, Jesse Vincent, Jim Cromby, Jirka Hruška, John Peacock, Joshua ben Jore, Joshua Pritikin, Karl Williamson, Kevin Ryde, kmx, Lars Dɪᴇᴄᴋᴏᴡ 迪拉斯, Larwan Berke, Leon Brocard, Leon Timmermans, Lubomir Rintel, Lukas Mai, Maik Hentsche, Marty Pauley, Marvin Humphrey, Matt Johnson, Matt S Trout, Max Maischein, Michael Breen, Michael Fig, Michael G Schwern, Michael Parker, Michael Stevens, Michael Witten, Mike Kelly, Moritz Lenz, Nicholas Clark, Nick Cleaton, Nick Johnston, Nicolas Kaiser, Niko Tyni, Noirin Shirley, Nuno Carvalho, Paul Evans, Paul Green, Paul Johnson, Paul Marquess, Peter J. Holzer, Peter John Acklam, Peter Martini, Philippe Bruhat (BooK), Piotr Fusik, Rafael Garcia-Suarez, Rainer Tammer, Reini Urban, Renee Baecker, Ricardo Signes, Richard Möhn, Richard Soderberg, Rob Hoelz, Robin Barker, Ruslan Zakirov, Salvador Fandiño, Salvador Ortiz Garcia, Shlomi Fish, Sinan Unur, Sisyphus, Slaven Rezic, Steffen Müller, Steve Hay, Steven Schubiger, Steve Peters, Sullivan Beck, Tatsuhiko Miyagawa, Tim Bunce, Todd Rinaldo, Tom Christiansen, Tom Hukins, Tony Cook, Tye McQueen, Vadim Konovalov, Vernon Lyon, Vincent Pit, Walt Mankowski, Wolfram Humann, Yves Orton, Zefram, 和 Zsbán Ambrus。
这非常不完整,因为它是由版本控制历史自动生成的。特别是,它不包括报告了以前版本中问题的贡献者(非常感谢)的姓名,这些问题帮助使 Perl 5.14.0 变得更好。有关所有 Perl 历史贡献者的更完整列表,请参阅 Perl 5.14.0 发行版中的 AUTHORS
文件。
本版本中包含的许多更改源自 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 文件。
有关如何构建 Perl,请参阅 INSTALL 文件。
有关一般信息,请参阅 README 文件。
有关版权信息,请参阅 Artistic 和 Copying 文件。