perl5220delta - perl v5.22.0 的新增内容
本文档描述了 5.20.0 版本和 5.22.0 版本之间的差异。
如果您从 5.18.0 或更早版本升级,请先阅读 perl5200delta,其中描述了 5.18.0 和 5.20.0 之间的差异。
添加了一个新的实验性功能,它使四个标准位运算符 (& | ^ ~
) 一致地将它们的运算对象视为数字,并引入了四个新的带点运算符 (&. |. ^. ~.
) ,它们一致地将它们的运算对象视为字符串。赋值变体 (&= |= ^= &.= |.= ^.=
) 也是如此。
要使用此功能,请启用 "bitwise" 功能并禁用 "experimental::bitwise" 警告类别。有关详细信息,请参阅 "perlop 中的位字符串运算符"。 [GH #14348].
<<>>
与 <>
相似,但使用三参数 open
打开 @ARGV
中的每个文件。这意味着 @ARGV
的每个元素都将被视为实际文件名,而 "|foo"
不会被视为管道打开。
\b
边界qr/\b{gcb}/
gcb
代表音位字符边界。它是一个 Unicode 属性,可以找到看起来像单个字符的字符序列之间的边界,对于某种语言的母语人士来说。Perl 长期以来一直能够通过 \X
正则表达式转义序列来处理这些问题。现在,有一种替代方法来处理这些问题。有关详细信息,请参阅 "perlrebackslash 中的 \b{}, \b, \B{}, \B"。
qr/\b{wb}/
wb
代表单词边界。它是一个 Unicode 属性,可以找到单词之间的边界。这类似于普通的 \b
(没有大括号),但更适合自然语言处理。例如,它知道撇号可以出现在单词中间。有关详细信息,请参阅 "perlrebackslash 中的 \b{}, \b, \B{}, \B"。
qr/\b{sb}/
sb
代表句子边界。它是一个 Unicode 属性,用于帮助解析自然语言句子。有关详细信息,请参见 perlrebackslash 中的“\b{}, \b, \B{}, \B”。
正则表达式现在支持 /n
标志,该标志禁用捕获并在组内填充 $1
、$2
等。
"hello" =~ /(hi|hello)/n; # $1 is not set
这等效于在每个捕获组的开头放置 ?:
。
有关更多信息,请参见 perlre 中的“n”。
use re 'strict'
这将对在其作用域内编译的正则表达式模式应用更严格的语法规则。这将有助于您发现打字错误和其他意外行为,这些行为是由于向后兼容性问题而无法在正常的正则表达式编译中报告的。由于此行为可能会在未来的 Perl 版本中发生变化,因此使用此 pragma 将引发类别为 experimental::re_strict
的警告。请参见 re 中的“strict”。
有关此版本中包含的内容的详细信息,请参见 http://www.unicode.org/versions/Unicode7.0.0/。Perl 附带的 Unicode 7.0 版本包含一个修正,用于处理阿拉伯语中的字形整形(请参见 http://www.unicode.org/errata/#current_errata)。
use locale
可以限制受影响的区域设置类别现在可以将参数传递给 use locale
以指定要设置为区域设置感知的区域设置类别子集,而其余类别不受影响。有关详细信息,请参见 perllocale 中的“The "use locale" pragma”。
在能够处理 POSIX.1-2008 的平台上,由 POSIX::localeconv()
返回的哈希包含该版本 POSIX 标准添加的国际货币字段。这些是 int_n_cs_precedes
、int_n_sep_by_space
、int_n_sign_posn
、int_p_cs_precedes
、int_p_sep_by_space
和 int_p_sign_posn
。
在既未实现 C99 标准也未实现 POSIX 2001 标准的平台上,确定当前区域设置是否为 UTF-8 取决于启发式方法。这些方法在本版本中得到了改进。
变量和子程序现在可以通过赋值给引用来创建别名。
\$c = \$d;
\&x = \&y;
别名也可以通过在 foreach
迭代器变量之前使用反斜杠来实现;这可能是此功能提供的最有用的习惯用法。
foreach \%hash (@array_of_hash_refs) { ... }
此功能是实验性的,必须通过 use feature 'refaliasing'
启用。除非禁用 experimental::refaliasing
警告类别,否则它会发出警告。
prototype
无参数的 prototype()
现在推断 $_
。 [GH #14376].
:const
子程序属性const
属性可以应用于匿名子程序。它会导致新子程序在每次创建时立即执行(即当 sub
表达式被评估时)。它的值被捕获并用于创建一个新的常量子程序,该子程序被返回。此功能是实验性的。参见 "perlsub 中的常量函数".
fileno
现在适用于目录句柄当操作系统中提供相关支持时,fileno
内置函数现在适用于目录句柄,以与文件句柄相同的方式产生底层文件描述符。在没有此类支持的操作系统上,目录句柄上的 fileno
继续返回未定义的值,如前所述,但也会将 $!
设置为指示操作不受支持。
目前,这使用 OS DIR
结构中的 dd_fd
成员,或 POSIX.1-2008 中指定的 dirfd(3)
函数。
管道的列表形式
open my $fh, "-|", "program", @arguments;
现在在 Win32 上实现。它与 Win32 上的 system LIST
具有相同的限制,因为 Win32 API 不接受程序参数作为列表。
(...) x ...
现在可以在分配给的列表中使用,只要左侧是一个有效的左值。这允许 (undef,undef,$foo) = that_function()
写成 ((undef)x2, $foo) = that_function()
.
浮点值能够保存特殊值无穷大、负无穷大和 NaN(非数字)。现在,我们更稳健地识别和传播计算中的值,并在输出时将它们规范化为字符串 Inf
、-Inf
和 NaN
。
另请参见 POSIX 增强功能。
浮点值的解析和打印已改进。
作为一项全新的功能,十六进制浮点数字面量(例如 0x1.23p-4
)现在已受支持,并且可以使用 printf "%a"
输出。有关更多详细信息,请参阅 "perldata 中的标量值构造函数"。
之前,当尝试将无穷大或非数字打包到(带符号)字符中时,Perl 会发出警告,并假设您尝试打包 0xFF
;如果您将其作为 chr
的参数提供,则会返回 U+FFFD
。
但现在,所有此类操作(pack
、chr
和 print '%c'
)都会导致致命错误。
Perl 现在支持(通过 C 级 API)检索 C 级回溯(类似于 gdb 等符号调试器所做的事情)。
回溯返回 C 调用帧的堆栈跟踪,包括符号名称(函数名称)、对象名称(如“perl”),以及如果可以,还包括源代码位置(文件:行)。
支持的平台是 Linux 和 OS X(一些 *BSD 可能至少部分工作,但尚未经过测试)。
该功能需要使用 Configure -Dusecbacktrace
启用。
有关更多信息,请参阅 "perlhacktips 中的 C 回溯"。
-fstack-protector-strong
编译自 5.10.1 以来,Perl 一直使用反堆栈溢出选项 -fstack-protector
编译。现在,如果可用,Perl 使用名为 -fstack-protector-strong
的较新变体。
严重错误修复:外部包可能被替换。 Safe 已修补到 2.38 以解决此问题。
-D_FORTIFY_SOURCE=2
编译gcc 4.* 中提供的名为 _FORTIFY_SOURCE
的“代码加固”选项现在始终用于编译 Perl(如果可用)。
请注意,这并不一定是一个巨大的进步,因为在许多平台上,这一步已经在几年前就已完成:许多 Linux 发行版(如 Fedora)一直在为 Perl 使用此选项,而 OS X 已经强制执行了多年。
实验性子程序签名功能(在 5.20 中引入)在属性之后解析签名。在本版本中,根据用户对实验性功能的反馈,已将位置更改为签名出现在子程序名称(如果有)之后,属性列表(如果有)之前。
&
和 \&
原型仅接受子程序&
原型字符现在仅接受匿名子程序 (sub {...}
)、以 \&
开头的项或显式 undef
。以前,它错误地也允许对数组、哈希和列表的引用。 [GH #2776]. [GH #14186]. [GH #14353].
此外,\&
原型允许子程序调用,而现在它只允许子程序:&foo
仍然允许作为参数,而 &foo()
和 foo()
不再允许。 [GH #10633].
use encoding
现在是词法作用域的编码 编译指示的作用现在仅限于词法作用域。此编译指示已弃用,但在此期间,它可能会对同一程序中包含的无关模块产生不利影响;此更改修复了该问题。
列表切片现在仅在原始列表为空(或没有索引)时返回空列表。以前,如果所有索引都超出原始列表,列表切片将返回空列表;现在,在这种情况下,它将返回一个包含 undef
值的列表。 [GH #12335].
\N{}
带有多个空格序列现在是致命错误例如 \N{TOO MANY SPACES}
或 \N{TRAILING SPACE }
。自 v5.18 起,此功能已弃用。
use UNIVERSAL '...'
现在是致命错误从 UNIVERSAL
导入函数自 v5.12 起已弃用,现在是致命错误。 use UNIVERSAL
不带任何参数仍然允许。
\cX
,X 现在必须是可打印的 ASCII 字符在以前的版本中,未能做到这一点会引发弃用警告。
(?
和 (*
现在是致命编译错误。这些自 v5.18 起已弃用。
qr/foo/x
现在忽略所有 Unicode 模式空白/x
正则表达式修饰符允许模式包含空格和注释(两者都被忽略),以提高可读性。到目前为止,并非所有 Unicode 为此目的指定的空格字符都得到处理。现在识别出的其他字符是
U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
在方括号字符类之外且未以反斜杠开头的情况下,使用这些字符与 /x
一起使用,自 v5.18 以来已发出弃用警告。现在它们将被忽略。
(?[ ])
内的注释行现在仅以 \n
结束(?[ ])
是一个实验性功能,在 v5.18 中引入。它的运行方式就好像始终启用了 /x
。但存在差异:注释行(在 #
字符之后)以匹配 \R
的任何内容终止,其中包括所有垂直空格,例如换页符。为了保持一致性,这现在更改为匹配终止 (?[ ])
外部注释行的内容,即 \n
(即使转义),这与终止 heredoc 字符串和格式的内容相同。
(?[...])
运算符现在遵循标准 Perl 优先级此实验性功能允许在正则表达式模式中进行集合运算。在此之前,交集运算符与其他二元运算符具有相同的优先级。现在它具有更高的优先级。这可能会导致与现有代码预期不同的结果(尽管文档始终指出可能会发生此更改,建议完全将表达式括起来)。请参阅 "perlrecharclass 中的扩展方括号字符类"。
%
和 @
不再允许非常旧的 Perl 允许您在某些位置省略数组名称上的 @
和哈希名称上的 %
。自 Perl 5.000 以来,这已发出弃用警告,并且不再允许。
"$!"
文本现在在 use locale
的作用域之外为英文以前,该文本与几乎所有其他内容不同,始终根据程序的当前底层区域设置输出。(在某些系统上,"$^E"
也会受到影响。)对于未准备好处理区域设置差异的程序,这会导致显示垃圾文本。最好显示可以通过某些工具翻译的文本,而不是难以弄清楚的垃圾文本。
"$!"
文本将在适当的时候以 UTF-8 格式返回当文本实际上是非 ASCII UTF-8 时,$!
和 $^E
的字符串化将设置 UTF-8 标志。这将使设置为区域设置感知的程序能够以用户的母语正确输出消息。需要继续使用 5.20 及更早版本行为的代码可以在 use bytes
和 use locale ":messages"
的作用域内进行字符串化。在这两个作用域内,没有其他 Perl 操作会受到区域设置的影响;只有 $!
和 $^E
字符串化。bytes
编译指示会导致不设置 UTF-8 标志,就像在以前的 Perl 版本中一样。这解决了 [GH #12035]。
?PATTERN?
m?PATTERN?
结构允许仅匹配一次正则表达式,以前有一个直接用问号分隔符编写的替代形式,省略了显式的 m
操作符。这种用法自 5.14.0 以来一直产生弃用警告。现在它是一个语法错误,以便问号可用于新操作符。
defined(@array)
和 defined(%hash)
现在是致命错误这些自 v5.6.1 以来一直被弃用,并且自 v5.16 以来一直引发弃用警告。
例如,%foo->{"bar"}
现在会导致致命编译错误。这些自 v5.8 之前就被弃用,并且自那时起一直引发弃用警告。
*
原型的更改子例程原型中的 *
字符过去允许裸词优先于大多数(但不是全部)子例程名称。它从未一致,并且表现出错误的行为。
现在它已经改变,因此子例程始终优先于裸词,这使其与类似原型化的内置函数一致。
sub splat(*) { ... }
sub foo { ... }
splat(foo); # now always splat(foo())
splat(bar); # still splat('bar') as before
close(foo); # close(foo())
close(bar); # close('bar')
${^ENCODING}
设置为除 undef
之外的任何值此变量允许 Perl 脚本以除 ASCII 或 UTF-8 之外的编码编写。但是,它会全局影响所有模块,导致错误答案和段错误。新脚本应该用 UTF-8 编写;旧脚本应该转换为 UTF-8,这很容易使用 piconv 实用程序完成。
单字符变量名的语法比更长的变量名更宽松,允许一个字符的名称为标点符号,甚至不可见(非图形)。Perl v5.20 弃用了 ASCII 范围内的控制字符作为这样的名称。现在,所有以前允许的非图形字符都被弃用。这在没有 use utf8
时才会发生,并且只影响 C1 控制字符(代码点 0x80 到 0xFF)、不间断空格和软连字符。
sub () { $var }
具有可观察的副作用在许多情况下,Perl 会将 sub () { $var }
转换为可内联的常量子程序,捕获 $var
在 sub
表达式求值时的值。当 $var
随后被修改时,这可能会破坏闭包的行为,因为子程序不会返回更改后的值。(请注意,这仅适用于具有空原型(sub ()
)的匿名子程序。)
在变量可能在其他地方被修改的情况下,这种用法现在已弃用。Perl 会检测这些情况并发出弃用警告。此类代码可能会在将来发生变化,并停止生成常量。
如果您的变量仅在声明的地方被修改,那么 Perl 将继续使子程序可内联,不会发出警告。
sub make_constant {
my $var = shift;
return sub () { $var }; # fine
}
sub make_constant_deprecated {
my $var;
$var = shift;
return sub () { $var }; # deprecated
}
sub make_constant_deprecated2 {
my $var = shift;
log_that_value($var); # could modify $var
return sub () { $var }; # deprecated
}
在上面的第二个示例中,检测 $var
是否只被赋值一次太难了。它发生在 my
声明之外的地方,足以让 Perl 认为它可疑。
此弃用警告仅针对子程序主体中的简单变量。(子程序内部的 BEGIN
块或 use
语句将被忽略,因为它不会成为子程序主体的一部分。)对于更复杂的情况,例如 sub () { do_something() if 0; $var }
,行为已发生改变,如果变量在其他地方可修改,则不会发生内联。此类情况应该很少见。
/x
正则表达式修饰符现在已弃用以下任何一种说法
qr/foo/xx;
/(?xax:foo)/;
use re qw(/amxx);
也就是说,现在 x
应该只在任何连续的正则表达式模式修饰符字符串中出现一次。我们认为在整个 CPAN 中都没有出现这种情况。这是为了准备未来的 Perl 版本,其中 /xx
允许在方括号字符类(括在方括号中:[...]
)中使用空格以提高可读性。
\N{...}
的字符别名中使用不间断空格现在已弃用此非图形字符本质上与普通空格无法区分,因此不应该被允许。请参阅 "CUSTOM ALIASES" in charnames。
"{"
如果您想要在正则表达式模式中使用字面左花括号(也称为左大括号),您现在应该通过在它前面加上反斜杠 ("\{"
) 或将其括在方括号 "[{]"
中,或者使用 \Q
来转义它;否则将发出弃用警告。这在 v5.16 版本中首次宣布即将发布;它将允许将来对语言进行扩展。
有关 致命警告 的文档指出,use warnings FATAL => 'all'
不鼓励使用,并提供了更强烈的语言来描述致命警告的风险。
如果方法或类名在编译时已知,则会预先计算哈希值以加快运行时方法查找速度。此外,像 SUPER::new
这样的复合方法名在编译时解析,以避免在运行时解析它们。
现在,仅使用常量或简单变量作为键的数组和哈希查找(尤其是嵌套查找)速度明显更快。有关更多详细信息,请参阅 "内部更改"。
(...)x1
、("constant")x0
和 ($scalar)x0
现在在列表上下文中进行了优化。如果右操作数是常量 1,则重复运算符将消失。如果右操作数是常量 0,则整个表达式将被优化为空列表,只要左操作数是简单标量或常量即可。(也就是说,(foo())x0
不受此优化的影响。)
substr
赋值现在在子例程结束时(或作为 return
的参数)被优化为 4 个参数的 substr
。以前,这种优化只发生在空上下文。
在 "\L..."
、"\Q..."
等中,额外的“字符串化”操作现在被优化掉了,使它们与 lcfirst
、quotemeta
等一样快。
现在,对空列表的赋值有时更快。特别是,它永远不会在右侧的绑定参数上调用 FETCH
,而以前有时会调用。
当 length
应用于非魔法、非绑定的字符串,并且 use bytes
在作用域内或字符串在内部不使用 UTF-8 时,性能提高了高达 20%。
在大多数具有 64 位整数的 Perl 构建中,仅包含浮点数的非魔法、非绑定标量的内存使用量减少了 8 到 32 字节,具体取决于操作系统。
在 @array = split
中,赋值可以被优化掉,以便 split
直接写入数组。这种优化只发生在除 @_
之外的包数组中,而且只发生在某些情况下。现在这种优化几乎一直发生。
join
现在受常量折叠的影响。例如,join "-", "a", "b"
在编译时被转换为 "a-b"
。此外,使用标量或常量作为分隔符和单个项目列表进行连接的 join
被简化为字符串化,并且分隔符甚至不会被求值。
qq(@array)
使用两个操作实现:字符串化操作和连接操作。如果 qq
仅包含单个数组,则字符串化将被优化掉。
our $var
和 our($s,@a,%h)
在空上下文不再在运行时求值。即使是一系列完整的 our $foo;
语句也会被简单地跳过。state
变量也是如此。
许多内部函数已被重构以提高性能并减少其内存占用。 [GH #13659] [GH #13856] [GH #13874]
-T
和 -B
文件测试在检测到空文件时将更快返回。 [GH #13686]
键为常量的哈希查找速度更快。
具有空原型且主体仅包含 undef
的子例程现在有资格进行内联。 [GH #14077]
包中的子例程不再需要存储在类型全局变量中:如果可能,声明子例程现在将直接在存储区中放置一个简单的子引用,从而节省内存。类型全局变量仍然名义上存在,因此访问它会导致存储区条目升级为类型全局变量(即这只是一个内部实现细节)。此优化目前不适用于 XSUB 或导出的子例程,并且方法调用会撤消它,因为它们在类型全局变量中缓存内容。 [GH #13392]
函数 utf8::native_to_unicode()
和 utf8::unicode_to_native()
(参见 utf8)现在在 ASCII 平台上被优化掉。现在即使在编写 ASCII 和 EBCDIC 平台之间可移植的代码时,也几乎没有性能损失。
Win32 Perl 每个 perl 进程使用的进程内存比以前减少了 8 KB,因为一些数据现在从磁盘内存映射,并在来自同一 perl 二进制文件的进程之间共享。
与 perl 一起分发的许多库自 v5.20.0 以来已升级。有关更改的完整列表,请运行
corelist --diff 5.20.0 5.22.0
您也可以用您喜欢的版本替换 5.20.0。
一些值得注意的更改包括
Archive::Tar 已升级到 2.04 版。
测试现在可以并行运行。
attributes 已升级到 0.27 版。
已更正 XS 中 memEQs
的使用。 [GH #14072]
避免读取缓冲区末尾以外的内容。[perl #122629]
B 已升级到 1.58 版。
它提供了一个新的 B::safename
函数,基于现有的 B::GV->SAFENAME
,它将 \cOPEN
转换为 ^OPEN
。
空 COP 现在属于 B::COP
类,而不是 B::OP
类。
B::REGEXP
对象现在提供了一个 qr_anoncv
方法,用于访问与包含代码块的 qr//
相关联的隐式 CV,以及一个 compflags
方法,该方法返回源自 qr//blahblah
操作的相关标志。
B::PMOP
现在提供了一个 pmregexp
方法,返回一个 B::REGEXP
对象。引入了两个新类,B::PADNAME
和 B::PADNAMELIST
。
已修复一个错误,该错误是在 ithread 创建或伪分叉后,子 ithread/伪进程中的特殊/永生 SV 没有正确的 B::SPECIAL
类。已添加 id
和 outid
PADLIST 方法。
B::Concise 已升级到 0.996 版本。
现在为执行链中的一部分的空操作分配了序列号。
现在将空操作的私有标志与助记符一起转储,就像非空操作的对应标志一样。
B::Deparse 已升级到 1.35 版本。
现在它在语句开头正确地反解析 +sub : attr { ... }
。如果没有初始的 +
,sub
将是一个语句标签。
BEGIN
块现在大多数情况下都在正确的位置发出,但更改不幸地引入了回归,即在封闭块结束之前出现的 BEGIN
块可能出现在其下方。
B::Deparse
不再在某些地方放置错误的 local
,例如 LIST = tr/a//d
。[perl #119815]
如果一个 use
语句包含一个 do
块,相邻的 use
语句将不再意外地嵌套。[perl #115066]
传递给 \
的列表中的带括号的数组现在被正确地反解析为带括号的数组(例如,\(@a, (@b), @c)
现在保留了 @b
周围的括号),从而保留了引用带括号的数组的扁平化行为。以前,它只对一个数组有效:\(@a)
。
local our
现在被正确地反解析,包括 our
。
for($foo; !$bar; $baz) {...}
被反解析为没有 !
(或 not
)。这个问题已修复。
与词法子例程冲突的核心关键字现在使用 CORE::
前缀反解析。
foreach state $x (...) {...}
现在使用 state
而不是 my
正确地反解析。
our @array = split(...)
现在在那些赋值被优化掉的情况下使用 our
正确地反解析。
它现在正确地反解析 our(LIST)
和类型化的词法(my Dog $spot
)。
将 $#_
反解析为 $#_
而不是 $#{_}
。 [GH #14545]
现在在封闭作用域末尾的 BEGIN
块在正确的位置反解析。[perl #77452]
BEGIN
块有时被反解析为 __ANON__
,但现在始终被称为 BEGIN
。
现在完全反解析了词法子例程。[perl #116553]
Anything =~ y///r
使用 /r
不再省略左操作数。
构成正则表达式代码块的 op 树现在被真正地反解析了。以前,使用构成正则表达式的原始字符串。这会导致 qr/(?{<<heredoc})/
和多行代码块出现问题,这些代码块被错误地反解析。[perl #123217] [perl #115256]
语句末尾的 $;
不会再丢失分号。[perl #123357]
一些以简写形式存储在 stash 中的子程序声明被省略了。
非 ASCII 字符现在在字符串中始终被转义,而不是有时才转义。(正则表达式和标识符中仍然存在一些尚未修复的未解决问题。)
当使用 &
反解析原型子程序调用时(例如,在 -P 选项下),现在会根据需要添加 scalar
,以强制执行原型隐含的标量上下文。
require(foo())
、do(foo())
、goto(foo())
和类似的带有循环控制的结构现在被正确地反解析。外部括号不是可选的。
正则表达式中的空白字符不再被转义,因为它们在 (?x:...)
部分中被错误地转义了。
sub foo { foo() }
现在被反解析为带有这些强制括号。
/@array/
现在被反解析为正则表达式,而不仅仅是 @array
。
/@{-}/
、/@{+}/
和 $#{1}
现在被反解析为带有大括号,这些大括号在这些情况下是强制性的。
在反解析特性包时,B::Deparse
首先发出 no feature;
而不是 no feature ':all';
。这个问题已经修复。
chdir FH
现在被反解析为不带引号。
\my @a
现在被反解析为不带括号。(括号会使数组扁平化。)
system
和 exec
后面跟着一个代码块现在被正确地反解析。以前在代码块之前有一个错误的 do
。
use constant QR => qr/.../flags
后面跟着 "" =~ QR
现在不再没有标志。
在启用 -w 开关的情况下,反解析 BEGIN { undef &foo }
开始在 Perl 5.14 中发出“未初始化”警告。这个问题已经修复。
反解析带有 (;+)
原型的子程序调用会导致无限循环。(;$
) (_)
和 (;_)
原型被赋予了错误的优先级,导致 foo($a<$b)
被反解析为不带括号。
Deparse 现在在内部子例程中提供了一个定义的状态子例程。
B::Op_private 已添加。
B::Op_private 提供有关 perl 操作码的 op_private
字段中使用的标志的详细信息。
bigint、bignum、bigrat 已升级到 0.39 版本。
在 CAVEATS 中记录使用字符串作为数字并不总是会调用大数重载,以及如何调用它。[rt.perl.org #123064]
Carp 已升级到 1.36 版本。
如果 Carp 版本高于 1.12,Carp::Heavy
现在会忽略与 Carp 的版本不匹配,因为 Carp::Heavy
的内部代码已在该版本中合并到 Carp 中。 [GH #13708]
Carp 现在可以更好地处理非 ASCII 平台。
修复了 Perl < 5.14 的越界错误。
constant 已升级到 1.33 版本。
它现在接受完全限定的常量名称,允许在调用者以外的包中定义常量。
CPAN 已升级到 2.11 版本。
添加对 Cwd::getdcwd()
的支持,并引入对 Strawberry Perl 5.20.1 上出现的错误行为的解决方法。
修复构建依赖项后 chdir()
的错误。
引入对插件/钩子的实验性支持。
集成 App::Cpan
源代码。
不要检查可选依赖项的递归。
对 META.yml 进行完整性检查,以确保它包含一个哈希。 [cpan #95271]
CPAN::Meta::Requirements 已升级到 2.132 版本。
解决 version::vpp
在检测 v 字符串魔术方面的限制,并为早于 5.10.0 的 Perl 添加对即将发布的 ExtUtils::MakeMaker 引导 version.pm 的支持。
Data::Dumper 已升级到 2.158 版本。
通过添加一个配置变量/选项来限制转储深度数据结构时的递归,从而修复 CVE-2014-4330。
更改以解决 Coverity 问题。XS 转储错误地存储了存储在 GLOB 中的代码引用的名称。 [GH #13911]
DynaLoader 已升级到 1.32 版本。
如果 Dynaloader 中未使用 dl_nonlazy
全局变量,则将其删除。[perl #122926]
Encode 已升级到 2.72 版本。
piconv
现在在编码名称不存在时具有更好的错误处理,并且在 perl-5.8.2 及更早版本中升级 Encode 时的构建中断已修复。
现在可以在 Windows 上使用 C++ 模式构建。
Errno 已升级到 1.23 版本。
在 GCC 5 上将 -P
添加到预处理器命令行。GCC 添加了额外的行指令,破坏了错误代码定义的解析。[rt.perl.org #123784]
experimental 已升级到 0.013 版本。
为早于 5.15.7 的 Perl 硬编码功能。
ExtUtils::CBuilder 已升级至 0.280221 版本。
修复了 Android 上的回归问题。 [GH #14064]
ExtUtils::Manifest 已升级至 1.70 版本。
修复了 maniread()
处理带引号的文件名的错误,并改进了 manifind()
以遵循符号链接。 [GH #14003]
ExtUtils::ParseXS 已升级至 3.28 版本。
仅在我们实际定义 file
时才声明它未使用。 改进了生成的 RETVAL
代码生成,以避免对 ST(0)
的重复引用。 [perl #123278] 扩展并记录了 /OBJ$/
到 /REF$/
类型映射优化,用于 DESTROY
方法。 [perl #123418]
Fcntl 已升级至 1.13 版本。
添加了对 Linux 管道缓冲区大小 fcntl()
命令的支持。
File::Find 已升级至 1.29 版本。
find()
和 finddepth()
现在将在传递不适当或拼写错误的选项时发出警告。
File::Glob 已升级至 1.24 版本。
避免 SvIV()
在几个地方扩展为调用 get_sv()
三次。 [perl #123606]
HTTP::Tiny 已升级至 0.054 版本。
keep_alive
现在是 fork 安全和线程安全的。
IO 已升级至 1.35 版本。
为了旧版本的 Perl,XS 实现已修复。
IO::Socket 已升级至 1.38 版本。
记录了 connected()
方法的限制。 [perl #123096]
IO::Socket::IP 已升级至 0.37 版本。
对子类化 connect()
的更好修复。 [cpan #95983] [cpan #97050]
为 connect()
实现超时。 [cpan #92075]
libnet 模块集合已升级至 3.05 版本。
对 Net::FTP
、Net::NNTP
、Net::POP3
和 Net::SMTP
的 IPv6 和 SSL 支持。 Net::SMTP
身份验证方面的改进。
Locale::Codes 已升级至 3.34 版本。
修复了用于从电子表格中提取数据的脚本中的一个错误,该错误阻止了找到 SHP 货币代码。 [cpan #94229]
添加了新的代码。
Math::BigInt 已升级至 1.9997 版本。
同步 CPAN 版本的 POD 更改。Math::BigFloat->blog(x)
在精度超过 70 位时,有时会返回 blog(2*x)
。现在,Math::BigFloat->bdiv()
在列表上下文中返回的结果满足 x = quotient * divisor + remainder
。
修正子类的处理方式。 [cpan #96254] [cpan #96329]
Module::Metadata 已升级到 1.000026 版本。
支持在较旧的 Perl 上安装,这些 Perl 的 ExtUtils::MakeMaker 版本早于 6.63_03。
overload 已升级到 1.26 版本。
已删除多余的 ref $sub
检查。
PathTools 模块集合已升级到 3.56 版本。
现在在构建 XS 时避免了来自 gcc 编译器的警告。
在 Cygwin 上不要将开头的 //
转换为 /
。[perl #122635]
perl5db.pl 已升级到 1.49 版本。
调试器会导致断言失败。 [GH #14605]
在 tmux
下,调试器中的 fork()
现在将为派生进程创建一个新窗口。 [GH #13602]
调试器现在在启动时保存当前工作目录,并在使用 R
或 rerun
重新启动程序时恢复它。 [GH #13691]
PerlIO::scalar 已升级到 0.22 版本。
从标量末尾远超位置读取现在会正确返回文件结束。[perl #123443]
寻求负位置仍然会失败,但不再将文件位置设置为否定位置。
在 32 位系统上,当文件位置超过 2GB 标记时,PerlIO::scalar
句柄上的 eof()
现在会正确返回 true。
尝试在平台无法访问的文件位置写入现在会尽早失败,而不是在 4GB 处换行。
Pod::Perldoc 已升级到 3.25 版本。
以读或写方式打开的文件句柄现在已设置 :encoding(UTF-8)
。 [cpan #98019]
POSIX 已升级到 1.53 版本。
已添加 C99 数学函数和常量(例如 acosh
、isinf
、isnan
、round
、trunc
;M_E
、M_SQRT2
、M_PI
)。
POSIX::tmpnam()
现在会产生弃用警告。[perl #122005]
Safe 已升级到 2.39 版本。
reval
没有正确地传播空上下文。
Scalar-List-Utils 已升级到 1.41 版本。
添加了一个新模块 Sub::Util,其中包含与 CODE 引用相关的函数,包括 subname
(受 Sub::Identity
启发)和 set_subname
(从 Sub::Name
复制并重命名)。List::Util::reduce()
中 GetMagic
的使用也已修复。 [cpan #63211]
SDBM_File 已升级到 1.13 版本。
简化了构建过程。[perl #123413]
Time::Piece 已升级到 1.29 版本。
在漂亮打印负 Time::Seconds
时,"减号" 不会再丢失。
Unicode::Collate 已升级到 1.12 版本。
版本 0.67 改进的非连续收缩默认情况下无效,并作为参数 long_contraction
支持。
Unicode::Normalize 已升级到 1.18 版本。
XSUB 实现已被删除,取而代之的是纯 Perl。
Unicode::UCD 已升级到 0.61 版本。
添加了一个新函数 property_values() 用于返回给定属性的可能值。
添加了一个新函数 charprop() 用于返回给定代码点的给定属性的值。
添加了一个新函数 charprops_all() 用于返回给定代码点的所有 Unicode 属性的值。
修复了一个错误,以便 propaliases() 为 Perl 扩展返回正确的短名称和长名称,在该扩展中它是不正确的。
修复了一个错误,以便 prop_value_aliases() 为 Perl 扩展返回 undef
而不是错误的结果。
此模块现在可以在 EBCDIC 平台上运行。
utf8 已升级到 1.17 版本
utf8::downgrade()
中文档和代码之间的不匹配已修复,以支持文档。可选的第二个参数现在被正确地视为 perl 布尔值(真/假语义),而不是整数。
version 已升级到 0.9909 版本。
大量更改。有关详细信息,请参阅 CPAN 发行版中的 Changes 文件。
Win32 已升级到 0.51 版本。
GetOSName()
现在支持 Windows 8.1,并且在 C++ 模式下构建现在可以正常工作。
Win32API::File 已升级到 0.1202 版本
在 C++ 模式下构建现在可以正常工作。
XSLoader 已升级到 0.20 版本。
允许 XSLoader 从不同的命名空间加载模块。[perl #122455]
以下模块(以及相关模块)已从核心 perl 发行版中移除
这份由 Tom Christiansen 编写的文档提供了在 Perl 中处理 Unicode 的示例。
添加了关于长双精度浮点数的说明。
请注意,SvSetSV
不执行设置魔法。
sv_usepvn_flags
- 修复文档以提及使用 Newx
而不是 malloc
。
阐明 NUL
可能嵌入或需要终止字符串的位置。
由于格式错误而之前缺失的一些文档现已包含在内。
条目现在按组而不是按它们所在的文件进行组织。
条目现在按字母顺序一致排序(由 POD 生成器自动完成),以便在扫描时更容易找到条目。
单字符变量名的语法已更新并更全面地解释。
描述了十六进制浮点数,以及无穷大和 NaN。
这份文档已根据最近对 EBCDIC 支持的改进进行了重大更新。
添加了 限制 部分。
提到 study()
目前是一个空操作。
现在将对数组值调用 delete
或 exists
描述为“强烈不建议”而不是“已弃用”。
改进 our
的文档。
-l
现在会说明如果文件系统不支持符号链接,它将返回 false。 [GH #13695]
请注意,exec LIST
和 system LIST
可能会在 Win32 上回退到 shell。只有间接对象语法 exec PROGRAM LIST
和 system PROGRAM LIST
才能可靠地避免使用 shell。
这也在 perlport 中有所说明。
OOK 示例已更新,以考虑 COW 更改和偏移量存储方式的更改。
添加了有关 C 级符号和 libperl.t 的详细信息。
添加了有关 Unicode 处理的信息
添加了有关 EBCDIC 处理的信息
添加了关于在非 ASCII 字符集平台上运行的说明
添加了关于性能测试的说明
添加了文档,说明了假设 Perl 的 C 库函数包装器返回值指向的静态内存内容没有更改的危险。
现在建议使用 tmpfile
、atoi
、strtol
和 strtoul
的替代品。
更新了 test.valgrind
make
目标的文档。 [GH #13658]
提供了有关将测试文件移植到非 ASCII 平台的信息。
添加了关于如何获取 C 语言堆栈回溯的说明。
请注意,消息“重新声明“sendpath”具有不同的存储类说明符”是无害的。
更新了 v5.22 中的增强功能,并进行了一些澄清。
我们现在不再指向模块列表,而是指向 PrePAN。
更新了 v5.22 中的增强功能,并进行了一些澄清。
pod 语言的规范正在更改,因此,默认情况下,不在 UTF-8 中的 pod 的编码(除非另有说明)为 CP1252,而不是 ISO 8859-1(Latin1)。
我们现在为 p5p 邮件列表制定了一套行为准则,如 "STANDARDS OF CONDUCT" in perlpolicy 中所述。
现在已经设定了将实验性功能标记为非实验性功能的条件。
已经澄清了维护版本中允许进行哪些更改。
已修复和/或简化了过时的 VMS 特定信息。
添加了有关 EBCDIC 的说明。
/x
修饰符的描述已澄清,指出注释不能通过转义来延续到下一行;现在有一个列表列出了此修饰符认为是空白的所有字符。
描述了新的 /n
修饰符。
添加了关于如何使方括号字符类范围可移植到非 ASCII 机器的说明。
添加了 \b{sb}
、\b{wb}
、\b{gcb}
和 \b{g}
的文档。
在 "perlrecharclass 中的字符范围" 中添加了澄清说明,即在正则表达式方括号字符类中,[A-Z]
、[a-z]
、[0-9]
及其任何子范围都保证与天真的英语使用者期望匹配的内容完全相同,即使在 perl 必须执行额外工作才能实现此目的的平台(如 EBCDIC)上也是如此。
方括号字符类的文档已扩展,涵盖了 qr/[\N{named sequence}]/
的改进(请参阅 "选定的错误修复" 下的内容)。
添加了一个新部分 分配给引用
添加了关于算法复杂度和绑定哈希的注释。
已更正 ...
语句文档中的歧义。 [GH #14054]
for
和 while
中的空条件现在已在 perlsyn 中记录。
这已经过大量修订,使其与当前的 Unicode 支持保持一致,并使其更易读。值得注意的是,Unicode 7.0 改变了它对非字符的处理方式。出于向后兼容性的原因,Perl 保留了旧的处理方式。请参阅 "perlunicode 中的非字符代码点"。
更新了有关如何确保您的字符串和正则表达式模式被解释为 Unicode 的建议。
$]
现在不再被标记为已弃用。相反,文档中增加了关于使用它与 $^V
的优缺点的讨论。$OLD_PERL_VERSION
作为 $]
的长形式重新添加到文档中。
${^ENCODING}
现在被标记为已弃用。
%^H
的条目已澄清,表明它只能处理简单值。
已删除过时或不正确的材料。
更新了有关 VMS 中环境和 shell 交互的文档。
添加了关于 XS 代码中区域设置问题的讨论。
诊断输出(包括警告和致命错误消息)已进行以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
(P) 内部请求要求将标量条目添加到非符号表条目中。
(F) 您尝试将哈希用作引用,例如 %foo->{"bar"}
或 %$ref->{"hello"}
。Perl 版本 <= 5.6.1 曾经允许这种语法,但实际上不应该。
(F) 您尝试将数组用作引用,例如 @foo->[23]
或 @$ref->[99]
。Perl 版本 <= 5.6.1 曾经允许这种语法,但实际上不应该。
无法使用 'defined(@array)'(也许您应该直接省略 defined()?)
(F) defined()
对数组无效,因为它检查的是未定义的标量值。如果您想查看数组是否为空,只需使用 if (@array) { # 非空 }
即可。
无法使用 'defined(%hash)'(也许您应该直接省略 defined()?)
(F) defined()
通常不适用于哈希。
虽然 defined %hash
在一个普通的未使用的哈希上为假,但在一些不明显的情况下会变为真,包括迭代器、弱引用、存储名称,甚至在 undef %hash
之后仍然为真。这些情况使得 defined %hash
在实践中几乎毫无用处,因此现在会产生致命错误。
如果你想要检查非空,那么只需将其置于布尔上下文中(参见 "perldata 中的标量值")
if (%hash) {
# not empty
}
如果你使用 defined %Foo::Bar::QUUX
来检查这样的包变量是否存在,那么这从来都不是很可靠,也不是查询包的特性或是否已加载等的好方法。
(F) 你向 chr
传递了一个无效的数字(例如无穷大或非数字)。
(F) 你尝试将无穷大或非数字转换为无符号字符,这是没有意义的。
(F) 你尝试将无穷大或非数字转换为字符,这是没有意义的。
(F) 你尝试将无穷大或非数字作为字符(%c
)打印,这是没有意义的。也许你想要 '%s'
,或者只是将其转换为字符串?
(F) 你定义了一个字符名称,其中包含连续的多个空格字符。将它们更改为单个空格。通常这些名称是在 use charnames
的 :alias
导入参数中定义的,但它们也可以由安装到 $^H{charnames}
中的翻译器定义。参见 "charnames 中的自定义别名"。
(F) 你定义了一个字符名称,它以空格字符结尾。删除尾随空格。通常这些名称是在 use charnames
的 :alias
导入参数中定义的,但它们也可以由安装到 $^H{charnames}
中的翻译器定义。参见 "charnames 中的自定义别名"。
(F) const
属性会导致在克隆匿名子例程时运行它并捕获其值。命名子例程不会像这样克隆,因此该属性对它们没有意义。
(F) 十六进制浮点数处理中出现严重错误。
(F) 您已配置 Perl 使用 long double,但 long double 格式的内部结构未知,因此无法输出十六进制浮点数。
(F) 在 suidperl 下运行的脚本存在非法操作。
在 '(?...)' 中,'(' 和 '?' 必须相邻,标记为 <-- HERE 在 m/%s/ 中
(F) 在正则表达式模式中,此处的两个字符序列 "(?"
应该是一个不可分割的标记,"("
和 "?"
之间没有任何间隔,但您将它们分开了。
在 '(*VERB...)' 中,'(' 和 '*' 必须相邻,标记为 <-- HERE 在 m/%s/ 中
(F) 在正则表达式模式中,此处的两个字符序列 "(*"
应该是一个不可分割的标记,"("
和 "*"
之间没有任何间隔,但您将它们分开了。
正则表达式中 {,} 中的量词无效;标记为 <-- HERE 在 m/%s/ 中
(F) 该模式看起来像一个 {min,max} 量词,但 min 或 max 无法解析为有效的数字:要么它有前导零,要么它表示的数字太大而无法处理。 <-- HERE 显示了在正则表达式中发现问题的位置。请参阅 perlre。
(F) 您使用了 \b{...}
或 \B{...}
,而 ...
对 Perl 来说是未知的。当前有效的类型在 perlrebackslash 中的 "\b{}, \b, \B{}, \B" 中给出。
(F) 您尝试使用没有参数或使用未定义的值作为参数来调用 require
。require
期望一个包名或一个文件规范作为参数。请参阅 perlfunc 中的 "require"。
以前,require
没有参数或 undef
会警告空文件名。
(D 已弃用) /\C/
字符类在 v5.20 中已弃用,现在会发出警告。它将成为 v5.24 中的错误。此字符类匹配单个字节,即使它出现在多字节字符中,也会破坏封装,并可能破坏 UTF-8 字符串。
"%s" 在正则表达式中可以更简洁地写成 "%s";标记为 <-- HERE 在 m/%s/ 中
(W regexp) (仅在 use re 'strict'
或 (?[...])
中)
您指定了一个字符,它有更简洁的写法,并且可以移植到运行不同字符集的平台上。
(W numeric) 指示的字符串被作为参数传递给 ++
运算符,该运算符期望一个数字或一个匹配 /^[a-zA-Z]*[0-9]*\z/
的字符串。有关详细信息,请参阅 "perlop 中的自动增量和自动减量"。
正则表达式中的范围两端都应为 Unicode 或都不应为 Unicode;标记为 <-- HERE 在 m/%s/ 中
(W regexp) (仅在 use re 'strict'
或 (?[...])
中)
在正则表达式模式的方括号字符类中,您有一个范围,其中只有一个端点使用 \N{}
指定,而另一个端点使用非可移植机制指定。Perl 将该范围视为 Unicode 范围,即其中的所有字符都被视为 Unicode 字符,并且在 Perl 运行的一些平台上可能具有不同的代码点。例如,[\N{U+06}-\x08]
被视为您说 [\N{U+06}-\N{U+08}]
,即它匹配 Unicode 代码点为 6、7 和 8 的字符。但 \x08
可能表示您指的是其他内容,因此会发出警告。
无法在非 UTF-8 本地化环境中执行 %s("%s");解析为 "%s"。
(W locale) 您 1) 在 "use locale
" 下运行;2) 当前本地化环境不是 UTF-8 本地化环境;3) 您尝试对指定的 Unicode 字符执行指定的案例更改操作;以及 4) 此操作的结果将混合 Unicode 和本地化规则,这可能会发生冲突。
警告类别 locale
是新的。
(S experimental::const_attr) const
属性处于实验阶段。如果您想使用此功能,请使用 no warnings 'experimental::const_attr'
禁用警告,但请注意,这样做会冒您的代码在未来的 Perl 版本中可能出现问题的风险。
(W overflow) 您使用 gmtime
调用了一个它无法处理的数字:太大、太小或 NaN。返回值为 undef
。
(W overflow) 十六进制浮点数的指数大于浮点数支持的指数。
(W overflow) 十六进制浮点数的指数小于浮点数支持的指数。
(W 溢出) 十六进制浮点数字面量在尾数(0x
和指数之间的部分,也称为分数或有效数字)中包含的位数超过了浮点数支持的位数。
(W 溢出) 十六进制浮点数在内部包含的数字超过了可以输出的数字。这可能是由于不支持的 long double 格式,或者由于 64 位整数不可用(在某些配置下需要检索数字)。
(W 区域设置) 您正在使用命名的区域设置,这是一个非 UTF-8 区域设置,Perl 已经确定它与它可以处理的内容不完全兼容。第二个 %s
给出了原因。
警告类别 locale
是新的。
(W 溢出) 您使用了一个 localtime
无法处理的数字调用了 localtime
:太大、太小或 NaN。返回值为 undef
。
(W 数字) 您尝试执行少于 0 次的 x
重复运算符,这是没有意义的。
(D 已弃用) 您定义了一个包含不间断空格字符的字符名。将其更改为普通空格。通常这些名称是在 use charnames
的 :alias
导入参数中定义的,但它们也可以由安装到 $^H{charnames}
中的翻译器定义。请参阅 "charnames 中的自定义别名"。
(W 数字) 您尝试执行 Inf
(或 -Inf
)或 NaN 次的 x
重复运算符,这是没有意义的。
(S experimental::win32_perlio) :win32
PerlIO 层处于实验阶段。如果您想冒使用此层的风险,只需禁用此警告。
no warnings "experimental::win32_perlio";
ASCII 可打印字符的范围应为 "0-9"、"A-Z" 或 "a-z" 的某个子集,在正则表达式中标记为 <-- HERE in m/%s/
(W regexp) (仅在 use re 'strict'
或 (?[...])
中)
更严格的规则有助于查找打字错误和其他错误。也许您甚至没有打算在这里使用范围,如果 "-"
应该表示其他字符,或者应该转义(例如 "\-"
)。如果您确实打算使用范围,那么使用的范围在 ASCII 和 EBCDIC 平台之间不可移植,并且对普通读者没有明显的意义。
[3-7] # OK; Obvious and portable
[d-g] # OK; Obvious and portable
[A-Y] # OK; Obvious and portable
[A-z] # WRONG; Not portable; not clear what is meant
[a-Z] # WRONG; Not portable; not clear what is meant
[%-.] # WRONG; Not portable; not clear what is meant
[\x41-Z] # WRONG; Not portable; not obvious to non-geek
(您可以通过指定 Unicode 范围来强制可移植性,这意味着端点由 \N{...}
指定,但含义可能仍然不明确。) 较严格的规则要求以非控制 ASCII 字符开头或结尾的范围,其所有端点都必须是文字字符,而不是一些转义序列(如 "\x41"
),并且范围必须全部是数字、全部是大写字母或全部是小写字母。
数字范围应来自正则表达式中的同一组;在 m/%s/ 中标记为 <-- HERE
(W regexp) (仅在 use re 'strict'
或 (?[...])
中)
更严格的规则有助于查找打字错误和其他错误。您包含了一个范围,并且至少有一个端点是十进制数字。在更严格的规则下,当发生这种情况时,两个端点都应该是 10 个连续数字的同一组中的数字。
(W 冗余) 您使用比需要的更多参数调用了一个函数,如您提供的其他参数中的信息所示(例如,printf 格式)。目前仅在 printf 类型格式要求的参数少于提供的参数时才会发出,但将来可能会用于例如 "perlfunc 中的 pack"。
警告类别 redundant
是新的。另请参阅 [GH #13534]。
这不是一个新的诊断,但在早期版本中,如果转录包含宽字符,则会意外地不显示。现在已修复,因此您可能会在以前没有看到(但应该看到)的地方看到此诊断。
在非 UTF-8 本地化中使用 \b{} 是错误的。假设一个 UTF-8 本地化
(W 本地化) 您正在使用本地化规则匹配正则表达式,并且正在匹配 Unicode 边界,但本地化不是 Unicode 本地化。这没有意义。Perl 将继续,假设一个 Unicode (UTF-8) 本地化,但结果很可能是错误的,除非本地化碰巧是 ISO-8859-1 (Latin1),在这种情况下,此消息是虚假的,可以忽略。
警告类别 locale
是新的。
在正则表达式中使用 /u 代替 /%s;在 m/%s/ 中标记为 <-- HERE
(W 正则表达式) 您在正则表达式的一部分中使用了 Unicode 边界 (\b{...}
或 \B{...}
),其中字符集修饰符 /a
或 /aa
生效。这两个修饰符表示 ASCII 解释,这对 Unicode 定义没有意义。生成的正则表达式将编译,以便边界使用所有 Unicode。正则表达式的其他部分不受影响。
(S experimental::bitwise) 如果您在启用“位运算”功能的情况下使用位运算符 (& | ^ ~ &. |. ^. ~.
),则会发出此警告。如果您想使用该功能,只需抑制警告,但要知道,这样做是在承担使用实验性功能的风险,该功能可能会在将来的 Perl 版本中更改或删除。
no warnings "experimental::bitwise";
use feature "bitwise";
$x |.= $y;
正则表达式中未转义的左大括号已弃用,在正则表达式中传递;在 m/%s/ 中标记为 <-- HERE
(D 已弃用,正则表达式) 您在正则表达式模式中使用了字面量 "{"
字符。您应该改为使用 "\{"
,因为 Perl 的未来版本(暂定为 v5.26)将认为这是语法错误。如果模式分隔符也是大括号,任何匹配的右大括号 ("}"
) 也应该转义,以避免混淆解析器,例如:
qr{abc\{def\}ghi}
(D 已弃用) 在源代码中使用字面量非图形(包括控制)字符来引用 ^FOO 变量,例如 $^X
和 ${^GLOBAL_PHASE}
现在已弃用。
(W 杂项) const
属性除了对匿名闭包原型之外没有其他作用。您通过 attributes.pm 将其应用于子例程。这仅在匿名子例程的属性处理程序中才有用。
在 transliteration 运算符中无用地使用 /d 修饰符
这不是一个新的诊断,但在早期版本中,如果转录包含宽字符,则会意外地不显示。现在已修复,因此您可能会在以前没有看到(但应该看到)的地方看到此诊断。
(S experimental::re_strict) 当正则表达式模式在 'strict'
下编译时,不同的内容可能会在未来的 Perl 版本中以不兼容的方式发生变化;也有一些建议更改如何启用严格检查,而不是使用此子pragma。这意味着今天编译的模式可能在未来的 Perl 版本中无法编译。此警告是为了提醒您这种风险。
(S io) 以前,perl 在执行文件句柄的隐式关闭时会静默地忽略任何错误,即 当文件句柄的引用计数达到零并且用户代码尚未调用 close()
时;例如
{
open my $fh, '>', $file or die "open: '$file': $!\n";
print $fh, $data or die;
} # implicit close here
在磁盘已满的情况下,由于缓冲,错误可能只在最终关闭时才被检测到,因此不检查关闭结果是危险的。
因此,perl 现在会在这种情况下发出警告。
(W 本地化) 在单字节本地化 (即非 UTF-8 本地化) 中遇到多字节字符。Perl 将此字符视为指定的 Unicode 代码点。将非 UTF-8 本地化与 Unicode 结合使用很危险。几乎可以肯定,某些字符将具有两种不同的表示形式。例如,在 ISO 8859-7 (希腊语) 本地化中,代码点 0xC3 表示大写伽马。但 0x393 也是如此。这将使字符串比较不可靠。
您可能需要弄清楚这个多字节字符是如何与您的单字节本地化混淆的(或者您可能认为您有一个 UTF-8 本地化,但 Perl 不同意)。
警告类别 locale
是新的。
<> 应该用引号
此警告已更改为 <> at require-statement should be quotes 以使问题更容易识别。
此警告的 perldiag 条目添加了以下说明
Note that for the Inf and NaN (infinity and not-a-number) the
definition of "numeric" is somewhat unusual: the strings themselves
(like "Inf") are considered numeric, and anything following them is
considered non-numeric.
此消息已附加 '(did you forget to declare "my %s"?)',以使其对新的 Perl 程序员更有帮助。 [GH #13732]
'"my" 变量 &foo::bar 不能在包中' 已重新措辞为 '子例程' 而不是 '变量'。
\N{} 在正则表达式中被限制为一个字符的字符类中;在 m/%s/ 中标记为 <-- HERE
此消息已将 字符类 更改为 反转字符类或作为范围端点 以反映 qr/[\N{named sequence}]/
的改进(请参阅 "选定的错误修复" 下的内容)。
此消息已附加 ': %f
',以显示导致问题的浮点数是什么。
位运算符 %c 上可能存在优先级问题 重新措辞为 Possible precedence problem on bitwise %s operator。
此警告现在仅在换行符位于文件名末尾时才会产生。
"变量 %s
将不会保持共享" 已更改为在它实际上是一个不会保持共享的词法子例程时说 "子例程"。
此警告的 perldiag 条目已添加有关 Unicode 行为的信息。
“对 -foo 的模糊使用解析为 -&foo()”
这里实际上没有歧义,这阻碍了对否定常量的使用;例如,-Inf
。
“常量不是 FOO 引用”
已删除对常量解引用(例如,my_constant->()
)的编译时检查,因为它没有考虑重载。 [GH #9891] [GH #14044]
已从 Perl 核心删除 x2p/ 目录。
这将删除 find2perl、s2p 和 a2p。它们都已作为单独的发布到 CPAN(App::find2perl
、App::s2p
、App::a2p
)。
h2ph 现在处理编译器预定义宏定义中的十六进制常量,如 $Config{cppsymbols}
中可见。 [GH #14491].
不再依赖于非核心模块。
Configure 现在检查 lrintl()
、lroundl()
、llrintl()
和 llroundl()
。
使用 -Dmksymlinks
的 Configure 现在应该更快。 [GH #13890].
如果存在,pthreads
和 cl
库将默认链接。这允许需要线程的 XS 模块在非线程化的 perl 上工作。请注意,如果您想要一个线程化的 perl,您仍然必须传递 -Dusethreads
。
为了获得更高的精度和范围的浮点数,现在可以使用 GCC quadmath 库,该库在 x86 和 IA-64 平台上实现了四精度浮点数。有关详细信息,请参阅 INSTALL。
MurmurHash64A 和 MurmurHash64B 现在可以配置为内部哈希函数。
make test.valgrind
现在支持并行测试。
例如
TEST_JOBS=9 make test.valgrind
有关更多信息,请参阅 "valgrind" in perlhacktips。
MAD(杂项属性装饰)构建选项已被移除
这是一个未维护的尝试,旨在更忠实地保留 Perl 解析树,以便 Perl 5 到 Perl 6 的自动转换更容易。
此构建时配置选项已多年未维护,并且可能在 Perl 5 和 Perl 6 两侧都严重偏离。
一个新的编译标志,-DPERL_OP_PARENT
可用。有关详细信息,请参阅下面 "内部更改" 中的讨论。
Pathtools 不再尝试在 miniperl 上加载 XS。这会稍微加快构建 perl 的速度。
t/porting/re_context.t 已被添加以测试 utf8 及其依赖项仅使用 $1..$n
捕获变量的子集,这些变量是 Perl_save_re_context()
硬编码为本地化的,因为该函数没有有效的方法在运行时确定要本地化的变量。
在文件 t/perf/taint.t 中添加了性能问题的测试。
一些正则表达式测试的编写方式使得如果某些优化失效,它们将运行非常缓慢。这些测试已移至新文件 t/re/speed.t 和 t/re/speed_thr.t 中,并使用 watchdog()
运行。
test.pl
现在允许 plan skip_all => $reason
,以使其与 Test::More
更兼容。
一个新的测试脚本,op/infnan.t,已被添加以测试无穷大和 NaN 是否正常工作。请参阅 "无穷大和 NaN(非数字)处理改进"。
一些 make test
错误仍然存在:[GH #14557] 和 [GH #14727] 针对 IRIX;[GH #14629],[cpan #99605],以及 [cpan #104836] 针对 Tru64。
核心 perl 现在可以在此 EBCDIC 平台上运行。早期的 perl 也能运行,但即使支持没有正式撤回,最近的 perl 也无法很好地编译和运行。Perl 5.20 可以运行,但存在许多现在已修复的错误。许多与 Perl 一起提供的 CPAN 模块仍然无法通过测试,包括 Pod::Simple
。但是,目前在 CPAN 上的 Pod::Simple
版本应该可以运行;它修复得太晚,无法包含在 Perl 5.22 中。正在努力修复许多仍然无法正常工作的 CPAN 模块,这些模块很可能在完成时安装在 CPAN 上,因此您可能不必等到 Perl 5.24 才能获得工作版本。
NeXTSTEP 是 NeXT 工作站捆绑的专有操作系统,在 90 年代初期到中期流行;OPENSTEP 是一个 API 规范,它在非 NeXTSTEP 系统上提供了类似 NeXTSTEP 的环境。两者现已停止维护,因此对它们构建 Perl 的支持已被移除。
在 EBCDIC 平台上,perl 解释器需要特殊处理才能使 qr/[i-j]/
仅匹配 "i"
和 "j"
,因为 "i"
和 "j"
的代码点之间有 7 个字符。这种特殊处理以前只在范围的两端都是字面量时才调用。现在,如果使用任何 \N{...}
形式通过名称或 Unicode 代码点指定字符,而不是字面量,也会调用它。请参阅 "perlrecharclass 中的字符范围"。
archname 现在区分 use64bitint 和 use64bitall。
构建支持已针对交叉编译(尤其是 Android)进行了改进。
在不等待的情况下生成子进程时,返回值现在是正确的 PID。
修复了一个原型,以便在 VMS C++ 编译器下链接不会失败。
finite
、finitel
和 isfinite
检测已添加到 configure.com
中,环境处理进行了一些细微更改,并修复了遗留功能检查状态。
miniperl.exe 现在使用 -fno-strict-aliasing
构建,允许在 GCC 4.8 上完成 64 位构建。 [GH #14556]
nmake minitest
现在可以在 Win32 上运行。由于依赖关系问题,您需要先构建 nmake test-prep
,并且一小部分测试会失败。 [GH #14318]
现在可以通过将 makefile 宏 USE_CPLUSPLUS
设置为值 "define",在 Windows 上以 C++ 模式构建 Perl。
已为 Win32 实现管道打开的列表形式。注意:与 system LIST
不同,它不会回退到 shell。 [GH #13574]
在 Windows makefile 中添加了新的 DebugSymbols
和 DebugFull
配置选项。
以前,使用 Visual C++ 为 Win64 编译 XS 模块(包括 CPAN 模块)会导致每个文件从 hv_func.h 中产生大约十几个警告。这些警告已被消除。
从 Windows makefile 中删除了在没有 PerlIO 的情况下构建的支持。在 Perl 5.18.0 中,非 PerlIO 构建几乎被弃用,并且在 POSIX 系统上,Configure 已经不支持它们。
每个尝试为 @INC
中的每个路径打开 perl 模块的操作,都节省了 2 到 6 毫秒和 7 次 I/O 调用。
Intel C 构建现在始终以 C99 模式构建。
%I64d
现在被用于 MinGW,而不是 %lld
。
在实验性的 :win32
层中,修复了 open
中的崩溃。此外,还为 :win32
实现了打开 /dev/null(在 Win32 Perl 的默认 :unix
层中有效)。[GH #13968]
Windows dmake Makefile 中添加了一个新的 Makefile 选项 USE_LONG_DOUBLE
,仅适用于 gcc 构建。如果希望 Perl 使用长双精度数来提高浮点数的精度和范围,请将其设置为“define”。
在 OpenBSD 上,Perl 现在默认使用系统 malloc
,因为它提供了安全功能。由于性能原因,Perl 自 v5.14 起一直在使用自己的 malloc 包装器,但 OpenBSD 项目认为这种权衡是值得的,并且希望需要速度的用户明确要求它。
我们现在会在 /opt/solstudio* 和 /opt/solarisstudio* 中查找 Sun Studio 编译器。
在 Solaris 10 上使用 -Dusedtrace
构建会提前失败,因为 make 没有遵循隐式依赖关系来构建 perldtrace.h
。在 depend
中添加了显式依赖关系。[GH #13334]
C99 选项已清理;提示会查找 solstudio
和 SUNWspro
;并且添加了对原生 setenv
的支持。
已添加实验性支持,允许 optree 中的操作定位其父级(如果有)。这由非默认构建选项 -DPERL_OP_PARENT
启用。预计这最终将默认启用,因此直接访问操作的 op_sibling
字段的 XS 代码应该更新以防范未来。
在 PERL_OP_PARENT
构建中,op_sibling
字段已重命名为 op_sibparent
,并添加了一个新的标志 op_moresib
。在兄弟链的最后一个操作中,op_moresib
为假,op_sibparent
指向父级(如果有),而不是 NULL
。
为了使现有代码在使用 PERL_OP_PARENT
或不使用 PERL_OP_PARENT
时透明地工作,添加了许多新的宏和函数,应该使用这些宏和函数,而不是直接操作 op_sibling
。
对于仅读取 op_sibling
来确定下一个兄弟的情况,添加了两个新的宏。像这样简单地扫描兄弟链
for (; kid->op_sibling; kid = kid->op_sibling) { ... }
现在应该写成
for (; OpHAS_SIBLING(kid); kid = OpSIBLING(kid)) { ... }
为了修改 optrees,添加了一个通用函数 op_sibling_splice()
,它允许操作一系列兄弟操作。类比 Perl 函数 splice()
,它允许你从兄弟链中剪切出零个或多个操作,并用零个或多个新操作替换它们。它透明地处理所有兄弟、父级、op_last 指针等的更新。
如果你需要在更低级别操作操作,那么三个新的宏,OpMORESIB_set
、OpLASTSIB_set
和 OpMAYBESIB_set
旨在成为一种低级可移植的方式来设置 op_sibling
/ op_sibparent
,同时更新 op_moresib
。第一个将兄弟指针设置为新的兄弟,第二个将操作设置为最后一个兄弟,第三个有条件地执行第一个或第二个操作。注意,与 op_sibling_splice()
不同,这些宏不会同时维护父级的一致性(例如,通过更新 op_first
和 op_last
,在适当的情况下)。
添加了 C 级别的 Perl_op_parent()
函数和 Perl 级别的 B::OP::parent()
方法。C 函数仅在 PERL_OP_PARENT
构建下存在(在普通 Perl 上使用它会导致构建时错误)。B::OP::parent()
始终存在,但在普通构建中它始终返回 NULL
。在 PERL_OP_PARENT
下,它们返回当前操作的父级(如果有)。变量 $B::OP::does_parent
允许你确定 B
是否支持检索操作的父级。
PERL_OP_PARENT
在 5.21.2 中引入,但在 5.21.11 中接口发生了很大变化。如果你在 5.21.11 更改之前更新了代码,则可能需要进一步修改。5.21.2 之后的主要更改是
OP_SIBLING
和 OP_HAS_SIBLING
宏已重命名为 OpSIBLING
和 OpHAS_SIBLING
,以与其他操作操作宏保持一致。
op_lastsib
字段已重命名为 op_moresib
,其含义已反转。
宏 OpSIBLING_set
已被移除,并被 OpMORESIB_set
等取代。
op_sibling_splice()
函数现在接受一个空 parent
参数,其中拼接不会影响兄弟链中的第一个或最后一个操作。
已创建宏以允许 XS 代码更好地操作 POSIX 本地化类别 LC_NUMERIC
。请参阅 "perlapi 中的本地化相关函数和宏"。
以前的 atoi
等替换函数 grok_atou
现在已被 grok_atoUV
取代。有关详细信息,请参阅 perlclib。
添加了一个新函数 `Perl_sv_get_backrefs()`,它允许您检索指向 SV 的弱引用(如果有)。
已删除 `screaminstr()` 函数。虽然它被标记为公共 API,但它没有文档,并且在 CPAN 模块中没有使用。从 5.17.0 开始,调用它会导致致命错误。
已将 `newDEFSVOP()`、`block_start()`、`block_end()` 和 `intro_my()` 函数添加到 API 中。
已将 `op.c` 中的内部 `convert` 函数重命名为 `op_convert_list` 并将其添加到 API 中。
`sv_magic()` 函数不再禁止在只读值上使用 "ext" 魔法。毕竟,perl 无法知道自定义魔法是否会修改 SV。 [GH #14202].
现在禁止在 XSUB 上访问 "perlapi 中的 CvPADLIST"。
`CvPADLIST` 字段已被重新用于 XSUB 的不同内部目的。因此,您不能再依赖它为 NULL 来测试 CV 是否为 XSUB。请改用 `CvISXSUB()`。
当构建配置和平台允许时,类型为 `SVt_NV` 的 SV 现在有时是无体的:具体来说,当 `sizeof(NV) <= sizeof(IV)` 时。 "无体" 意味着 NV 值直接存储在 SV 的头部,而不需要分配单独的体。
`$DB::single`、`$DB::signal` 和 `$DB::trace` 变量现在具有设置和获取魔法,它们将值存储为 IV,并且这些 IV 在 `pp_dbstate()` 中测试其值时使用。这可以防止 perl 在将重载对象分配给这些变量中的任何一个时无限递归。 [GH #14013].
`Perl_tmps_grow()` 被标记为公共 API 但没有文档,已从公共 API 中删除。此更改不会影响使用 `EXTEND_MORTAL` 宏预扩展 mortal 栈的 XS 代码。
Perl 的内部不再设置或使用 `SVs_PADMY` 标志。 `SvPADMY()` 现在对任何未标记为 `PADTMP` 的内容返回真值,并且 `SVs_PADMY` 现在定义为 0。
已删除宏 `SETsv` 和 `SETsvUN`。它们在五年前的提交 6f1401dc2a 之后不再在核心代码中使用,并且在 CPAN 上也没有发现它们。
SvFAKE
位(在 HV 上未使用)由 David Mitchell 非正式地保留,用于将来在 vtable 上的工作。
sv_catpvn_flags()
函数接受 SV_CATBYTES
和 SV_CATUTF8
标志,分别指定附加的字符串是字节还是 UTF-8。(这些标志实际上从 5.16.0 开始就存在,但以前不被视为 API 的一部分。)
引入了一个新的操作码类 METHOP
。它保存运行时用于提高类/对象方法调用性能的信息。
OP_METHOD
和 OP_METHOD_NAMED
已从 UNOP/SVOP
更改为 METHOP
。
cv_name()
是一个新的 API 函数,可以传递 CV 或 GV。它返回一个包含子程序名称的 SV,用于诊断。
cv_set_call_checker_flags()
是一个新的 API 函数,其工作方式类似于 cv_set_call_checker()
,不同之处在于它允许调用者指定调用检查器是否需要完整的 GV 来报告子程序的名称,或者是否可以传递 CV 代替。传递的任何值都将被 cv_name()
接受。cv_set_call_checker()
保证会有一个 GV,但它可能需要动态创建,这效率低下。 [GH #12767]
CvGV
(不是 API 的一部分)现在是一个更复杂的宏,它可能会调用函数并具体化 GV。对于那些将其用作布尔值的情况,已添加 CvHASGV
,它将对名义上具有 GV 的 CV 返回 true,但不会具体化 GV。CvGV
现在也为词法子程序返回 GV。 [GH #13392]
已将 "perlapi 中的 sync_locale" 函数添加到公共 API。XS 代码应避免更改程序的区域设置。然而,从 XS 调用的某些非 Perl 库需要这样做,例如 Gtk
。发生这种情况时,Perl 需要被告知区域设置已更改。使用此函数执行此操作,然后再返回到 Perl。
OP 的 op_private
字段中标志的定义和标签现在是从 regen/op_private 中的数据自动生成的。这带来的明显影响是,Concise
的一些标志输出可能略有不同,而 perl -Dx
的标志输出可能会有很大不同(它们现在都使用相同的标签集)。此外,调试版本现在在 op_free()
中有一个新的断言,以确保操作在 op_private
中没有设置任何无法识别的标志。
已删除弃用的变量 PL_sv_objcount
。
Perl 现在尝试将区域设置类别 LC_NUMERIC
保持为 "C",除了需要将其设置为程序底层区域设置的操作之外。这保护了许多无法处理小数基数字符不是点的 XS 模块。在此版本之前,Perl 将此类别初始化为 "C",但调用 POSIX::setlocale()
会更改它。现在,此类调用将更改程序的 LC_NUMERIC
类别的底层区域设置,但公开给 XS 代码的区域设置将保持为 "C"。有一些新的宏用于操作 LC_NUMERIC 区域设置,包括 STORE_LC_NUMERIC_SET_TO_NEEDED
和 STORE_LC_NUMERIC_FORCE_TO_UNDERLYING
。请参阅 "perlapi 中的区域设置相关函数和宏"。
已编写了一个新的宏 isUTF8_CHAR
,它可以有效地确定其参数给出的字符串是否以一个格式良好的 UTF-8 编码字符开头。
以下私有 API 函数已删除其上下文参数:Perl_cast_ulong
、Perl_cast_i32
、Perl_cast_iv
、Perl_cast_uv
、Perl_cv_const_sv
、Perl_mg_find
、Perl_mg_findext
、Perl_mg_magical
、Perl_mini_mktime
、Perl_my_dirfd
、Perl_sv_backoff
、Perl_utf8_hop
。
请注意,作为公共 API 一部分的那些函数的无前缀版本,例如 cast_i32()
,不受影响。
PADNAME
和 PADNAMELIST
类型现在是独立的类型,不再仅仅是 SV 和 AV 的别名。 [GH #14250]。
填充名称现在始终为 UTF-8。PadnameUTF8
宏始终返回 true。以前,这实际上已经是这种情况了,但现在已删除对填充名称的两种不同内部表示的支持。
添加了一个新的操作类 UNOP_AUX
。这是 UNOP
的一个子类,添加了一个 op_aux
字段,该字段指向一个包含 UV、SV* 等联合的数组。它用于操作需要存储比简单的 op_sv
或其他内容更多的数据的地方。目前,此类型的唯一操作是 OP_MULTIDEREF
(见下一项)。
添加了一个新的操作 OP_MULTIDEREF
,它执行一个或多个嵌套的数组和哈希查找,其中键是常量或简单变量。例如,表达式 $a[0]{$k}[$i]
以前涉及十个 rv2Xv
、Xelem
、gvsv
和 const
操作,现在由单个 multideref
操作执行。它还可以处理 local
、exists
和 delete
。非简单的索引表达式,例如 [$i+1]
,仍然使用 aelem
/helem
完成,而具有小常量索引的单级数组查找仍然使用 aelemfast
完成。
close
现在会设置 $!
当发生 I/O 错误时,错误信息会被记录在句柄中。close
会对这样的句柄返回 false。之前,close
不会修改 $!
的值,因此常见的写法 close $fh or die $!
无法可靠地工作。现在句柄也会记录 $!
的值,并且 close
会将其恢复。
no re
现在可以关闭 use re
启用的所有功能
之前,运行 no re
只能关闭少数功能。现在它可以关闭所有启用的功能。例如,以前唯一停止调试的方法是在启用调试后退出包含块;现在这个问题已修复。
pack("D", $x)
和 pack("F", $x)
现在会在 x86 长双精度构建中将填充置零。在 GCC 4.8 及更高版本的一些构建选项下,它们以前会覆盖零初始化的填充,或者完全绕过已初始化的缓冲区。这会导致 op/pack.t 测试失败。 [GH #14554]
扩展从父线程克隆的数组可能会导致在尝试修改新元素时出现“试图修改只读值”错误。 [GH #14605]
已修复 *x=<y>
导致的断言失败和后续崩溃。 [GH #14493]
已修复与编译词法子例程相关的可能导致崩溃/循环的错误。 [GH #14596]
UTF-8 现在在函数名、未引用的 HERE 文档终止符以及用作数组索引的变量名中都能正常工作。 [GH #14601]
在标量上下文中对大型被污染字符串进行重复的全局模式匹配,其速度会随着字符串中当前匹配位置的变化而呈指数级下降。 [GH #14238]
已修复由于解析器对语法错误感到困惑而导致的各种崩溃。 [GH #14496] [GH #14497] [GH #14548] [GH #14564]
已修复词法 $_
范围内的 split
不再导致断言失败。 [GH #14483]
my $x : attr
语法在各种列表运算符中不再导致断言失败。 [GH #14500]
引号中的 @
符号后跟非 ASCII 数字(不是有效的标识符)会导致解析器崩溃,而不是简单地将 @
视为字面量。这个问题已修复。 [GH #14553]
*bar::=*foo::=*glob_with_hash
从 Perl 5.14 开始一直崩溃,现在已修复。 [GH #14512]
标量上下文中的 foreach
以前没有将项目推送到堆栈中,导致错误。(print 4, scalar do { foreach(@x){} } + 1
会打印 5。)现在已修复,它会返回 undef
。 [GH #14569]
已修复核心 C 代码中用于存储环境变量内容的多个数据在使用前可能被覆盖的问题。 [GH #14476]
从 v5.8 开始,一些以 /.*..../
开头的模式与长字符串匹配速度很慢,而一些以 /.*..../i
开头的模式从 v5.18 开始速度很慢。现在它们都很快了。 [GH #14475].
当 $/
设置为无效值时,现在会保留其原始可见值。以前,如果您将 $/
设置为对数组的引用,例如,perl 会产生运行时错误并且不会设置 PL_rs
,但检查 $/
的 Perl 代码会看到数组引用。 [GH #14245].
在正则表达式模式中,POSIX 类,如 [:ascii:]
,必须位于方括号字符类中,如 qr/[[:ascii:]]/
。当类似 POSIX 类的内容不在方括号类中时,会发出警告。当 POSIX 类被否定时,该警告不会生成:[:^ascii:]
。现在已修复。
Perl 5.14.0 引入了一个错误,导致 eval { LABEL: }
崩溃。此问题已修复。 [GH #14438].
已修复由于解析器对语法错误感到困惑而导致的各种崩溃。 [GH #14421]. [GH #14472]. [GH #14480]. [GH #14447].
类似 /$a[/
的代码以前会读取下一行输入,并将其视为紧接在左括号之后。因此,一些无效代码会解析并运行,但一些代码会导致崩溃,因此现在不允许这样做。 [GH #14462].
修复 pack
的参数下溢。 [GH #14525].
修复对非严格 \x{}
的处理。现在 \x{}
等效于 \x{0}
,而不是出错。
stat -t
现在不再被视为可堆叠,就像 -t stat
一样。 [GH #14499].
以下不再导致 SEGV:qr{x+(y(?0))*}
。
修复了解析正则表达式模式中的反向引用时的无限循环。
修复了 Infinity 和 NaN 行为中的几个小错误,包括在将 Infinity 类或 NaN 类字符串转换为字符串时发出警告。例如,“NaNcy”不再转换为 NaN。
已修复正则表达式模式中的一个错误,该错误可能导致段错误和其他崩溃。这仅发生在使用 /i
编译的模式中,同时考虑当前的 POSIX 本地化(这通常意味着它们必须在 use locale
的范围内编译),并且必须有一个至少 128 个连续字节的字符串才能匹配。 [GH #14389].
s///g
现在可以在非常长的字符串上工作(其中有超过 20 亿次迭代),而不是用“Substitution loop”死亡。 [GH #11742]. [GH #14190].
gmtime
现在不再因非数字值而崩溃。 [GH #14365].
\()
(引用空列表)和在词法作用域中包含词法$_
的y///
,都可能导致栈溢出写入。这两个问题都已修复,现在会先扩展栈。
prototype()
在没有参数的情况下,以前会读取栈上的前一个项目,因此print "foo", prototype()
会打印foo的原型。现在已修复为推断$_
。 [GH #14376].
在预声明子程序中声明的词法状态子程序的一些情况可能会导致崩溃,例如在评估包含外部变量名称的字符串时,但现在不会了。
在匿名子程序中嵌套的词法状态子程序的一些情况可能会导致“奇怪的复制”错误,甚至可能导致崩溃。
在尝试发出警告时,perl 的默认调试器(perl5db.pl)有时会给出“未定义子程序 &DB::db_warn 被调用”的错误。这个错误从 Perl 5.18 开始出现,现在已修复。 [GH #14400].
替换中的某些语法错误,例如s/${<>{})//
,会导致崩溃,并且从 Perl 5.10 开始就一直存在。(在某些情况下,崩溃直到 5.16 才开始发生。)当然,崩溃已修复。 [GH #14391].
修复了几个字符串增长大小计算溢出问题;特别是,像33 x ~3
这样的重复表达式可能会导致大型缓冲区溢出,因为SvGROW()
没有正确处理新的输出缓冲区大小。现在,这样的表达式会正确地产生内存环绕恐慌。 [GH #14401].
formline("@...", "a");
会导致崩溃。pp_formline()
中的FF_CHECKNL
情况没有设置用于标记切片位置的指针,这导致FF_MORE
情况因段错误而崩溃。现在已修复。 [GH #14388].
在解析正则表达式编译期间的字面模式时,可能发生的缓冲区溢出和崩溃已修复。 [GH #14416].
fchmod()
和futimes()
现在在由于传递了关闭的文件句柄而失败时会设置$!
。 [GH #14073].
op_free()
和 scalarvoid()
在释放深度递归的 op 树时不再因堆栈溢出而崩溃。 [GH #11866].
在 Perl 5.20.0 中,如果从正则表达式内的代码块访问 $^N
,则会意外地将其内部 UTF-8 标志关闭,从而有效地将该值进行 UTF-8 编码。此问题已修复。 [GH #14211].
失败的 semctl
调用不再覆盖堆栈上的现有项,这意味着 (semctl(-1,0,0,0))[0]
不再发出“未初始化”警告。
else{foo()}
在 foo
之前没有空格的情况下,现在可以更好地将正确的行号分配给该语句。 [GH #14070].
有时,@array = split
中的赋值会被优化,以便 split
本身直接写入数组。这会导致一个错误,阻止此赋值在左值上下文中使用。因此 (@a=split//,"foo")=bar()
会出错。(这个错误可能可以追溯到 Perl 3,当时添加了优化。)现在已修复。 [GH #14183].
当参数列表未通过子例程签名指定的检查(这仍然是一个实验性功能)时,生成的错误消息现在会给出调用者的文件和行号,而不是被调用子例程的文件和行号。 [GH #13643].
翻转操作符(在标量上下文中为 ..
和 ...
)以前为每个递归级别(封闭子例程递归调用的次数)维护一个单独的状态,这与文档不符。现在每个闭包对每个翻转操作符都有一个内部状态。 [GH #14110].
翻转操作符(在标量上下文中为 ..
)会每次返回相同的标量,除非包含的子例程被递归调用。现在它总是返回一个新的标量。 [GH #14110].
use
、no
、语句标签、特殊块(BEGIN
)和 pod 现在允许作为 map
或 grep
块中的第一个元素,print
或 say
(或其他函数)返回句柄后的块,以及在 ${...}
、@{...}
等中。 [GH #14088].
重复操作符 x
现在在像 foreach
这样的上下文中使用时,会将左值上下文传播到其左侧参数。这允许 for(($#that_array)x2) { ... }
在循环修改 $_
时按预期工作。
在标量上下文中,(...) x ...
如果一个操作数是具有“x”重载的对象,则会破坏堆栈,导致行为异常。 [GH #13811].
对词法标量的赋值通常会被优化掉;例如在 my $x; $x = $y + $z
中,赋值操作符会被优化掉,加法操作符会直接将结果写入 $x
。与这种优化相关的各种错误已修复。右侧的某些操作符有时会完全无法赋值或赋值错误的值,或者会在绑定变量上调用 STORE 两次或根本不调用。受影响的操作符是 $foo++
、$foo--
和 -$foo
在 use integer
、chomp
、chr
和 setpgrp
下。
如果由于使用 tied
、values
或 each
,同一个标量最终出现在赋值的两侧,则列表赋值有时会有错误。结果将是错误的值被赋值。
setpgrp($nonzero)
(带一个参数)在 5.16 中被意外地更改为 setpgrp(0)
。此问题已修复。
__SUB__
在调试器(-d
开关)下以及包含 eval $string
的子例程中可能会返回错误的值,甚至会损坏内存。
当 sub () { $var }
变得可内联时,它现在每次都会返回不同的标量,就像非内联子例程一样,尽管 Perl 仍然在不会产生可观察差异的情况下优化了复制。
my sub f () { $var }
和 sub () : attr { $var }
不再符合内联条件。前者会导致崩溃;后者只会丢弃属性。对鲜为人知的 :method
属性做出了例外,它几乎没有作用。
具有空原型子例程的内联现在比以前更加一致。以前,如果一个子例程包含多个语句,其中除了最后一个语句之外的所有语句都被优化掉了,那么只有当它是一个包含字符串 eval
或 state
声明或闭包在外部词法变量上的匿名子例程(或调试器下的任何匿名子例程)时,它才可内联。现在,任何在语句被优化掉后折叠为单个常量的子例程都符合内联条件。这适用于诸如 sub () { jabber() if DEBUG; 42 }
之类的情况。
一些具有显式 return
的子例程被内联,这与文档不符。现在 return
始终阻止内联。
在某些系统(如 VMS)上,crypt
可能返回非 ASCII 字符串。如果分配给的标量之前包含 UTF-8 字符串,那么 crypt
不会关闭 UTF-8 标志,从而破坏返回值。这将发生在 $lexical = crypt ...
中。
crypt
不再对绑定的第一个参数调用 FETCH
两次。
在类似引号操作符(qq[${ <<END }]
,/(?{ <<END })/
)的最后一行中,未终止的 here-doc 不会再导致双重释放。从 5.18 版本开始出现此问题。
index()
和 rindex()
在用于大小超过 2GB 的字符串时不再崩溃。 [GH #13700].
修复了 Win32 构建中 PERL_SYS_INIT
/PERL_SYS_INIT3
中一个小的、以前有意存在的内存泄漏问题。这可能会影响在同一进程中反复创建和销毁 Perl 引擎的嵌入器。
POSIX::localeconv()
现在即使在 use locale
范围之外调用时,也会返回程序底层区域设置的数据。
POSIX::localeconv()
现在在没有 LC_NUMERIC
和/或 LC_MONETARY
的平台上,或者 Perl 被编译为忽略这两个区域设置类别之一或两者时,都能正常工作。在这种情况下,localeconv()
返回的哈希中现在没有对应值的条目。
POSIX::localeconv()
现在会适当地标记其返回的值为 UTF-8 或非 UTF-8。以前它们总是以字节形式返回,即使它们应该被编码为 UTF-8。
在 Microsoft Windows 上,在 use locale
的范围内,以下 POSIX 字符类对许多区域设置给出了不符合 POSIX 标准的结果:[[:alnum:]]
、[[:alpha:]]
、[[:blank:]]
、[[:digit:]]
、[[:graph:]]
、[[:lower:]]
、[[:print:]]
、[[:punct:]]
、[[:upper:]]
、[[:word:]]
和 [[:xdigit:]]
。这是因为底层的 Microsoft 实现不遵循标准。Perl 现在采取了特殊的预防措施来纠正这一点。
Coverity 检测到并修复了许多问题。
system()
及其相关函数现在应该在更多 Android 构建中正常工作。
由于疏忽,通过 -Dtargetsh
指定给 Configure 的值最终会被构建过程中的某些部分忽略。这导致为 Android 交叉编译的 Perl 最终会得到有缺陷版本的 system()
、exec()
和反引号:这些命令最终会寻找 /bin/sh
而不是 /system/bin/sh
,因此在绝大多数设备上都会失败,并将 $!
设置为 ENOENT
。
qr(...\(...\)...)
、qr[...\[...\]...]
和 qr{...\{...\}...}
现在可以正常工作。以前,在正则表达式模式中,如果这些三个左字符不是元字符,并且模式开始分隔符是该字符,而结束分隔符是其镜像字符,则无法用反斜杠对其进行转义。
在受污染的 UTF-8 字符串上使用 s///e
会破坏 pos()
。此错误是在 5.20 版本中引入的,现在已修复。 [GH #13948].
正则表达式中的非词边界(\B
)并不总是匹配字符串的结尾;特别是 q{} =~ /\B/
不会匹配。此错误是在 Perl 5.14 版本中引入的,现在已修复。 [GH #13917].
" P" =~ /(?=.*P)P/
应该匹配,但没有匹配。现在已修复。 [GH #13954].
在 `eval` 中无法编译 `use Foo` 可能会留下一个虚假的 `BEGIN` 子例程定义,这会导致在下次使用 `use` 或其他 `BEGIN` 块时产生“Subroutine BEGIN redefined”警告。 [GH #13926].
method { BLOCK } ARGS
语法现在可以正确解析参数,即使它们以左大括号开头。 [GH #9085].
外部库和 Perl 可能对区域设置有不同的理解。当解析版本字符串时,如果区域设置的数字分隔符已更改,这将是一个问题。版本解析已修补以确保它正确处理区域设置。 [GH #13863].
已修复一个错误,该错误会导致零长度断言和正则表达式内的代码块导致 `pos` 看到不正确的值。 [GH #14016].
常量的解引用现在对类型全局常量也能正常工作。以前,全局变量会被字符串化,并查找其名称。现在,将使用全局变量本身。 [GH #9891]
在解析符号 ($
@
%
&
) 后面跟着大括号时,解析器不再尝试猜测它是代码块还是哈希构造器(当它猜测后者时会导致语法错误),因为它只能是代码块。
undef $reference
现在会立即释放被引用者,而不是等到下一个语句才释放。 [GH #14032]
在各种使用子例程名称的情况下(自动加载、重载、错误消息),以前在词法子例程中会崩溃,但现在已修复。
裸字查找现在尝试避免激活包,如果事实证明裸字不是子例程名称。
匿名常量的编译(例如,sub () { 3 }
)不再删除当前包中名为 `__ANON__` 的任何子例程。不仅 `*__ANON__{CODE}` 被清除,而且还存在内存泄漏。此错误可以追溯到 Perl 5.8.0。
类似 `sub f;` 和 `sub f ();` 的存根声明不再清除由 `use constant` 声明的同名常量。此错误是在 Perl 5.10.0 中引入的。
qr/[\N{named sequence}]/
现在在许多情况下都能正常工作。
一些为 \N{...}
所知的名称指的是多个字符的序列,而不是通常的单个字符。方括号字符类通常只匹配单个字符,但现在添加了特殊处理,以便它们可以匹配命名序列,但如果该类被反转或序列被指定为范围的开头或结尾,则不匹配。在这些情况下,与之前相比,唯一行为变化是当此类是 ?[...])
结构的一部分时,给出的致命错误消息略有改动。当 [...]
独立存在时,会发出与之前相同的非致命警告,并且只使用序列中的第一个字符,这与之前一样。
在编译时计算的污染常量不再导致无关语句被污染。 [GH #14059]
open $$fh, ...
,它使用类似 "main::_GEN_0"
的名称来激活句柄,没有给句柄正确的引用计数,因此可能会发生双重释放。
在确定一个裸字是方法名时,如果存在同名的 our
子例程,解析器会感到困惑,并在 our
子例程的包中查找方法,而不是在调用者的包中查找。
解析器不再被双引号字符串中的 \U=
搞糊涂。它过去会产生语法错误,但现在可以正确编译。 [GH #10882]
-B
和 -T
文件测试运算符始终旨在将 UTF-8 编码文件视为文本。(perlfunc 已更新为说明这一点。)以前,一些实际上不是有效 UTF-8 的文件可能会被认为是 UTF-8。现在已修复。这些运算符现在也适用于 EBCDIC 平台。
在某些情况下,在正则表达式模式编译期间引发的警告消息会输出多次。现在已修复。
Perl 5.20.0 引入了一个回归,其中包含单个 ASCII 小写字母的 UTF-8 编码正则表达式模式不匹配其大写对应项。这已在 5.20.1 和 5.22.0 中修复。 [GH #14051]
如果词法警告(use warnings
或 no warnings
)未生效,并且 $^W
在编译时为假,在运行时为真,则常量折叠可能会错误地抑制警告。
在调试版本中,如果之前的匹配使用了相同的正则表达式,则在正则表达式匹配期间加载 Unicode 表格可能会导致断言失败。 [GH #14081]
线程克隆在词法子例程中工作不正常,可能会导致崩溃或在退出时双重释放。
从 Perl 5.14.0 开始,删除 $SomePackage::{__ANON__}
然后取消定义匿名子例程可能会导致内部损坏,导致 Devel::Peek 崩溃或 B.pm 提供无意义的数据。此问题已修复。
(caller $n)[3]
现在报告词法子例程的名称,而不是将其视为 "(unknown)"
。
sort subname LIST
现在支持使用词法子例程作为比较例程。
别名(例如,通过 *x = *y
)可能会混淆列表赋值,这些赋值在两侧都提到了同一个变量的两个名称,导致分配错误的值。 [GH #5788]
长的 here-doc 终止符可能会导致在短行输入上出现错误读取。此问题已修复。不太可能发生任何崩溃。此错误可以追溯到 25 年前 Perl 3.000 中引入 here-doc 的时候。
split
中的优化将 split /^/
视为 split /^/m
,不幸的是,它也导致将 split /\A/
视为 split /^/m
,而它不应该这样做。此问题已修复。(但是,请注意,split /^x/
的行为与 split /^x/m
不同,这也认为是一个错误,将在未来的版本中修复。) [GH #14086]
鲜为人知的 my Class $var
语法(参见 fields 和 attributes)在 use utf8
的作用域内可能会混淆,如果 Class
是一个常量,其值包含 Latin-1 字符。
通过 Hash::Util 或 Internals::SvREADONLY
锁定和解锁值不再对最初只读的值有任何影响。以前,解锁此类值可能会导致崩溃、挂起或其他不稳定的行为。
正则表达式中一些未终止的 (?(...)...)
结构会导致崩溃或给出错误的错误消息。/(?(1)/
就是一个例子。
pack "w", $tied
不再调用 FETCH 两次。
列表赋值,例如 ($x, $z) = (1, $y)
,现在如果 $x
和 $y
被 foreach
别名化,则可以正常工作。
一些包含带有语法错误的代码块的模式,例如 / (?{(^{})/
,会在调试版本中挂起或断言失败。现在它们会产生错误。
在启用调试的情况下解析 sort
时发生的断言失败已修复。 [GH #14087].
*a = *b; @a = split //, $b[1]
可能进行错误读取并产生垃圾结果。
在 () = @array = split
中,开头的 () =
不再使优化器误以为限制为 1。
致命警告不再阻止语法错误的输出。 [GH #14155].
修复了 VMS 上的 NaN 双精度到长双精度转换错误。对于静默 NaN(仅在 Itanium 上,而不是 Alpha 上),会产生负无穷大而不是 NaN。
修复了导致 make distclean
错误地遗留一些文件的问题。 [GH #14108].
AIX 现在在 getsockopt
中正确设置长度。 [GH #13484]. [cpan #91183]. [cpan #85570].
正则表达式编译的优化阶段在某些情况下可能会“永远”运行并耗尽所有内存;现在已修复。 [GH #13984].
测试脚本 t/op/crypt.t 现在在默认算法被禁用时使用 SHA-256 算法,而不是给出失败。 [GH #13715].
修复了设置共享数组大小时的越界错误。 [GH #14151].
修复了可能导致 perl 在编译期间进入无限循环的错误。特别是,子列表中的 while(1)
,例如
sub foo { () = ($a, my $b, ($c, do { while(1) {} })) }
该错误是在 5.20.0 中引入的 [GH #14165].
在 Win32 上,如果一个变量在后来 fork 的伪进程中被 local
化,那么在子伪进程中恢复原始值会导致子伪进程中的内存损坏和崩溃(因此也导致 OS 进程崩溃)。 [GH #8641].
如果参数不足或用于填充字段的变量为空,则在格式上调用 write
且带有 ^**
字段可能会在 sv_chop()
中产生恐慌。 [GH #14255].
非 ASCII 词汇子名称现在在错误消息中出现时不会出现尾部垃圾。
\@
子例程原型不再扁平化带括号的数组(对每个元素取引用),而是对数组本身取引用。 [GH #9111].
包含除 C 样式 for
循环之外的任何内容的块可能会破坏堆栈,导致块外部的列表丢失元素或元素被覆盖。 这可能会发生在 map { for(...){...} } ...
和包含 do { for(...){...} }
的列表中。 [GH #14269].
scalar()
现在传播左值上下文,因此 for(scalar($#foo)) { ... }
可以通过 $_
修改 $#foo
。
qr/@array(?{block})/
不再因“ARRAY 的奇怪副本”而死亡。 [GH #14292].
eval '$variable'
在嵌套的命名子例程中,有时会查找全局变量,即使在范围内存在词法变量。
在 perl 5.20.0 中,sort CORE::fake
(其中 'fake' 是除关键字以外的任何内容)开始截断最后 6 个字符并将结果视为排序子名称。 CORE::fake
作为排序子名称的先前行为已恢复。 [GH #14323].
在 use utf8
之外,不允许使用单字符 Latin-1 词法变量。 它的错误消息“无法使用全局 $foo
...” 给出了垃圾而不是变量名。
readline
在不存在的句柄上会导致 ${^LAST_FH}
生成对未定义标量的引用(或导致断言失败)。 现在 ${^LAST_FH}
最终变为未定义。
(...) x ...
在空上下文中的行为现在是对左侧参数应用标量上下文,而不是当前子例程被调用的上下文。 [GH #14174].
在使用 Visual C 6 编译的 perl 上,pack
-ing NaN 的行为不正常,导致 t/op/infnan.t 中的测试失败。 [GH #14705]
Perl 的目标是能够重新编译以在任何 Unicode 版本上都能正常工作。 然而,在 Perl 5.22 中,最早的版本是 Unicode 5.1(当前版本是 7.0)。
EBCDIC 平台
cmp
(以及 sort
)运算符在两个操作数都是 UTF-EBCDIC 编码字符串且包含 ASCII 和/或控制字符以及其他字符的混合情况下,不一定能给出正确的结果。
在 tr///
(以及 y///
)转写运算符中包含 \N{...}
的范围与正则表达式模式中的等效范围的处理方式不同。它们应该将范围内的值都视为 Unicode 代码点,而不是本地代码点,但实际上并没有这样做。("perlre 中的版本 8 正则表达式" 详细说明了它应该如何工作。)
编码和编码大多是错误的。
许多与核心一起发布的 CPAN 模块显示测试失败。
使用 "U0"
格式的 pack
/unpack
可能无法正常工作。
以下模块已知在该版本的 Perl 中存在测试失败。在许多情况下,补丁已提交,因此希望很快就会有新版本发布。
B::Generate 版本 1.50
B::Utils 版本 0.25
Coro 版本 6.42
Dancer 版本 1.3130
Data::Alias 版本 1.18
Data::Dump::Streamer 版本 2.38
Data::Util 版本 0.63
Devel::Spy 版本 0.07
invoker 版本 0.34
Lexical::Var 版本 0.009
LWP::ConsoleLogger 版本 0.000018
Mason 版本 2.22
NgxQueue 版本 0.02
Padre 版本 1.00
Parse::Keyword 0.08
Brian McCauley 于 2015 年 5 月 8 日去世。他经常在 Usenet、Perl Monks 和其他 Perl 论坛发帖,并在 NOBULL 的昵称下为 Perl FAQ 做出了许多 CPAN 贡献。他几乎参加了每次 YAPC::Europe,事实上,他还帮助组织了 YAPC::Europe 2006 和 QA Hackathon 2009。他对复杂系统的兴趣和乐趣在他的对棋盘游戏的热爱中尤为明显;许多 Perl 爱好者都会怀念与 Brian 一起玩 Fluxx 和其他游戏的时光。我们会怀念他。
Perl 5.22.0 代表了自 Perl 5.20.0 发布以来的大约 12 个月的开发,包含了来自 94 位作者的 2,400 个文件中的大约 590,000 行更改。
不包括自动生成的 文件、文档和发布工具,大约有 370,000 行更改涉及 1,500 个 .pm、.t、.c 和 .h 文件。
Perl 进入其第三个十年,得益于充满活力的用户和开发人员社区,它继续蓬勃发展。以下人员已知为 Perl 5.22.0 的改进做出了贡献。
Aaron Crane,Abhijit Menon-Sen,Abigail,Alberto Simões,Alex Solovey,Alex Vandiver,Alexandr Ciornii,Alexandre (Midnite) Jousset,Andreas König,Andreas Voegele,Andrew Fresh,Andy Dougherty,Anthony Heading,Aristotle Pagaltzis,brian d foy,Brian Fraser,Chad Granum,Chris 'BinGOs' Williams,Craig A. Berry,Dagfinn Ilmari Mannsåker,Daniel Dragan,Darin McBride,Dave Rolsky,David Golden,David Mitchell,David Wheeler,Dmitri Tikhonov,Doug Bell,E. Choroba,Ed J,Eric Herman,Father Chrysostomos,George Greer,Glenn D. Golden,Graham Knop,H.Merijn Brand,Herbert Breunung,Hugo van der Sanden,James E Keenan,James McCoy,James Raspass,Jan Dubois,Jarkko Hietaniemi,Jasmine Ngan,Jerry D. Hedden,Jim Cromie,John Goodyear,kafka,Karen Etheridge,Karl Williamson,Kent Fredric,kmx,Lajos Veres,Leon Timmermans,Lukas Mai,Mathieu Arnold,Matthew Horsfall,Max Maischein,Michael Bunk,Nicholas Clark,Niels Thykier,Niko Tyni,Norman Koch,Olivier Mengué,Peter John Acklam,Peter Martini,Petr Písař,Philippe Bruhat (BooK),Pierre Bogossian,Rafael Garcia-Suarez,Randy Stauner,Reini Urban,Ricardo Signes,Rob Hoelz,Rostislav Skudnov,Sawyer X,Shirakata Kentaro,Shlomi Fish,Sisyphus,Slaven Rezic,Smylers,Steffen Müller,Steve Hay,Sullivan Beck,syber,Tadeusz Sośnierz,Thomas Sibley,Todd Rinaldo,Tony Cook,Vincent Pit,Vladimir Marek,Yaroslav Kuzmin,Yves Orton,Ævar Arnfjörð Bjarmason。
以上列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的贡献者(非常感谢)的姓名。
此版本中包含的许多更改源于 Perl 内核中包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可能需要检查最近发布到 comp.lang.perl.misc 新闻组和 Perl 错误数据库的文章,网址为 https://rt.perl.org/。您也可以在 Perl 主页 https://www.perl5.cn/ 上找到信息。
如果您认为您遇到了未报告的错误,请运行随您的版本一起提供的 perlbug 程序。请务必将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
如果您要报告的错误存在安全隐患,不适合发送到公开存档的邮件列表,请将其发送到 [email protected]。这指向一个封闭的订阅未存档邮件列表,其中包括所有核心提交者,他们将能够帮助评估问题的影響,找出解决方案,并帮助协调跨所有支持 Perl 的平台发布补丁以减轻或解决问题。请仅将此地址用于 Perl 内核中的安全问题,不要用于独立分发在 CPAN 上的模块。
Changes 文件,了解如何查看有关更改内容的详尽详细信息。
有关如何构建 Perl 的 INSTALL 文件。
有关一般事项的 README 文件。
有关版权信息的 Artistic 和 Copying 文件。