perl5180delta - perl v5.18.0 的新增功能
本文档描述了 v5.16.0 版本和 v5.18.0 版本之间的差异。
如果您从较早的版本(例如 v5.14.0)升级,请先阅读 perl5160delta,其中描述了 v5.14.0 和 v5.16.0 之间的差异。
新添加的实验性功能现在需要此咒语
no warnings "experimental::feature_name";
use feature "feature_name"; # would warn without the prev line
有一个新的警告类别,称为“experimental”,其中包含 feature pragma 在启用实验性功能时发出的警告。
新添加的实验性功能也将被赋予特殊的警告 ID,这些 ID 由“experimental::”后跟功能名称组成。(计划最终将此机制扩展到所有警告,以允许它们被单独启用或禁用,而不仅仅是按类别。)
通过说
no warnings "experimental::feature_name";
您将对未来对该功能的更改或删除可能导致的任何损坏负责。
由于某些功能(如 ~~
或 my $_
)现在发出实验性警告,并且您可能希望在也运行在不识别这些警告类别的 perl 上的代码中禁用它们,请考虑使用 if
pragma,如下所示
no if $] >= 5.018, warnings => "experimental::feature_name";
现有的实验性功能也可能开始发出这些警告。请参阅 perlexperiment 以了解哪些功能被认为是实验性的。
perl v5.18.0 中对哈希实现的更改将是现有代码行为最明显的更改之一。
默认情况下,具有相同键和值的两个不同的哈希变量现在可能以不同的顺序提供其内容,而以前是相同的。
在遇到这些更改时,清理它们的秘诀是接受 **哈希是无序集合** 并相应地采取行动。
Perl 的哈希函数使用的种子现在是随机的。这意味着从 keys()
、values()
和 each()
等函数返回的键/值顺序将在每次运行时有所不同。
引入此更改是为了使 Perl 的哈希对算法复杂性攻击更加健壮,并且还因为我们发现它暴露了哈希排序依赖性错误,并使它们更容易追踪。
工具链维护者可能希望投资额外的基础设施来测试此类问题。多次连续运行测试,然后比较结果将使发现代码中的哈希顺序依赖性变得更容易。强烈建议作者不要将 Perl 哈希的键顺序暴露给不安全的受众。
此外,每个哈希都有自己的迭代顺序,这应该会使确定当前哈希种子变得更加困难。
Perl v5.18 包含对多个哈希函数的支持,并更改了默认值(为 ONE_AT_A_TIME_HARD),您可以在编译时定义一个符号来选择不同的算法。有关当前列表,请参阅INSTALL 文档。请注意,从 Perl v5.18 开始,我们只能推荐使用默认值或 SIPHASH。所有其他算法都已知存在安全问题,仅供研究使用。
PERL_HASH_SEED
不再接受整数作为参数;相反,该值应为以十六进制字符串编码的二进制值,例如“0xf5867c55039dc724”。这是为了使基础设施支持任意长度的哈希种子,这可能超过整数的长度。(SipHash 使用 16 字节种子。)
PERL_PERTURB_KEYS
环境变量允许您控制应用于 keys
及其朋友的随机化级别。
当 PERL_PERTURB_KEYS
为 0 时,perl 不会对键顺序进行任何随机化。由于插入而导致 keys
更改的可能性与以前的 perl 相同,基本上只有在桶大小发生更改时才会发生。
当 PERL_PERTURB_KEYS
为 1 时,perl 将以不可重复的方式对键进行随机化。由于插入而导致 keys
更改的可能性非常高。这是最安全且默认的模式。
当 PERL_PERTURB_KEYS
为 2 时,perl 将以可重复的方式对键进行随机化。相同程序的重复运行应每次产生相同的输出。
PERL_HASH_SEED
意味着非默认的 PERL_PERTURB_KEYS
设置。将 PERL_HASH_SEED
设置为 0(正好一个 0)意味着 PERL_PERTURB_KEYS=0
(哈希键随机化已禁用);将 PERL_HASH_SEED
设置为任何其他值意味着 PERL_PERTURB_KEYS=2
(确定性和可重复的哈希键随机化)。显式地将 PERL_PERTURB_KEYS
指定为不同的级别将覆盖此行为。
Hash::Util::hash_seed() 现在返回字符串而不是整数。这是为了让基础设施支持任意长度的哈希种子,这些种子可能超过整数的长度。(SipHash 使用 16 字节的种子。)
环境变量 PERL_HASH_SEED_DEBUG 现在使 perl 显示 perl 使用的哈希函数,以及该进程使用的种子(以十六进制表示)。解析此输出的代码(如果存在)必须更改以适应新的格式。新格式示例
$ PERL_HASH_SEED_DEBUG=1 ./perl -e1
HASH_FUNCTION = MURMUR3 HASH_SEED = 0x1476bb9f
Perl 现在支持 Unicode 6.2。Unicode 6.1 的更改列表位于 http://www.unicode.org/versions/Unicode6.2.0。
您可以为字符定义自己的名称,以便在 \N{...}
、charnames::vianame()
等中使用。这些名称现在可以包含来自整个 Unicode 范围的字符。这允许名称使用您的母语,而不仅仅是英语。某些限制适用于可使用的字符(例如,您不能定义包含标点的名称)。请参阅 "charnames 中的自定义别名"。
已添加以下新的 DTrace 探针
op-entry
loading-file
loaded-file
${^LAST_FH}
此新变量提供对最后读取的文件句柄的访问。这是 $.
以及 tell
和 eof
(无参数)使用的句柄。
这是一个实验性功能,允许匹配代码点集合的并集、交集等,类似于 Unicode::Regex::Set。它也可以用于将 /x
处理扩展到 [方括号] 字符类,并作为用户定义属性的替代,允许比它们更复杂的表达式。请参阅 "perlrecharclass 中的扩展方括号字符类"。
此新功能仍被视为实验性。要启用它
use 5.018;
no warnings "experimental::lexical_subs";
use feature "lexical_subs";
您现在可以使用 state sub foo
、my sub foo
和 our sub foo
声明子例程。(state sub
要求启用“state”功能,除非您将其写为 CORE::state sub foo
。)
state sub
创建一个在声明它的词法作用域内可见的子例程。该子例程在对外部子例程的调用之间共享。
my sub
声明一个词法子例程,该子例程在每次进入封闭块时都会被创建。state sub
通常比 my sub
稍微快一些。
our sub
声明一个指向同名包子例程的词法别名。
有关更多信息,请参阅 "perlsub 中的词法子例程"。
循环控制 next
、last
和 redo
,以及特殊的 dump
运算符,现在允许使用任意表达式在运行时计算标签。以前,任何不是常量的参数都被视为空字符串。
一些内置函数已作为子例程添加到 CORE:: 命名空间中 - 具体来说,那些不可覆盖的关键字,它们可以在没有自定义解析器的情况下实现:defined
、delete
、exists
、glob
、pos
、prototype
、scalar
、split
、study
和 undef
。
由于其中一些具有原型,prototype('CORE::...')
已更改为不再区分可覆盖和不可覆盖的关键字。这是为了使 prototype('CORE::pos')
与 prototype(&CORE::pos)
保持一致。
kill
kill
一直允许使用负信号编号,它会杀死进程组而不是单个进程。它也允许使用信号名称。但它没有一致的行为,因为负信号名称被视为 0。现在支持负信号名称,例如 -INT
,并且与 -2 的处理方式相同 [perl #112990]。
在 哈希大修 中进行的一些更改是为了增强安全性。请阅读该部分。
Storable
文档中的安全警告Storable
的文档现在包含一个部分,警告读者接受来自不可信来源的 Storable 文档的危险。简而言之,反序列化某些类型的数据会导致加载模块和其他代码执行。这是有记录的行为,也是想要的行为,但这为恶意实体打开了攻击途径。
Locale::Maketext
允许通过恶意模板进行代码注入如果用户可以向 Locale::Maketext 提供翻译字符串,则可以使用它来调用当前进程中可用的任意 Perl 子例程。
这个问题已经修复,但仍然可以调用 Locale::Maketext
本身或您正在使用的子类提供的任何方法。这些方法中的一个将依次调用 Perl 内核的 sprintf
子例程。
总之,允许用户在未审核的情况下提供翻译字符串是一个坏主意。
此漏洞记录在 CVE-2012-6329 中。
编写不良的 perl 代码,允许攻击者为 perl 的 x
字符串重复运算符指定计数,已经可以导致内存耗尽拒绝服务攻击。perl v5.15.5 之前的版本中的一个缺陷会导致这种情况升级为堆缓冲区溢出;与 2.16 之前的 glibc 版本结合使用,它可能允许执行任意代码。
针对此提交解决的缺陷已分配标识符 CVE-2012-5195,由 Tim Brown 研究。
哈希大修中的一些更改与以前版本的 perl 不完全兼容。请阅读该部分。
\N{...}
中的未知字符名称现在是语法错误以前,它会发出警告,并替换 Unicode 替换字符。Unicode 现在建议这种情况是语法错误。此外,以前的行为会导致一些令人困惑的警告和行为,并且由于替换字符除了作为某些未知字符的替身之外没有其他用途,因此任何存在此问题代码都是有错误的。
\N{}
字符名称别名中以前已弃用的字符现在是错误。从 v5.12.0 开始,在用户定义的 \N{...}
字符名称中使用某些字符已被弃用。这些字符现在会导致语法错误。例如,现在以数字开头的名称是错误的,例如
my $undraftable = "\N{4F}"; # Syntax error!
或者在名称中包含逗号。请参阅 "charnames 中的 CUSTOM ALIASES"。
\N{BELL}
现在指的是 U+1F514 而不是 U+0007Unicode 6.0 将 "BELL" 这个名称重新用于与传统含义不同的代码点。从 Perl v5.14 开始,使用这个名称仍然指的是 U+0007,但会发出弃用警告。现在,"BELL" 指的是 U+1F514,而 U+0007 的名称是 "ALERT"。charnames 中的所有函数都已相应更新。
Unicode 现在已撤回其先前关于正则表达式自动处理单个字符不区分大小写匹配多个字符的建议,例如,字母 LATIN SMALL LETTER SHARP S 和序列 ss
。这是因为事实证明,在所有情况下正确执行此操作是不切实际的。由于 Perl 尽其所能尝试执行此操作,因此它将继续这样做。(我们正在考虑一个将其关闭的选项。)但是,当此类匹配发生在 [方括号] 字符类中时,将添加一个新的限制。人们指定了诸如 /[\0-\xff]/i
之类的内容,并对它匹配两个字符序列 ss
感到惊讶(因为 LATIN SMALL LETTER SHARP S 出现在此范围内)。这种行为也与使用属性而不是范围不一致:\p{Block=Latin1}
也包含 LATIN SMALL LETTER SHARP S,但 /[\p{Block=Latin1}]/i
不匹配 ss
。新规则是,要在一个方括号字符类中进行多字符不区分大小写匹配,该字符必须明确列出,而不是作为范围的端点。这更符合最小惊奇原则。请参阅 "perlrecharclass 中的方括号字符类"。请注意,一个错误 [perl #89774],现在已作为此更改的一部分修复,阻止了先前行为完全正常工作。
由于疏忽,v5.16 中的单字符变量名完全不受限制。这为各种疯狂行为打开了大门。从 v5.18 开始,这些变量名现在遵循其他标识符的规则,此外还接受与 \p{POSIX_Punct}
属性匹配的字符。
使用大括号和不使用大括号指定标识符的解析方式不再有任何区别。例如,perl 以前允许使用 ${foo:bar}
(带单个冒号),但不允许使用 $foo:bar
。现在,由于两者都由单个代码路径处理,因此它们都以相同的方式处理:两者都被禁止。请注意,此更改是关于允许的文字标识符范围,而不是其他表达式。
没有人能回忆起为什么 \s
不匹配 \cK
(垂直制表符)。现在它匹配了。鉴于该字符的极端稀有性,预计很少出现故障。也就是说,以下是它的含义
在正则表达式中,\s
现在在所有情况下都匹配垂直制表符。
当使用 /x
修饰符时,正则表达式文字中的文字垂直制表符将被忽略。
当将字符串解释为数字时,单独的或与其他空白符混合的领先垂直制表符现在将被忽略。例如
$dec = " \cK \t 123";
$hex = " \cK \t 0xF";
say 0 + $dec; # was 0 with warning, now 123
say int $dec; # was 0, now 123
say oct $hex; # was 0, now 15
/(?{})/
和 /(??{})/
已被彻底修改此功能的实现已几乎完全重写。虽然其主要目的是修复错误,但某些行为(尤其是与词法变量范围相关的行为)将发生变化。这将在 "选定的错误修复" 部分中更详细地描述。
不再可能像这样滥用解析器解析 s///e
的方式
%_=(_,"Just another ");
$_="Perl hacker,\n";
s//_}->{_/e;print
given
现在为全局 $_
创建别名given
现在不再分配给隐式词法 $_
,而是使全局 $_
成为其参数的别名,就像 foreach
一样。但是,如果作用域中存在词法 $_
,它仍然使用词法 $_
(同样,就像 foreach
一样)[perl #114020]。
智能匹配是在 v5.10.0 中添加的,并在 v5.10.1 中进行了重大修改,一直是经常抱怨的点。虽然它在很多方面都很有用,但它也被证明对 Perl 的用户和实现者来说存在问题和令人困惑。关于如何最好地解决这个问题,已经提出了很多建议。很明显,智能匹配几乎肯定会改变或在将来消失。不建议依赖其当前行为。
当解析器看到 ~~
、given
或 when
时,现在将发出警告。要禁用这些警告,可以在适当的作用域中添加以下行
no if $] >= 5.018, warnings => "experimental::smartmatch";
不过,请考虑替换这些功能的使用,因为它们在稳定之前可能会再次改变行为。
$_
现在是实验性的自从它在 Perl v5.10 中引入以来,它引起了很多困惑,没有明显的解决方案
各种模块(例如,List::Util)期望回调例程使用全局 $_
。use List::Util 'first'; my $_; first { $_ == 1 } @list
的工作方式与预期不符。
同一文件中较早的 my $_
声明会导致令人困惑的闭包警告。
_
子例程原型字符允许调用的子例程访问您的词法 $_
,因此它实际上并不私有。
然而,具有 "(@)" 原型的子例程和方法无法访问调用者的词法 $_
,除非它们是用 XS 编写的。
但即使是 XS 例程也无法访问在调用子例程中而不是在外部作用域中声明的词法 $_
,除非该子例程碰巧没有提到 $_
或使用任何默认使用 $_
的运算符。
我们希望词法 $_
可以恢复,但这可能会导致其行为发生变化。在它变得稳定之前,请谨慎使用它。
$/ = \N
的 readline() 现在读取 N 个字符,而不是 N 个字节以前,从具有 I/O 层(如 encoding
)的流中读取时,readline() 函数(也称为 <>
运算符)将从最顶层读取 N 个字节。[perl #79960]
现在,读取 N 个字符。
从没有额外层的流中读取时,行为没有变化,因为字节与字符完全匹配。
glob
现在传递一个参数glob
重写以前传递一个神奇的未记录的第二个参数,该参数标识调用者。CPAN 上没有任何东西在使用它,它妨碍了错误修复,因此它被删除了。如果您确实需要识别调用者,请参阅 CPAN 上的 Devel::Callsite。
现在,在类似引号的操作符中,here 文档的主体始终从 "<<foo" 标记后的下一行开始。以前,文档中说明它从包含类似引号的操作符后的下一行开始,但实际上并非总是如此 [perl #114040]。
您不再可以像这样编写
m/a/and 1
相反,您必须编写
m/a/ and 1
使用空格将操作符与正则表达式的结束分隔符分开。从 Perl v5.14.0 开始,没有空格会导致弃用警告。
qw
列表曾经欺骗解析器,使其认为它们始终被括号包围。这允许一些令人惊讶的构造,例如 foreach $x qw(a b c) {...}
,它实际上应该写成 foreach $x (qw(a b c)) {...}
。这些有时会使词法分析器进入错误的状态,因此它们无法完全正常工作,而类似的 foreach qw(a b c) {...}
可能会被允许,但从未真正起作用。
qw
的这种副作用现在已被废除。它从 Perl v5.13.11 开始就被弃用。现在需要在语法要求的地方使用真正的括号。
如果词法警告尚未启用,则启用任何词法警告都会先禁用所有默认警告
$*; # deprecation warning
use warnings "void";
$#; # void warning; no deprecation warning
现在,当启用词法警告时,debugging
、deprecated
、glob
、inplace
和 malloc
警告类别将保持启用状态(当然,除非它们被 no warnings
禁用)。
这可能会导致以前没有警告的代码出现弃用警告。
这些是唯一仅包含默认警告的类别。其他类别中的默认警告仍然会被 use warnings "category"
禁用,因为我们还没有控制单个警告的机制。
state sub
和 our sub
由于历史原因,state sub
和 our sub
等同于普通的 sub
,因此甚至可以使用 our sub { ... }
创建匿名子例程。这些现在在 "lexical_subs" 特性之外被禁止。在 "lexical_subs" 特性下,它们具有在 "perlsub 中的词法子例程" 中描述的新含义。
存储在环境变量中的值在被子进程继承时始终会被字符串化。
在本版本中,当赋值给%ENV
时,值会立即被转换为字符串,并转换为仅包含字节的字符串。
首先,它被强制转换为字符串。然后,如果字符串是 utf8 并且等效于utf8::downgrade()
有效,则使用该结果;否则,将使用等效于utf8::encode()
的结果,并发出有关宽字符的警告("诊断")。
require
对于不可读文件会终止当require
遇到不可读文件时,它现在会终止。它以前会忽略该文件并继续搜索@INC
中的目录 [perl #113422]。
gv_fetchmeth_*
和 SUPER各种gv_fetchmeth_*
XS 函数以前会对名称以::SUPER
结尾的包进行特殊处理。对Foo::SUPER
包的 方法查找将被视为对Foo
包的SUPER
方法查找。这种情况不再存在。要进行SUPER
查找,请传递Foo
存储区和GV_SUPER
标志。
split
的第一个参数被更一致地解释在 v5.17 中进行了一些更改后,split
的行为已简化:如果 PATTERN 参数计算结果为包含一个空格的字符串,则它将以与以前包含一个空格的字面字符串相同的方式处理。
以下模块将在未来版本中从核心发行版中移除,届时需要从 CPAN 安装。CPAN 上需要这些模块的发行版需要将它们列为先决条件。
这些模块的核心版本现在将发出“deprecated”类别的警告,以提醒您这一点。要消除这些弃用警告,请从 CPAN 安装相关模块。
请注意,这些模块(除了少数例外)都是很好的模块,我们鼓励您继续使用它们。它们从核心发行版中移除的主要原因是它们对于引导一个功能齐全、支持 CPAN 的 Perl 安装的必要性,而不是与它们的设计有关的担忧。
现在强烈建议不要使用此 pragma。它将源文本的编码与 I/O 数据的编码混淆,重新解释源文本中的转义序列(这是一个有争议的选择),并将 UTF-8 错误引入到所有字符字符串的运行时处理中。它在设计上存在缺陷,无法修复。
要在源文本中使用非 ASCII 字面字符,请参考 utf8。要处理文本 I/O 数据,请参考 Encode 和 open。
CPANPLUS::*
模块以下实用程序将在未来版本中从核心发行版中删除,因为它们关联的模块已弃用。它们将继续在适用的 CPAN 发行版中提供。
此解释器全局变量用于跟踪解释器中的 Perl 对象总数。它不再维护,将在 Perl v5.20 中完全删除。
/x
的模式中,应转义五个额外字符当使用 /x
编译正则表达式模式时,Perl 将 6 个字符视为要忽略的空白字符,例如 SPACE 和 TAB。但是,Unicode 建议将 11 个字符视为空白字符。我们将在未来的 Perl 版本中符合此标准。在此期间,使用任何缺少的字符将引发弃用警告,除非已关闭。这五个字符是
U+0085 NEXT LINE
U+200E LEFT-TO-RIGHT MARK
U+200F RIGHT-TO-LEFT MARK
U+2028 LINE SEPARATOR
U+2029 PARAGRAPH SEPARATOR
用户定义的字符名称如果在末尾或中间包含多个空格,很可能是一个错误。现在,在定义时会生成警告,假设使用该名称时不太可能包含多余的空格。
所有用于对字符进行分类的函数将在 Perl 的未来版本中移除,不应再使用。使用支持的 C 编译器(例如 gcc)编译任何使用这些函数的文件都会生成警告。这些函数并非用于公开使用;对于大多数函数,都存在等效的、更快的宏。
请参阅 "perlapi 中的字符类"。完整的列表如下:
is_uni_alnum
、is_uni_alnumc
、is_uni_alnumc_lc
、is_uni_alnum_lc
、is_uni_alpha
、is_uni_alpha_lc
、is_uni_ascii
、is_uni_ascii_lc
、is_uni_blank
、is_uni_blank_lc
、is_uni_cntrl
、is_uni_cntrl_lc
、is_uni_digit
、is_uni_digit_lc
、is_uni_graph
、is_uni_graph_lc
、is_uni_idfirst
、is_uni_idfirst_lc
、is_uni_lower
、is_uni_lower_lc
、is_uni_print
、is_uni_print_lc
、is_uni_punct
、is_uni_punct_lc
、is_uni_space
、is_uni_space_lc
、is_uni_upper
、is_uni_upper_lc
、is_uni_xdigit
、is_uni_xdigit_lc
、is_utf8_alnum
、is_utf8_alnumc
、is_utf8_alpha
、is_utf8_ascii
、is_utf8_blank
、is_utf8_char
、is_utf8_cntrl
、is_utf8_digit
、is_utf8_graph
、is_utf8_idcont
、is_utf8_idfirst
、is_utf8_lower
、is_utf8_mark
、is_utf8_perl_space
、is_utf8_perl_word
、is_utf8_posix_digit
、is_utf8_print
、is_utf8_punct
、is_utf8_space
、is_utf8_upper
、is_utf8_xdigit
、is_utf8_xidcont
、is_utf8_xidfirst
。
此外,以下三个从未正常工作的函数也已弃用:to_uni_lower_lc
、to_uni_title_lc
和 to_uni_upper_lc
。
Perl 在正则表达式模式中识别三对字符作为元字符:{}
、[]
和 ()
。这些字符也可以用作模式的定界符,例如:
m{foo}
s(foo)(bar)
由于它们是元字符,因此对正则表达式模式具有特殊含义,事实证明,如果在由它们定界的模式中成对使用它们,则无法通过在它们前面加上反斜杠来关闭这种特殊含义。例如,在
m{foo\{1,3\}}
中,反斜杠不会改变行为,它匹配 "f o"
后面跟一个到三个 "o"
。
像这样将它们解释为元字符的用法非常罕见;我们认为,例如,在整个 CPAN 中都没有这样的用法。因此,此弃用应该对很少的代码产生影响。但是,它确实通知任何此类代码需要更改,这反过来将允许我们在未来的 Perl 版本中更改行为,以便反斜杠确实起作用,并且不会担心我们正在默默地破坏任何现有代码。
(?
和 (*
如果在 (?...)
正则表达式结构中,(
和 ?
之间存在空格或注释,则现在会发出弃用警告。类似地,如果在 (*VERB...)
结构中,(
和 *
之间存在空格。
理论上,您目前可以构建不使用 PerlIO 的 perl。相反,您将使用围绕 stdio 或 sfio 的包装器。在实践中,这并没有什么用。它没有经过充分测试,并且没有对 IO 层(因此也没有对 Unicode)的支持,它并不是一个真正的 perl。在下一个版本的 perl 中,很可能将删除不使用 PerlIO 的构建方式。
如果需要使用 stdio,PerlIO 支持 stdio
层。类似地,如果需要,将来可以生成 sfio 层。
不支持基础设施的平台
Windows CE 和 z/OS 历来维护不足,目前既无法成功构建,也无法定期进行冒烟测试。正在努力改变这种情况,但不能保证这些平台是安全且受支持的。如果它们无法构建或无法定期进行冒烟测试,则在将来的版本中可能会主动删除对它们的 支持。如果您对这些平台感兴趣,并且可以提供您的时间、专业知识或硬件来帮助支持这些平台,请通过电子邮件 [email protected]
告知 perl 开发团队。
一些看起来完全已死的平台也列入了从现在到 v5.20.0 之间删除的候选名单。
我们还认为,当前版本的 Perl 将不再能够在 AmigaOS、DJGPP、NetWare(原生)、OS/2 和 Plan 9 上构建。如果您在这些平台上使用 Perl,并且有兴趣确保 Perl 在这些平台上的未来,请联系我们。
我们认为 Perl 很久以前就无法在混合字节序架构(如 PDP-11)上构建,并且打算删除任何剩余的支持代码。类似地,如果没有人表明自己是活跃用户,那么支持长期未维护的 GNU dld 的代码将很快被删除。
交换 $< 和 $>
Perl 从 5.0 版本开始支持使用交换 $< 和 $>(以及 $( 和 $))来临时降低权限的习惯用法,如下所示
($<, $>) = ($>, $<);
但是,这种习惯用法会修改实际的用户/组 ID,这可能会产生不良的副作用,并且在 Perl 支持的任何平台上都已不再有用,并且会使这些变量和列表赋值的实现变得复杂。
作为替代方案,建议仅对 $>
进行赋值
local $> = $<;
另请参阅:Setuid Demystified.
microperl
,长期以来一直存在问题且目的不明确,将被删除。
改进双引号字符串中与其他转义符组合的 "\Q"
语义。
在 \Q...\E
对中,\Q
和 \x
、\L
等转义符的组合存在一些错误和不一致之处。这些问题需要修复,修复过程中必然会改变当前的行为。更改尚未确定。
在将来的 Perl 版本中,将不允许在 $x
中使用 x
代表任何实际的(不可打印的)C0 控制字符。请改用 ${x}
(其中 x
代表控制字符),或者更好的是,使用 $^A
,其中 ^
是插入符号(脱字符),A
代表 "OPERATOR DIFFERENCES" in perlebcdic 末尾列出的任何字符。
现在对词法变量声明列表(my($x, $y)
)进行了优化,使其降至单个操作,因此比以前更快。
添加了一个新的 C 预处理器定义 NO_TAINT_SUPPORT
,如果设置了该定义,则会完全禁用 Perl 的 taint 支持。使用 -T 或 -t 命令行标志将导致致命错误。请注意,核心测试以及许多 CPAN 发行版的测试都会因此更改而失败。另一方面,由于减少了分支,因此它提供了少许性能优势。
除非您确切地知道自己在做什么,否则不要启用此功能。
在大多数情况下,具有常量参数的 pack
现在会进行常量折叠 [perl #113470]。
针对 Unicode 属性的正则表达式匹配速度提升。最大的提升是针对 \X
,即 Unicode 的“扩展字形簇”。它的提升幅度约为 35% - 40%。包含大于 255 的代码点的括号字符类,例如 [0-9\x{100}]
,现在也更快了。
在支持的平台上,一些以前的宏现在被实现为静态内联函数。这应该在非 GCC 平台上略微提高速度。
布尔上下文中的哈希优化已扩展到影响 scalar(%hash)
、%hash ? ... : ...
和 sub { %hash || ... }
。
文件测试运算符以更有效的方式管理堆栈。
在大多数情况下,数字上下文中的 glob 现在直接被数字化,而不是通过字符串化进行数字化。
如果在标量上下文中调用 x
重复运算符,并且操作数为常量,并且左操作数周围没有括号,则现在在编译时将其折叠为单个常量。
Config::Perl::V 版本 0.16 作为双重生命周期模块添加。它提供 perl -V
输出的结构化数据检索,包括仅 perl
二进制文件已知的信息,而 Config 不提供。
有关更新的完整列表,请运行
$ corelist --diff 5.16.0 5.18.0
您也可以用您喜欢的版本替换 5.16.0
。
Archive::Extract 已升级到 0.68。
解决 Linux 上 Busybox 的 unzip 的边缘情况。
Archive::Tar 已升级到 1.90。
ptar 现在支持 -T 选项以及无破折号选项 [rt.cpan.org #75473]、[rt.cpan.org #75475]。
自动编码标记为 UTF-8 的文件名 [rt.cpan.org #75474]。
不要在 IO::Zlib 处理程序上使用 tell
[rt.cpan.org #64339]。
不要尝试对符号链接进行 chown
。
autodie 已升级到 2.13。
autodie
现在与 'open' 语义配合良好。
B 已升级到 1.42。
已添加 COP 的 stashoff
方法。这提供了对 perl 5.16 中线程化构建中添加的内部字段的访问 [perl #113034]。
B::COP::stashpv
现在支持 UTF-8 包名称和嵌入的 NUL。
所有 CVf_*
和 GVf_*
以及更多与 SV 相关的标志值现在作为 B::
命名空间中的常量提供,并且可以导出。默认导出列表没有改变。
这使模块能够与新的 pad API 协同工作。
B::Concise 已升级至 0.95。
-nobanner
选项已修复,并且现在可以转储 format
。当传递一个子名称进行转储时,它还会检查该名称是否为格式名称。如果子名称和格式名称相同,则会转储两者。
这添加了对新 OpMAYBE_TRUEBOOL
和 OPpTRUEBOOL
标志的支持。
B::Debug 已升级至 1.18。
这添加了对 B::PADLIST
的支持(实验性),该功能在 Perl 5.17.4 中添加。
B::Deparse 已升级至 1.20。
在 perl -w
下运行时,避免发出警告。
它现在以正确的优先级解析循环控制,并且 format
行中的多个语句现在也解析正确。
此版本在格式中抑制了尾随分号。
此版本为词法子例程添加了存根解析。
它不再在解析没有参数的 sort
时死亡。它现在正确地省略了 system $prog @args
和 exec $prog @args
的逗号。
bignum、bigint 和 bigrat 已升级至 0.33。
hex
和 oct
的覆盖已被重写,消除了几个问题,并进行了一项不兼容的更改。
以前,use bigint
或 use bigrat
中编译较晚者将优先于另一个,导致 hex
和 oct
在作用域内不尊重另一个 pragma。
使用这三个 pragma 中的任何一个都会导致程序中其他地方的 hex
和 oct
在列表上下文中评估其参数,并阻止它们在没有参数的情况下调用时推断 $_。
使用这三个 pragma 中的任何一个都会使 oct("1234")
在程序中的任何地方返回 1234(对于任何不以 0 开头的数字)。现在 "1234" 将从八进制转换为十进制,无论是在 pragma 的作用域内还是作用域外。
用于促进 hex
和 oct
的词法使用的全局覆盖现在尊重在安装新覆盖之前存在的任何现有覆盖,在 use bignum
的作用域之外回退到它们。
use bignum "hex"
、use bignum "oct"
和 bigint 和 bigrat 的类似调用现在导出 hex
或 oct
函数,而不是提供全局覆盖。
Carp 已升级至 1.29。
当 caller
为已删除的包返回 undef 时,Carp 不再感到困惑。
longmess()
和 shortmess()
函数现已添加文档。
CGI 已升级至 3.63 版本。
现在对无法识别的 HTML 转义序列进行了更好的处理,startform()
或 start_form()
不会再在 <form> 标签后插入有问题的尾随换行符,并且现在已解决某些版本的 perl 中出现的虚假“不安全依赖”警告。
Class::Struct 已升级至 0.64 版本。
构造函数现在会尊重重写的访问器方法 [perl #29230]。
Compress::Raw::Bzip2 已升级至 2.060 版本。
已修复 Perl 的“魔法”API 的误用。
Compress::Raw::Zlib 已升级至 2.060 版本。
将捆绑的 zlib 升级至 1.2.7 版本。
修复了在 Irix、Solaris 和 Win32 上的构建失败,以及在以 C++ 构建时的构建失败 [rt.cpan.org #69985]、[rt.cpan.org #77030]、[rt.cpan.org #75222]。
已修复 Perl 的“魔法”API 的误用。
通过使参数验证更高效,compress()
、uncompress()
、memGzip()
和 memGunzip()
的速度得到了提升。
CPAN::Meta::Requirements 已升级至 2.122 版本。
将 from_string_hash
中未定义的要求视为 0(并发出警告)。
添加了 requirements_for_module
方法。
CPANPLUS 已升级至 0.9135 版本。
允许将 blib/script 添加到 PATH。
在 shell 的调用之间保存历史记录。
更好地处理多个 makemakerargs
和 makeflags
参数。
这解决了 SQLite 源引擎的问题。
Data::Dumper 已升级至 2.145 版本。
它经过优化,仅在必要时构建一个已见标量哈希,从而极大地加快了序列化速度。
添加了额外的测试,以提高语句、分支、条件和子例程的覆盖率。根据覆盖率分析,对 Dumper.pm 的内部结构进行了重构。现在几乎所有方法都有文档。
DB_File 已升级至 1.827 版本。
主 Perl 模块不再使用 "@_"
结构。
Devel::Peek 已升级至 1.11 版本。
这修复了使用 C++ 编译器进行编译的问题,并使模块能够与新的 pad API 一起使用。
Digest::MD5 已升级至 2.52 版本。
修复了Digest::Perl::MD5
的 OO 回退问题 [rt.cpan.org #66634]。
Digest::SHA 已升级至 5.84。
此修复了双重释放错误,该错误在某些情况下可能导致漏洞。
DynaLoader 已升级至 1.18。
这是由于 VMS 实现的 XS 中的代码进行了细微更改。
此修复了关于在没有 OUTPUT
部分的情况下使用 CODE
部分的警告。
Encode 已升级至 2.49。
已添加 Mac 别名 x-mac-ce,并在 Encode::Unicode、Encode::UTF7 和 Encode::GSM0338 中修复了各种错误。
Env 已升级至 1.04。
其 SPLICE 实现不再在列表上下文中出现错误行为。
ExtUtils::CBuilder 已升级至 0.280210。
现在,对于使用清单文件的那些版本的 VC++,清单文件已正确嵌入。[perl #111782, #111798]。
现在,在 Windows 上,与其他操作系统一样,可以将要导出的符号列表传递给 link()
[perl #115100]。
ExtUtils::ParseXS 已升级至 3.18。
生成的 C 代码现在避免在 Perl 版本(在这些版本中自动完成或在当前 Perl 版本中变量不再存在)上不必要地递增 PL_amagic_generation
。
这避免了针对已初始化的 XSUB 非参数的虚假警告 [perl #112776]。
File::Copy 已升级至 2.26。
copy()
在复制到同一目录时不再将文件清零,并且现在在尝试将文件复制到自身时也会失败(正如长期以来的文档所述)。
File::DosGlob 已升级至 1.10。
它为每个调用者保留的文件名内部缓存现在在该调用者被释放时被释放。这意味着 use File::DosGlob 'glob'; eval 'scalar <*>'
不再发生内存泄漏。
File::Fetch 已升级至 0.38。
为没有文件组件的 URL 添加了 'file_default' 选项。
尽可能使用 File::HomeDir
,并提供 PERL5_CPANPLUS_HOME
来覆盖自动检测。
如果设置了 fetchdir
,则始终重新获取 CHECKSUMS。
File::Find 已升级到 1.23。
这修复了 VMS 上不一致的类 Unix 路径处理。
现在,单个文件可能会出现在要搜索的目录列表中 [perl #59750]。
File::Glob 已升级到 1.20。
File::Glob 进行了与 File::DosGlob 完全相同的修复。由于它是 Perl 自身的 glob
运算符使用的(除了在 VMS 上),这意味着 eval 'scalar <*>'
不会再泄漏。
以空格分隔的模式列表返回大量结果不再会导致内存损坏或崩溃。此错误是在 Perl 5.16.0 中引入的。[perl #114984]
File::Spec::Unix 已升级到 3.40。
abs2rel
在给出两个相对路径或两次给出根目录时可能会产生不正确的结果 [perl #111510]。
File::stat 已升级到 1.07。
File::stat
忽略 filetest 编译指示,并在与之结合使用时发出警告。但它没有对 -r
发出警告。这已修复 [perl #111640]。
-p
现在可以工作,并且不会对管道返回 false [perl #111638]。
以前,File::stat
的重载 -x
和 -X
运算符在以 root 身份运行时,不会对目录或可执行文件给出正确的结果。它们一直在将 root 的可执行权限视为任何其他用户,对非 root 拥有的文件执行组成员资格测试等。它们现在遵循正确的 Unix 行为 - 对于目录,它们始终为真,对于文件,如果三个执行权限位中的任何一个被设置,那么它们会报告 root 可以执行该文件。Perl 的内置 -x
和 -X
运算符一直都是正确的。
File::Temp 已升级到 0.23
修复了涉及目录删除的各种错误。如果初始删除失败,则推迟删除临时文件,这修复了 NFS 上的问题。
GDBM_File 已升级到 1.15。
已删除 TIEHASH
的未记录的可选第五个参数。这旨在提供对 gdbm*
函数在发生致命错误(例如文件系统问题)时使用的回调的控制,但不起作用(并且永远无法工作)。CPAN 上的任何代码都没有尝试使用它。回调现在始终是之前的默认值,croak
。还解决了某些平台上如何调用 C
croak
函数的问题。
Hash::Util 已升级到 0.15。
hash_unlocked
和 hashref_unlocked
现在在哈希解锁时返回 true,而不是始终返回 false [perl #112126]。
hash_unlocked
、hashref_unlocked
、lock_hash_recurse
和 unlock_hash_recurse
现在可导出 [perl #112126]。
添加了两个新函数,hash_locked
和 hashref_locked
。奇怪的是,这两个函数已经导出,即使它们不存在 [perl #112126]。
HTTP::Tiny 已升级到 0.025。
添加 SSL 验证功能 [github #6]、[github #9]。
在响应 hashref 中包含最终 URL。
添加 local_address
选项。
这改进了 SSL 支持。
IO 已升级到 1.28。
sync()
现在可以调用只读文件句柄 [perl #64772]。
IO::Socket 更加努力地缓存或以其他方式获取套接字信息。
IPC::Cmd 已升级到 0.80。
在 run_forked
中使用 POSIX::_exit
而不是 exit
[rt.cpan.org #76901]。
IPC::Open3 已升级到 1.13。
open3()
函数不再使用 POSIX::close()
来关闭文件描述符,因为这会破坏 PerlIO 在文件描述符由 PerlIO 流共享的情况下对文件描述符进行的引用计数,导致在以后关闭任何此类 PerlIO 流时尝试第二次关闭文件描述符。
Locale::Codes 已升级到 3.25。
它包含一些新的代码。
Memoize 已升级到 1.03。
修复 MERGE
缓存选项。
Module::Build 已升级到 0.4003。
修复了没有 $VERSION
的模块可能在 'provides' 元数据中列出 '0' 版本的错误,这将被 PAUSE 拒绝。
修复了 PodParser 中允许模块名称中出现数字的错误。
修复了给出两次参数会导致它们变成数组的错误,从而导致安装路径类似于 ARRAY(0xdeadbeef)/lib/Foo.pm。
一个小的错误修复允许在 POD "abstract" 行中的前导 "Name" 周围使用标记,并且进行了一些文档改进。
Module::CoreList 已升级至 2.90 版本。
版本信息现在以增量形式存储,这大大减小了 CoreList.pm 文件的大小。
这恢复了与旧版 perl 的兼容性,并清理了各种模块的 corelist 数据。
Module::Load::Conditional 已升级至 0.54 版本。
修复了在安装到包含空格的路径中的 perl 上使用 requires
的问题。
各种增强功能包括新使用 Module::Metadata。
Module::Metadata 已升级至 1.000011 版本。
为典型模块文件创建 Module::Metadata 对象的速度提高了约 40%,并且抑制了一些关于 $VERSION
的虚假警告。
Module::Pluggable 已升级至 4.7 版本。
除了其他更改外,现在允许在事件上使用触发器,这提供了一种强大的修改行为的方式。
Net::Ping 已升级至 2.41 版本。
这修复了 Windows 上的一些测试失败。
Opcode 已升级至 1.25 版本。
反映了 boolkeys 操作码的移除以及 clonecv、introcv 和 padcv 操作码的添加。
overload 已升级至 1.22 版本。
no overload
现在会像 use overload
一样,对无效参数发出警告。
PerlIO::encoding 已升级至 0.16 版本。
这是实现 ":encoding(...)" I/O 层的模块。当编码后端重新分配缓冲区或为其提供类型全局变量或共享哈希键标量时,它不再会损坏内存或崩溃。
PerlIO::scalar 已升级至 0.16 版本。
提供的缓冲区标量现在只能包含 0xFF 或更低的代码点。[perl #109828]
Perl::OSType 已升级至 1.003 版本。
这修复了检测 VOS 操作系统的一个错误。
Pod::Html 已升级至 1.18 版本。
--libpods
选项已被恢复。它已弃用,其使用除了发出关于不再支持它的警告之外,不会做任何其他事情。
由于 pod2html 生成的 HTML 文件声称具有 UTF-8 字符集,因此实际上使用 UTF-8 写入文件 [perl #111446]。
Pod::Simple 已升级至 3.28 版本。
进行了许多改进,主要针对 Pod::Simple::XHTML,它也有一些兼容性变更:codes_in_verbatim
选项现在默认禁用。有关完整详细信息,请参阅 cpan/Pod-Simple/ChangeLog。
re 已升级至 0.23 版本。
现在对单字符 [类](例如 /[s]/
或 /[s]/i
)进行了优化,就像它们没有括号一样,即 /s/
或 /s/i
。
有关 op_comp
的说明,请参见下面 "内部变更" 部分。
Safe 已升级至 2.35 版本。
修复了与 Devel::Cover
的交互问题。
不要在 no strict
下评估代码。
Scalar::Util 已升级至 1.27 版本。
修复了 sum
的重载问题。
first
和 reduce
现在会先检查回调(因此 &first(1)
不允许)。
修复了魔法值上的 tainted
[rt.cpan.org #55763]。
修复了先前魔法值上的 sum
[rt.cpan.org #61118]。
修复了读取超出固定缓冲区末尾的问题 [rt.cpan.org #72700]。
Search::Dict 已升级至 1.07 版本。
不再需要对文件句柄进行 stat
操作。
使用 fc
进行大小写折叠。
Socket 已升级至 2.009 版本。
添加了 IP 多播源组成员资格所需的常量和函数。
unpack_sockaddr_in()
和 unpack_sockaddr_in6()
现在在标量上下文中只返回 IP 地址,而 inet_ntop()
现在会防止传入长度不正确的标量。
这修复了未初始化的内存读取问题。
Storable 已升级至 2.41 版本。
在 STORABLE_freeze
中修改 $_[0]
现在不会导致崩溃 [perl #112358]。
当结构中存在对某个对象的多个引用时,现在只解冻一次实现了 STORABLE_attach
的对象 [perl #111918]。
受限哈希并非总是正确解冻 [perl #73972]。
当使用 STORABLE_freeze()
方法冻结一个祝福的 REF 对象时,Storable 会 croak [perl #113880]。
现在可以正确地冻结和解冻 vstring。这会导致存储格式发生轻微的不兼容更改,因此格式版本已增加到 2.9。
这包含各种错误修复,包括对旧版 Perl 和 vstring 处理的兼容性修复。
Sys::Syslog 已升级至 0.32 版本。
这包含几个与 getservbyname()
、setlogsock()
和 syslog()
中的日志级别相关的错误修复,以及对 Windows、Haiku-OS 和 GNU/kFreeBSD 的修复。有关完整详细信息,请参阅 cpan/Sys-Syslog/Changes。
Term::ANSIColor 已升级至 4.02 版本。
添加对斜体的支持。
改进错误处理。
Term::ReadLine 已升级到 1.10。这修复了在 Windows 上使用 cpan 和 cpanp shell 时,当前驱动器碰巧包含一个 \dev\tty 文件的情况。
Test::Harness 已升级到 3.26。
修复 Win32 上的 glob 语义 [rt.cpan.org #49732]。
在调用 perl 时,不要使用 Win32::GetShortPathName
[rt.cpan.org #47890]。
在读取 shebang 时忽略 -T [rt.cpan.org #64404]。
更优雅地处理我们不知道测试等待状态的情况。
使测试摘要“ok”行可覆盖,以便可以将其更改为插件,以使 prove 的输出幂等。
不要运行世界可写文件。
Text::Tabs 和 Text::Wrap 已升级到 2012.0818。它们都添加了对 Unicode 组合字符的支持。
threads::shared 已升级到 1.31。
这添加了选项,可以警告或忽略尝试克隆无法克隆的结构,而不是在这种情况下无条件地死亡。
这添加了对由 Scalar::Util::dualvar 创建的双值值的支持。
Tie::StdHandle 已升级到 4.3。
READ
现在尊重 read
的偏移量参数 [perl #112826]。
Time::Local 已升级到 1.2300。
大于 59 但小于 60 的秒值不再导致 timegm()
和 timelocal()
崩溃。
Unicode::UCD 已升级到 0.53。
这添加了一个函数 all_casefolds(),它返回所有大小写折叠。
Win32 已升级到 0.47。
添加了用于获取和设置当前代码页的新 API。
Version::Requirements 已从核心发行版中移除。它以不同的名称可用:CPAN::Meta::Requirements.
perlcheat 进行了重新组织,并添加了一些新部分。
现在明确记录了包含重复键的哈希初始化列表的行为。
"strict refs" 阻止符号引用这一解释现在不再假设读者知道什么是符号引用。
perlfaq 已与 CPAN 上的 5.0150040 版本同步。
现在记录了 pipe
的返回值。
澄清了 our
的文档。
循环控制动词 (dump
、goto
、next
、last
和 redo
) 一直以来都与赋值运算符具有相同的优先级,但直到现在才记录下来。
对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
当此处文档标签具有初始引号但缺少最终引号时,现在会显示此消息。
这替换了关于找不到标签本身的错误消息 [perl #114104]。
当 Windows 上的 ithreads 实现中的子进程未在允许的时间段内调度,因此无法正确初始化时,会抛出此错误 [perl #88840]。
组名必须以非数字词字符开头,在正则表达式中用 <-- HERE 标记,如 m/%s/
此错误已针对 (?&0)
添加,该错误无效。它以前会产生难以理解的错误消息 [perl #101666]。
现在,将未定义的值作为子例程调用会产生此错误消息。它以前是,但意外地被禁用,首先是在 Perl 5.004 中针对非魔法变量,然后是在 Perl v5.14 中针对魔法变量(例如,绑定)变量。现在已恢复。在此期间,undef 被视为空字符串 [perl #113576]。
要使用词法子程序,您必须先启用它们。
no warnings 'experimental::lexical_subs';
use feature 'lexical_subs';
my sub foo { ... }
(W closure)在编译期间,内部命名子程序或 eval 试图捕获当前不可用的外部词法子程序。这可能由于以下两种原因之一。首先,词法子程序可能在尚未创建的外部匿名子程序中声明。(请记住,命名子程序在编译时创建,而匿名子程序在运行时创建。)例如,
sub { my sub a {...} sub f { \&a } }
在创建 f 时,它无法捕获当前的“a”子程序,因为匿名子程序尚未创建。相反,以下代码不会发出警告,因为匿名子程序现在已创建并处于活动状态
sub { my sub a {...} eval 'sub f { \&a }' }->();
第二种情况是由 eval 访问已超出范围的变量引起的,例如,
sub f {
my sub a {...}
sub { eval '\&a' }
}
f()->();
这里,当编译 eval 中的“\&a”时,f() 当前未执行,因此它的 &a 不可用于捕获。
(W misc)“my”或“state”子程序已在当前作用域或语句中重新声明,有效地消除了对先前实例的所有访问。这几乎总是打字错误。请注意,之前的子程序将一直存在到作用域结束或所有闭包引用被销毁之前。
(S experimental)如果您通过 use feature
启用实验性功能,则会发出此警告。如果您想使用该功能,只需抑制警告即可,但请注意,这样做会冒使用实验性功能的风险,该功能可能会在未来的 Perl 版本中更改或删除
no warnings "experimental::lexical_subs";
use feature "lexical_subs";
(W overflow)您使用了一个大于它可以可靠处理的数字调用了 sleep
,并且 sleep
可能比请求的时间睡得更少。
尝试通过 %ENV
将宽字符放入环境变量现在会引发此警告。
chr()
现在在传递负值时会发出警告 [perl #83048]。
srand()
现在在传递不适合 UV
的值时会发出警告(因为该值将被截断而不是溢出)[perl #40605]。
"-i 在命令行上没有文件名的情况下使用,从 STDIN 读取"
使用 -i
标志运行 perl 现在会在命令行上没有提供输入文件时发出警告 [perl #113410]。
现在针对每个引用 $*
和 $#
的位置生成不再支持使用 $*
和 $#
的警告。以前,如果先看到使用相同类型全局变量的另一个变量(例如,在 $*
之前使用 @*
),则不会生成该警告,并且不会针对第二个和后续使用生成该警告。(很难在不每次都生成警告的情况下修复完全不生成警告的失败,并且每次都发出警告与 $[
过去发出的警告一致。)
添加了针对 \b{
和 \B{
的警告。它们是弃用警告,应该通过该类别关闭。不应该为了消除这些警告而关闭常规正则表达式警告。
Constant(%s): 对 &{$^H{%s}} 的调用没有返回定义的值
返回 undef
的常量重载会导致此错误消息。对于数字常量,它过去会显示“Constant(undef)”。“undef” 已被该数字本身替换。
当无法加载模块时产生的错误现在包含一个提示,说明可能需要安装该模块:“无法在 @INC 中找到 hopping.pm(您可能需要安装 hopping 模块)(@INC 包含:...)”
此警告不可抑制,即使使用 no warnings
也不行。现在它可以抑制,并且已从“内部”类别移动到“printf”类别。
在正则表达式中无法使用 {n,m},其中 n > m;由 m/%s/ 中的 <-- HERE 标记
此致命错误已变成一个警告,内容为
(W regexp)最小值应该小于或等于最大值。如果您确实希望您的正则表达式匹配 0 次,只需使用 {0}。
已删除在奇怪情况下发生的“失控原型”警告,因为它没有帮助且不一致。
已删除“不是格式引用”错误,因为触发它的唯一情况是错误。
已删除“无法创建名为 %s 的子例程”错误,原因相同。
已将“在排序比较中无法使用“my %s””错误降级为警告,“在排序比较中使用“my %s””(对于状态变量,使用“state”而不是“my”)。此外,用于猜测是否错误使用了词法 $a 或 $b 的启发式方法已得到改进,以减少误报。如果词法 $a 和 $b 位于排序块之外,则不再禁止它们。此外,排序块内的命名一元或列表运算符不再导致忽略 $a 或 $b [perl #86136]。
h2xs 现在不再为空的定义生成无效代码。[perl #20636]
在 Configure 中添加了 useversionedarchname
选项
当设置时,它会将 'api_versionstring' 包含在 'archname' 中。例如 x86_64-linux-5.13.6-thread-multi。默认情况下它处于未设置状态。
此功能是 Tim Bunce 要求的,他观察到 INSTALL_BASE
创建了一个库结构,该结构没有按 perl 版本进行区分。相反,它将特定于体系结构的文件放置在 "$install_base/lib/perl5/$archname" 中。这使得使用公共 INSTALL_BASE
库路径与多个版本的 perl 变得困难。
通过设置 -Duseversionedarchname
,$archname 将对体系结构和 API 版本保持唯一,允许混合使用 INSTALL_BASE
。
添加 PERL_NO_INLINE_FUNCTIONS
选项
如果定义了 PERL_NO_INLINE_FUNCTIONS
,则不包含 "inline.h"
这允许测试代码包含 perl 头文件以进行定义,而不会创建对 perl 库的链接依赖关系(该库可能尚未存在)。
Configure 将尊重外部 MAILDOMAIN
环境变量(如果设置)。
installman
现在不再忽略 silent 选项
META.yml
和 META.json
文件现在都包含在发行版中。
Configure 现在将正确检测到使用 C++ 编译器编译时的 isblank()
。
Configure 中的分页器检测已得到改进,允许在程序名称后指定选项的响应,例如 /usr/bin/less -R,如果用户接受默认值。这在处理 ANSI 转义符时有助于 perldoc [perl #72156]。
测试套件现在有一个部分用于需要大量内存的测试。这些测试默认情况下不会运行;可以通过将 PERL_TEST_MEMORY
环境变量设置为可以安全使用的内存量(以吉字节为单位)来启用它们。
BeOS 是由 Be Inc 为其 BeBox 硬件开发的个人计算机操作系统。Haiku 操作系统是作为 BeOS 的开源替代品/延续而编写的,其 perl 移植是当前的,并且得到积极维护。
与 UTS 全球相关的支持代码已被移除。UTS 是由 Amdahl 创建的 System V 的大型机版本,后来出售给 UTS 全球。该端口自 Perl v5.8.0 之前就未被触碰,而 UTS 全球现已停止运营。
对 VM/ESA 的支持已被移除。该端口在 2.3.0 上进行了测试,IBM 于 2002 年 3 月停止了对该版本的维护。2.4.0 于 2003 年 6 月停止维护,并被 Z/VM 取代。当前版本的 Z/VM 是 V6.2.0,计划于 2015 年 4 月 30 日停止维护。
对 MPE/IX 的支持已被移除。
与 EPOC 相关的支持代码已被移除。EPOC 是 Psion 为移动设备开发的一系列操作系统。它是 Symbian 的前身。该端口最后一次更新是在 2002 年 4 月。
对 Rhapsody 的支持已被移除。
在 AIX 上使用 xlC 时,Configure 现在始终将 -qlanglvl=extc99
添加到 CC 标志中。这将使编译许多假设 C99 的基于 XS 的模块变得更容易 [perl #113778]。
现在有一个解决方法可以解决自 Perl v5.15.7 以来阻止使用 clang++ 编译的编译器错误 [perl #112786]。
在将 Perl 核心编译为 C++ 时(这只是半支持的),mathom 函数现在被编译为 extern "C"
,以确保正确的二进制兼容性。(但是,在这种情况需要时,二进制兼容性通常并不保证。)
停止将对齐硬编码为 8 字节边界,以修复使用 -Dusemorebits 构建的构建。
Perl 现在应该可以在 Haiku R1 Alpha 4 上开箱即用。
libc_r
已从最新版本的 MidnightBSD 中移除,而旧版本在使用 pthread
时效果更好。现在使用 pthread
启用线程,这可以纠正 0.4-CURRENT 上启用线程时的构建错误。
在配置时,避免运行在 Solaris 上不支持标志的 sed 命令。
在可能的情况下,文件名和命令行参数的大小写现在通过在启动时启用 CRTL 特性 DECC$EFS_CASE_PRESERVE
和 DECC$ARGV_PARSE_STYLE
来保留。后者仅在从运行 Perl 的进程中启用扩展解析时生效。
扩展文件名语法 (EFS) 的字符集现在在 VMS 上默认启用。除此之外,这还提供了对目录名中的点、文件名中的多个点以及文件名中的空格的更好处理。要获得旧的行为,请将逻辑名 DECC$EFS_CHARSET
设置为 DISABLE
。
修复了使用 -Dusemymalloc=y
配置的构建中的链接问题。
通过使用 -Dusecxx
配置,可以使用 HP C++ 编译器构建 Perl 的实验性支持。
现在在 VMS 上安装了发行版顶层目录中的所有 C 头文件,与其他平台上的长期做法保持一致。以前只安装了一个子集,这破坏了依赖于缺少包含文件的非核心扩展的扩展构建。
现在从通过 system
、反引号或管道 open
生成的命令的命令动词(但不是参数)中删除了引号。以前,动词上的引号会传递给 DCL,DCL 将无法识别该命令。此外,如果动词实际上是 ODS-5 卷上映像或命令过程的路径,则现在引用它允许路径包含空格。
已针对 OpenVMS 上的 HP C++ 编译器修复了 a2p 构建。
现在可以通过在 win32/Makefile 中指定 CCTYPE=MSVC110(如果您使用的是 Windows 桌面免费版,则为 MSVC110FREE)来使用 Microsoft 的 Visual C++ 2012 编译器构建 Perl。
已删除构建时不使用 USE_SOCKETS_AS_HANDLES
的选项。
修复了在 Win32 上的线程调试构建中,perl 在清理线程(包括主线程)时可能崩溃的问题 [perl #114496]。
已修复一个罕见的竞争条件,该条件会导致 sleep 占用比请求更多的时间,甚至可能挂起 [perl #33096]。
Win32 上的 link
现在尝试根据 Win32 API 错误代码将 $!
设置为更合适的值。[perl #112272]
当环境包含非 ASCII 字符时,Perl 不再混淆环境块,例如在启动新的子进程时。但是,当环境包含当前 ANSI 代码页之外的字符时,仍然存在已知问题(例如,请参阅 http://perl5.git.perl.org/perl.git/blob/HEAD:/Porting/todo.pod 中关于 %ENV
中 Unicode 的条目)。[perl #113536]
使用某些 Windows 编译器构建 perl 以前会失败,因为 miniperl 的 glob
运算符(使用 perlglob
程序)删除了 PATH 环境变量 [perl #113798]。
Windows makefile 中添加了一个新的 makefile 选项 USE_64_BIT_INT
。在构建 32 位 perl 时,如果要使用 64 位整数,请将其设置为“define”。
机器代码大小减少,已经对 Perl v5.17.2 中 XS 模块的 DLL 进行过,现在已扩展到 perl DLL 本身。
使用 VC++ 6.0 构建在 Perl v5.17.2 中意外地被破坏,但现在已修复。
现在可以在 WinCE 上构建,尽管需要更多工作才能完全恢复干净的构建。
为误导性命名的 av_len()
创建了同义词:av_top_index()
和 av_tindex
。这三个都返回数组中最高索引的编号,而不是它包含的元素数量。
SvUPGRADE() 不再是表达式。最初,这个宏(及其底层函数 sv_upgrade())被记录为布尔值,尽管实际上它们在出错时总是会 croak 并且从不返回 false。在 2005 年,文档更新为指定 void 返回值,但 SvUPGRADE() 仍然保留为 1 以保持向后兼容性。现在已删除,SvUPGRADE() 现在是一个没有返回值的语句。
所以现在这是一个语法错误
if (!SvUPGRADE(sv)) { croak(...); }
如果你的代码是这样的,只需将其替换为
SvUPGRADE(sv);
或者为了避免与旧的 perl 编译器产生警告,可能是
(void)SvUPGRADE(sv);
Perl 具有一个新的写时复制机制,允许任何 SvPOK 标量升级为写时复制标量。字符串缓冲区的引用计数存储在字符串缓冲区本身中。此功能**默认情况下未启用**。
它可以通过在运行 Configure 时使用 -Accflags=-DPERL_NEW_COPY_ON_WRITE 在 perl 构建中启用,我们鼓励 XS 作者尝试使用启用了此功能的 perl 运行他们的代码,并提供反馈。不幸的是,目前还没有一个很好的指南来更新 XS 代码以应对 COW。在提供此类文档之前,请咨询 perl5-porters 邮件列表。
它通过允许写时复制标量通过以前从未遇到过的代码路径,破坏了一些 XS 模块。
写时复制不再使用 SvFAKE 和 SvREADONLY 标志。因此,SvREADONLY 表示一个真正的只读 SV。
使用 SvIsCOW 宏(与以前一样)来识别写时复制标量。
PL_glob_index
已消失。
私有 Perl_croak_no_modify 已删除其上下文参数。它现在具有 void 原型。公共 API croak_no_modify 的用户不受影响。
写时复制(共享哈希键)标量不再被标记为只读。SvREADONLY
在此类 SV 上返回 false,但 SvIsCOW
仍然返回 true。
引入了一种新的操作类型 OP_PADRANGE
。perl peephole 优化器将在可能的情况下,用单个 padrange 操作替换一个 pushmark,后跟一个或多个 pad 操作,并且可能还会跳过 list 和 nextstate 操作。此外,该操作可以执行与 my(...) = @_
赋值的 RHS 相关联的任务,因此这些操作也可以被优化掉。
在 [方括号] 字符类中,不区分大小写的匹配与多字符折叠不再排除以前情况下的一种可能性。[perl #89774]。
PL_formfeed
已被移除。
正则表达式引擎不再读取目标字符串末尾之外的一个字节。虽然对于所有内部格式良好的标量来说,这永远不应该是一个问题,但此更改有助于 CPAN 模块中使用字符串缓冲区的巧妙技巧。[perl #73542]。
在 BEGIN 块内部,PL_compcv
现在指向当前正在编译的子例程,而不是 BEGIN 块本身。
mg_length
已被弃用。
sv_len
现在始终返回字节计数,而 sv_len_utf8
返回字符计数。以前,sv_len
和 sv_len_utf8
都有错误,有时会返回字节,有时会返回字符。sv_len_utf8
不再假设其参数为 UTF-8。这些都不会再为绑定或重载的值或非 PV 创建 UTF-8 缓存。
sv_mortalcopy
现在在从 XS 模块调用时复制共享哈希键标量的字符串缓冲区 [perl #79824]。
新的 RXf_MODIFIES_VARS
标志可以由自定义正则表达式引擎设置,以指示正则表达式的执行可能会导致变量被修改。这使 s///
知道要跳过某些优化。Perl 自己的正则表达式引擎为设置 $REGMARK 和 $REGERROR 的特殊回溯动词设置此标志。
访问词法垫的 API 已发生重大变化。
PADLIST
现在不再是 AV
,而是它们自己的类型。PADLIST
现在包含一个 PAD
和一个 PADNAMELIST
的 PADNAME
,而不是 AV
用于垫和垫名称列表。PAD
、PADNAMELIST
和 PADNAME
应该通过新添加的垫 API 访问,而不是通过普通的 AV
和 SV
API。有关详细信息,请参阅 perlapi。
在正则表达式 API 中,编号捕获回调传递一个索引,指示正在访问哪个匹配变量。$`
、$&
、$'
变量有特殊的索引值。以前,相同的三个值也用于检索 ${^PREMATCH}
、${^MATCH}
、${^POSTMATCH}
,但现在它们已被分配了三个单独的值。请参阅 "perlreapi 中的编号捕获回调"。
PL_sawampersand
以前是一个布尔值,指示 $`
、$&
、$'
中的任何一个都被看到;它现在包含三个一位标志,分别指示每个变量的存在。
CV *
类型映射条目现在支持 &{}
重载和类型全局,就像 &{...}
一样 [perl #96872]。
用于指示重载的SVf_AMAGIC
标志现在位于存储区中,而不是对象中。现在,只要方法或 @ISA 发生变化,它就会自动设置,因此它的含义也发生了变化。它现在表示“可能重载”。当计算重载表时,如果不存在重载,该标志会自动关闭,因此应该不会出现明显的减速。
重载表的陈旧性现在在调用重载方法时进行检查,而不是在bless
期间。
“A” 魔法消失了。对SVf_AMAGIC
标志处理的更改消除了对它的需求。
PL_amagic_generation
已被删除,因为它不再需要。对于 XS 模块,它现在是PL_na
的宏别名。
回退重载设置现在存储在与重载本身分开的存储区条目中。
字符处理代码在某些地方已清理。这些更改在操作上应该是不可见的。
study
函数在 v5.16 中被设置为无操作。它只是通过return
语句被禁用;代码保留在原位。现在,支持study
以前所做操作的代码已被删除。
在多线程 Perl 中,不再为每个 COP 分配单独的 PV 来存储其包名称(cop->stashpv
)。相反,有一个偏移量(cop->stashoff
)指向新的PL_stashpad
数组,该数组保存存储区指针。
在可插拔正则表达式 API 中,regexp_engine
结构体获得了一个新的字段op_comp
,它目前仅供 Perl 内部使用,应由其他正则表达式插件模块初始化为 NULL。
一个新的函数alloccopstash
已添加到 API 中,但被认为是实验性的。请参阅perlapi。
Perl 以前以一种方式实现获取魔法,这种方式有时会隐藏代码中的错误,这些代码可能会对魔法值调用太多次的 mg_get()。这种错误隐藏不再发生,因此长期存在的错误现在可能变得可见。如果您在 XS 代码中看到与魔法相关的错误,请检查以确保它以及它使用的 Perl API 函数仅对 SvGMAGICAL() 值调用一次 mg_get()。
CV 的 OP 分配现在使用平板分配器。这简化了为 CV 分配的 OP 的内存管理,因此在编译错误后清理更简单、更安全 [perl #111462][perl #112312]。
PERL_DEBUG_READONLY_OPS
已被重写以使用新的平板分配器,使其能够捕获比以前更多的违规行为。
用于操作的旧的slab分配器,它只在PERL_IMPLICIT_SYS
和PERL_DEBUG_READONLY_OPS
中启用,现已停用。
当here文档终止符出现在文件末尾时,不再需要终止换行符。这在字符串eval的末尾已经是这种情况了 [perl #65838]。
-DPERL_GLOBAL_STRUCT
构建现在会在完成使用后释放全局结构体。
@INC 中路径上的尾部 '/' 将不再追加额外的 '/'。
:crlf
层现在可以在未读数据不适合其自身缓冲区的情况下工作。[perl #112244]。
ungetc()
现在可以处理 UTF-8 编码的数据。[perl #116322]。
核心类型映射中的一个错误导致任何映射到 T_BOOL 核心类型映射条目的 C 类型在 T_BOOL 变量在 OUTPUT: 部分中使用时不会被设置、更新或修改,RETVAL 除外。T_BOOL 在 INPUT: 部分中不受影响。使用 T_BOOL 作为 XSUB 的返回值类型 (RETVAL) 也不受影响。修复此错误的副作用是,如果在 OUTPUT: 部分中指定了 T_BOOL(之前对 SV 没有任何作用),并且将只读 SV(字面量)传递给 XSUB,则会像“尝试修改只读值”一样发出错误信息。[perl #115796]
在许多平台上,提供目录名作为脚本名称会导致 perl 不执行任何操作并报告成功。现在它应该普遍报告错误并退出非零状态。[perl #61362]
在致命警告下,sort {undef} ...
不再崩溃。它在 Perl v5.16 中开始崩溃。
相互祝福的 Stash(bless \%Foo::, 'Bar'; bless \%Bar::, 'Foo'
)不再导致双重释放。此错误从 Perl v5.16 开始出现。
修复了大量内存泄漏,主要涉及致命警告和语法错误。
一些失败的正则表达式匹配,例如 'f' =~ /../g
,没有重置 pos
。此外,“一次匹配”模式 (m?...?g
) 在第二次调用时也未能重置它 [perl #23180]。
修复了几个涉及 local *ISA
和 local *Foo::
导致 MRO 缓存过时的错误。
当子程序的类型全局变量被别名化时,定义子程序不再会导致过时的方法缓存。此错误是在 Perl v5.10 中引入的。
当类型全局变量的包从其父级存储区中删除时,对包含子程序的类型全局变量进行局部化不再产生错误。此错误是在 Perl v5.14 中引入的。
在某些情况下,local *method=...
在作用域退出时无法重置方法缓存。
/[.foo.]/
不再是错误,但会产生警告(与之前一样)并被视为 /[.fo]/
[perl #115818]。
goto $tied_var
现在会在决定此 goto 的类型(子程序或标签)之前调用 FETCH。
通过全局变量赋值(*Foo:: = *Bar::; *Bar:: = *Baz::
)重命名包,并结合 m?...?
和 reset
,不再会导致线程化构建崩溃。
修复了与将列表分配给哈希相关的多个错误。其中许多涉及具有重复键的列表,例如 (1, 1, 1, 1)
。
表达式 scalar(%h = (1, 1, 1, 1))
现在返回 4
,而不是 2
。
%h = (1, 1, 1)
在列表上下文中的返回值是错误的。以前这将返回 (1, undef, 1)
,现在它返回 (1, undef)
。
Perl 现在在 ($s, %h) = (1, {})
上发出与 (%h) = ({})
相同的警告,“在预期偶数大小列表的地方找到引用”。
纠正了列表分配到哈希中的多个附加边缘情况。有关更多详细信息,请参阅提交 23b7025ebc。
应用于词法变量的属性不再泄漏内存。[perl #114764]
dump
、goto
、last
、next
、redo
或 require
后面跟着一个裸词(或版本),然后是一个中缀运算符,不再是语法错误。它曾经是针对那些中缀运算符(如 +
),这些运算符在预期术语的地方具有不同的含义。[perl #105924]
require a::b . 1
和 require a::b + 1
不再产生错误的歧义警告。[perl #107002]
现在允许在任何字符串上调用类方法,而不仅仅是开头是字母数字字符的字符串。[perl #105922]
使用 qr//
在 m///
中创建的空模式不再触发“空模式重用最后一个模式”的行为。[perl #96230]
在迭代期间绑定哈希不再导致内存泄漏。
在迭代期间释放绑定哈希不再导致内存泄漏。
将列表分配给在 STORE 上死亡的绑定数组或哈希不再导致内存泄漏。
如果提示哈希 (%^H
) 相同,则在 FETCH 失败时,编译时作用域条目(它复制提示哈希)不再泄漏内存。[perl #107000]
常量折叠不再不适当地触发特殊的 split " "
行为。[perl #94490]
defined scalar(@array)
、defined do { &foo }
以及类似的构造现在将 defined
的参数视为一个简单的标量。[perl #97466]
运行自定义调试,该调试不定义 *DB::DB
全局变量或为 &DB::DB
提供子例程存根,不再导致崩溃,而是出现错误。[perl #114990]
reset ""
现在与其文档一致。reset
仅在没有参数的情况下重置 m?...?
模式。现在,参数为空字符串将不执行任何操作。(以前它被视为没有参数。)[perl #97958]
printf
带有返回空列表的参数不再读取堆栈末尾,从而导致行为不稳定。[perl #77094]
--subname
不再产生错误的歧义警告。[perl #77240]
v10
现在允许作为标签或包名。当 Perl v5.6 中添加 v 字符串时,这被意外地破坏了。[perl #56880]
如果此类字符串化的内部表示形式更改为或从 UTF-8,则 length
、pos
、substr
和 sprintf
可能被绑定、重载、引用和类型全局变量混淆。[perl #114410]
utf8::encode 现在在绑定变量上调用 FETCH 和 STORE。utf8::decode 现在调用 STORE(它已经调用 FETCH)。
$tied =~ s/$non_utf8/$utf8/
如果绑定变量返回 Latin-1 字符串、共享哈希键标量或引用或类型全局变量,这些字符串化结果为 ASCII 或 Latin-1,则不再无限循环。这是从 v5.12 开始的回归。
s///
不带 /e 现在更善于检测何时需要放弃某些优化,修复了一些错误的情况
替换部分中的某些构造(&&
、||
、..
等)中的匹配变量;例如,s/(.)/$l{$a||$1}/g
。[perl #26986]
替换中的匹配变量的别名。
替换中的 $REGERROR
或 $REGMARK
。[perl #49190]
导致使用最后一个成功模式的空模式 (s//$foo/
),当该模式包含修改替换中变量的代码块时。
替换字符串的污染性不再影响 s///e
的返回值的污染性。
$|
自动刷新变量在需要时动态创建。如果发生这种情况(例如,如果它在模块或 eval 中被提及),而当前选择的句柄是一个带有空 IO 槽的类型全局变量,它以前会崩溃。[perl #115206]
字符串 eval 末尾的行号不再偏离一个。[perl #114658]
@INC 过滤器(@INC 中子例程返回的子例程)将 $_ 设置为一个写时复制标量,不再导致解析器就地修改该字符串缓冲区。
length($object)
现在不再返回未定义的值,即使对象有返回 undef 的字符串重载。[perl #115260]
PL_stashcache
的使用,即方法调用时的 stash 名称查找缓存,已被恢复。
2011 年 8 月的提交 da6b625f78f5f133 无意中破坏了查找 PL_stashcache
中值的代码。由于它只是一个缓存,所以一切都在没有它的情况下继续工作,这是正确的。
"Can't localize through a reference" 错误在 v5.16.0 中消失了,当时 local %$ref
出现在 lvalue 子例程的最后一行。这个错误在 perl v5.8.1 中针对 \local %$ref
消失了。现在它已被恢复。
here-doc 的解析已得到显著改进,修复了几个解析错误和崩溃以及一个内存泄漏,并在某些情况下修正了错误的后续行号。
在 eval 内部,未终止的 here-doc 的错误消息不再在中间有换行符 [perl #70836]。
替换模式内的替换 (s/${s|||}//
) 不再使解析器混淆。
允许注释的地方可能很奇怪,但 s//"" # hello/e
一直有效,除非第一个 # 之前碰巧有一个空字符。现在即使在存在空字符的情况下它也能正常工作。
tr///
或 y///
中的无效范围不再导致内存泄漏。
字符串 eval 不再将末尾的分号分隔的引号类运算符 (eval 'q;;'
) 视为语法错误。
warn {$_ => 1} + 1
不再是语法错误。解析器过去常常对某些列表运算符后跟匿名哈希,然后是与一元运算符形式相同的二元运算符感到困惑。
(caller $n)[6]
(它提供 eval 的文本)过去会返回实际的解析器缓冲区。修改它可能会导致崩溃。现在它始终返回一个副本。返回的字符串不再在末尾附加 "\n;"。返回的文本还包括 here-doc 主体,这些主体过去被省略。
当访问魔法变量时,UTF-8 位置缓存现在被重置,以避免字符串缓冲区和 UTF-8 位置缓存不同步 [perl #114410]。
已修复针对魔法 UTF-8 字符串调用两次 get magic 的各种情况。
这段代码(当不存在 $&
等时)
$_ = 'x' x 1_000_000;
1 while /(.)/;
以前为了性能原因,会跳过缓冲区复制,但如果原始字符串发生变化,$1
等就会受到影响。现在这个问题已经修复了。
Perl 不再使用 PerlIO 来报告内存不足消息,因为 PerlIO 可能会尝试分配更多内存。
在正则表达式中,如果某个东西被量化为 {n,m}
且 n > m
,它就不可能匹配。以前这会导致致命错误,但现在只是警告(并且该东西不会匹配)。[perl #82954]。
以前,在子程序中定义的格式,如果该子程序随后被取消定义并重新定义,可能会错误地闭包到错误的 pad(新定义的封闭子程序)中的变量,从而导致崩溃或“奇怪的复制”错误。
在运行时重新定义 XSUB 可能会产生带有错误行号的警告。
%vd
sprintf 格式不支持 alpha 版本的版本对象。以前,当传递 alpha 版本时,它会输出格式本身(%vd),还会发出“printf 中的无效转换”警告。现在它不再这样做,而是输出空字符串。它在这种情况下也不再泄漏内存。
在主包中,$obj->SUPER::method
调用可能会失败,如果 SUPER 包已经通过其他方式被访问过。
Stash 别名(*foo:: = *bar::
)不再导致 SUPER 调用忽略对方法或 @ISA 的更改,或使用错误的包。
对名称以 ::SUPER 结尾的包进行方法调用不再被视为 SUPER 方法调用,导致无法找到该方法。此外,在这些包中定义子程序不再会导致它们被包含包的 SUPER 方法调用找到 [perl #114924]。
\w
现在匹配代码点 U+200C(零宽度非连接符)和 U+200D(零宽度连接符)。\W
不再匹配这些。这种变化是因为 Unicode 修正了它们对 \w
应该匹配内容的定义。
dump LABEL
不再泄漏其标签。
常量折叠不再改变像 stat()
和 truncate()
这样的函数的行为,这些函数可以接受文件名或句柄。stat 1 ? foo : bar
现在将它的参数视为文件名(因为它是一个任意表达式),而不是句柄“foo”。
truncate FOO, $len
不再在句柄被删除后回退到将“FOO”视为文件名。这在 Perl v5.16.0 中被破坏了。
在子程序到全局变量和全局变量到全局变量的赋值之后,子程序的重新定义不再导致双重释放或恐慌消息。
s///
现在在执行替换时将 vstring 转换为普通字符串,即使结果字符串相同(s/a/a/
)。
原型不匹配警告不再错误地将常量子程序视为没有原型,而实际上它们有“”。
常量子程序和前向声明不再阻止原型不匹配警告省略子程序名称。
undef
在子程序上现在会清除调用检查器。
ref
运算符在 Perl v5.16.0 中开始在祝福对象上泄漏内存。这个问题已经修复 [perl #114340]。
use
现在不再尝试将它的参数解析为语句,这使得 use constant { () };
成为语法错误 [perl #114222]。
在调试版本中,格式内部的“未初始化”警告不再导致断言失败。
在调试版本中,嵌套在格式内部的子程序不再导致断言失败 [perl #78550]。
现在允许在格式内部使用格式和 use
语句。
print $x
和 sub { print $x }->()
现在始终产生相同的输出。以前,如果变量未激活,则后者可能会拒绝闭包 $x;例如,如果它是在当前运行的命名子程序之外定义的。
类似地,print $x
和 print eval '$x'
现在产生相同的输出。这也允许在调试器中看到“my $x if 0”变量 [perl #114018]。
递归调用的格式不再覆盖它们自己的词法变量,而是每个递归调用都有自己的一组词法变量。
尝试释放活动格式或与其关联的句柄不再导致崩溃。
格式解析不再被大括号、分号和低优先级运算符混淆。以前可以使用大括号作为格式分隔符(而不是 =
和 .
),但只在某些情况下。格式参数行中的分号和低优先级运算符不再混淆解析器,导致忽略该行的返回值。在格式参数行中,大括号现在可以用于匿名哈希,而不是始终被视为 do
块。
格式现在可以嵌套在正则表达式和其他引用的结构中的代码块中 (/(?{...})/
和 qq/${...}/
) [perl #114040]。
编译错误后不再创建格式。
在调试版本中,-DA 命令行选项在 Perl v5.16.0 中开始崩溃。它已被修复 [perl #114368]。
已修复涉及在启用 ithreads 的 Windows 版本中过早终止伪分叉子进程的潜在死锁场景。这解决了 t/op/fork.t 测试在 Windows 上挂起的常见问题 [perl #88840]。
从 require()
生成错误的代码可能会在文件名开始之前读取一到两个字节,对于长度小于三个字节且以 /\.p?\z/
结尾的文件名。这现在已修复。请注意,无论如何,对于传递给 use()
或 require()
的模块名称,这种情况永远不会发生。
传递给 require()
的模块路径名的处理在 VMS 上已变得线程安全。
VMS 上的非阻塞套接字已修复。
现在可以在引号结构中代码内部嵌套 Pod,该结构位于字符串 eval 之外。以前这只能在字符串 eval 中使用 [perl #114040]。
goto ''
现在会查找空标签,并产生“goto 必须有标签”错误消息,而不是退出程序 [perl #111794]。
goto "\0"
现在会因“找不到标签”而死亡,而不是“goto 必须有标签”。
C 函数 hv_store
在 %^H
上使用时会导致崩溃 [perl #111000]。
通过 cv_set_call_checker
附加到闭包原型上的调用检查器现在会被复制到从其克隆的闭包中。因此,cv_set_call_checker
现在可以在闭包的属性处理程序中使用。
写入 $^N
以前没有效果。现在它默认情况下会因“修改只读值”而报错,但可以通过自定义正则表达式引擎覆盖,就像 $1
一样 [perl #112184]。
对控制字符 glob(undef *^H
)进行 undef
操作不再发出关于歧义的错误警告 [perl #112456]。
为了提高效率,许多运算符和内置函数每次都返回相同的标量。左值子例程和 CORE:: 命名空间中的子例程允许这种实现细节泄漏。print &CORE::uc("a"), &CORE::uc("b")
以前会打印“BB”。左值子例程返回 uc
的返回值时也会发生同样的事情。现在,在这种情况下会复制该值。
method {}
语法,其中包含空块或返回空列表的块,以前会崩溃或使用堆栈上留下的某个随机值作为其调用者。现在它会产生错误。
vec
现在可以使用极大的偏移量(>2 GB) [perl #111730]。
对重载设置的更改现在会立即生效,对影响重载的继承的更改也是如此。以前它们只会在 bless
后生效。
在类使用任何重载之前创建的对象,即使该类通过use overload
或@ISA更改获得了重载,甚至在bless
之后,也仍然不会被重载。此问题已修复 [perl #112708]。
具有重载的类现在可以继承回退值。
如果在赋值运算符(如+=
)的两侧都有重载对象,则重载不会尊重回退值为 0 [perl #111856]。
pos
现在对哈希和数组参数发出错误信息,而不是产生错误警告。
while(each %h)
现在隐含while(defined($_ = each %h))
,类似于readline
和readdir
。
在CORE::
命名空间中的子程序在undef *_
之后,如果使用无参数列表调用(&CORE::time
没有括号),将不再崩溃。
unpack
在数据有误时不再产生“'/' must follow a numeric type in unpack”错误 [perl #60204]。
join
和"@array"
现在只对绑定的$"
调用FETCH一次 [perl #8931]。
编译受CORE::GLOBAL
覆盖影响的核心操作生成的某些子程序调用,进行了两次操作检查。对于纯 Perl 代码,检查始终是幂等的,但当涉及自定义调用检查器时,双重检查可能很重要。
在 fork 附近存在一个竞争条件,可能导致发送到父进程的信号被父进程和子进程都处理。现在在 fork 附近短暂地阻塞信号,以防止这种情况发生 [perl #82580]。
正则表达式中代码块的实现,例如(?{})
和(??{})
,已被彻底重写以消除大量错误。主要的用户可见更改是
模式内的代码块现在与周围代码在同一遍中解析;特别是,不再需要平衡括号:现在可以工作
/(?{ $x='{' })/
这意味着不再生成此错误消息
Sequence (?{...}) not terminated or not {}-balanced in regex
但可能会看到一个新的错误
Sequence (?{...}) not terminated with ')'
此外,运行时模式内的文字代码块只编译一次,在 perl 编译时
for my $p (...) {
# this 'FOO' block of code is compiled once,
# at the same time as the surrounding 'for' loop
/$p{(?{FOO;})/;
}
词法变量现在在作用域、递归和闭包行为方面是合理的。特别是,/A(?{B})C/
的行为(从闭包的角度来看)与 /A/ && do { B } && /C/
完全相同,而 qr/A(?{B})C/
则类似于 sub {/A/ && do { B } && /C/}
。因此,这段代码现在按预期工作,创建了三个匹配 0、1 和 2 的正则表达式。
for my $i (0..2) {
push @r, qr/^(??{$i})$/;
}
"1" =~ $r[1]; # matches
use re 'eval'
现在仅在运行时定义的代码块中需要;特别是在以下情况下,$r
模式的文本仍然会插入到新模式中并重新编译,但 $r
中的各个编译代码块会被重用而不是重新编译,并且不再需要 use re 'eval'
。
my $r = qr/abc(?{....})def/;
/xyz$r/;
流程控制运算符不再崩溃。每个代码块都在新的动态作用域中运行,因此 next
等不会看到任何封闭循环。return
从代码块返回一个值,而不是从任何封闭子例程返回。
Perl 通常会缓存运行时模式的编译,并且如果模式没有改变,就不会重新编译,但如果闭包的正确行为需要,现在会禁用此功能。例如
my $code = '(??{$x})';
for my $x (1..3) {
# recompile to see fresh value of $x each time
$x =~ /$code/;
}
/msix
和 (?msix)
等标志现在会传播到 (??{})
的返回值中;现在可以工作了
"AB" =~ /a(??{'b'})/i;
警告和错误将看起来来自周围的代码(或对于运行时代码块,来自 eval),而不是来自 re_eval
use re 'eval'; $c = '(?{ warn "foo" })'; /$c/;
/(?{ warn "foo" })/;
以前给出
foo at (re_eval 1) line 1.
foo at (re_eval 2) line 1.
现在给出
foo at (eval 1) line 1.
foo at /some/prog line 2.
Perl 现在可以重新编译以使用任何 Unicode 版本。在 v5.16 中,它适用于 Unicode 6.0 和 6.1,但如果使用早期版本,则存在各种错误;版本越旧,问题越多。
vec
在左值上下文中不再产生“未初始化”警告 [perl #9423]。
涉及正则表达式中固定字符串的优化可能会在极端情况下导致严重的性能下降。这个问题已经修复 [perl #76546]。
在某些情况下,包括正则表达式中的空子模式(例如 (?:)
或 (?:|)
)可能会禁用某些优化。这个问题已经修复。
prototype
在传递类似“CORE::nonexistent_keyword”的字符串时产生的“找不到操作码”消息现在会将 UTF-8 和嵌入的 NUL 传递不变 [perl #97478]。
prototype
现在在检查 CORE:: 前缀时,将像 $1
这样的魔法变量与非魔法变量相同,而不是将它们视为子例程名称。
在多线程 Perl 中,正则表达式中的运行时代码块可能会破坏操作树中存储的包名称,导致 caller
中出现错误读取,并可能导致崩溃 [perl #113060]。
引用闭包原型(在闭包的属性处理程序中使用 \&{$_[1]}
)不再导致复制子例程(或在调试版本上断言失败)。
eval '__PACKAGE__'
现在在多线程构建中返回正确的结果,如果当前包已被赋值(如 *ThisPackage:: = *ThatPackage::
)[perl #78742]。
如果一个包被它调用的代码删除,caller
可能看到属于该已删除包的堆栈帧。如果存储区的内存地址被重新用于一个标量,并且对同一个标量执行了替换,caller
可能会崩溃 [perl #113486]。
UNIVERSAL::can
不再根据其第一个参数是字符串还是数字在内部进行不同的处理。
open
使用 <&
作为模式检查,以确定第三个参数是否为数字,从而确定将其视为文件描述符还是句柄名称。像 $1
这样的魔法变量总是无法通过数字检查,并且被视为句柄名称。
warn
对魔法变量($1
,绑定)的处理进行了多项修复。FETCH
现在只在绑定参数或绑定 $@
上调用一次 [perl #97480]。返回字符串化为 "" 的对象的绑定变量不再被忽略。一个绑定 $@
,它碰巧在上次使用时返回了一个引用,不再被忽略。
warn ""
现在以相同的方式处理包含数字的 $@
,无论它是通过 $@=3
还是 $@="3"
发生的。它以前忽略前者。现在它附加 "\t...caught",就像它一直对 $@="3"
所做的那样。
魔法变量上的数字运算符(例如 $1 + 1
)以前使用浮点运算,即使整数运算更合适,也会导致 64 位平台上的精度损失 [perl #109542]。
一元否定不再将字符串视为数字,即使该字符串碰巧在某个时候被用作数字。因此,如果 $x
包含字符串 "dogs",-$x
返回 "-dogs",即使 $y=0+$x
在某个时候发生过。
在 Perl v5.14 中,-'-10'
被修复为返回 "10",而不是 "+10"。但是魔法变量($1
,绑定)直到现在才被修复 [perl #57706]。
一元否定现在一致地处理字符串,无论内部 UTF8
标志如何。
在 Perl v5.16.0 中引入的涉及 tr/SEARCHLIST/REPLACEMENTLIST/
的回归已修复。如果一个字符在 SEARCHLIST
中出现多次,则只有第一个实例才是有意义的。在某些情况下,最后一个实例会覆盖所有之前的实例。[perl #113584]
像 qr/\87/
这样的正则表达式以前会静默地插入一个 NUL 字符,因此匹配就像它被写成 qr/\00087/
一样。现在它匹配就像它被写成 qr/87/
一样,并显示一条消息,指出序列 "\8"
未被识别。
__SUB__
现在可以在特殊块(BEGIN
、END
等)中使用。
在 Windows 上,如果在 BEGIN
块中创建线程,理论上可能会导致崩溃。虽然它仍然无法正常工作,但它不再崩溃 [perl #111610]。
\&{''}
(使用空字符串)现在会像其他子程序名称一样自动创建存根,不再产生“无法创建子程序”错误 [perl #94476]。
已修复 v5.14.0 中引入的回归,其中对 re
模块的一些调用会覆盖 $_
[perl #113750]。
do FILE
现在始终设置或清除 $@
,即使文件无法读取。这确保了首先测试 $@
(如文档中推荐的那样)始终返回正确的结果。
用于 each @array
结构的数组迭代器现在在 @array
被清除时会正确重置 [perl #75596]。例如,当数组被全局赋值时,例如 @array = (...)
,但当它的**值**被赋值时则不会。在 XS API 方面,这意味着 av_clear()
现在将重置迭代器。
这反映了哈希迭代器在哈希被清除时的行为。
$class->can
、$class->isa
和 $class->DOES
现在返回正确的结果,无论 $class
所指的包是否存在 [perl #47113]。
到达的信号不再清除 $@
[perl #45173]。
允许使用空变量列表的 my ()
声明 [perl #113554]。
在解析过程中,在错误后声明的子程序不再留下存根 [perl #113712]。
不包含字符串 eval 的闭包不再保留其包含的子程序,允许外部子程序闭包的变量在外部子程序被释放时被释放,即使内部子程序仍然存在 [perl #89544]。
通过使用“<&=” 或 “>&=” 模式打开来复制内存中的文件句柄在 v5.16.0 中停止正常工作。它会导致新句柄引用不同的标量变量。此问题已修复 [perl #113764]。
qr//
表达式不再在没有在正则表达式编译时设置 offs
的自定义正则表达式引擎中崩溃 [perl #112962]。
delete local
在某些魔法数组和哈希中不再崩溃 [perl #112966]。
某些魔法数组和哈希的元素上的 local
以前不会安排在作用域退出时删除元素,即使元素在 local
之前不存在。
scalar(write)
不再返回多个项目 [perl #73690]。
字符串到浮点数的转换在 use locale
下不再错误解析某些字符串 [perl #109318]。
@INC
过滤器在死亡时不再泄漏内存 [perl #92252]。
重载操作的实现现在在正确的上下文中被调用。这允许,除其他事项外,能够正确地覆盖 <>
[perl #47119]。
在调用 use overload
时仅指定 fallback
键现在行为正常 [perl #113010]。
sub foo { my $a = 0; while ($a) { ... } }
和 sub foo { while (0) { ... } }
现在返回相同的内容 [perl #73618]。
在use integer;
下,字符串否定现在与不使用它时的行为相同 [perl #113012]。
chr
现在返回 Unicode 替换字符 (U+FFFD) 用于 -1,无论内部表示如何。如果参数被绑定或内部为字符串,-1 以前会包装。
从 perl v5.12.0 开始,在封闭子例程被释放后使用format
可能会崩溃,如果该格式引用了外部子例程的词法变量。
从 perl v5.10.0 开始,在封闭子例程被取消定义后使用format
可能会崩溃,如果该格式引用了外部子例程的词法变量。
在闭包内定义的format
,该格式引用了外部的词法变量,除非write
调用直接在闭包内,否则从未真正起作用。在 v5.10.0 中,它甚至开始崩溃。现在使用最靠近调用栈顶部的闭包副本查找这些变量。
如果在特殊块编译之前存在与特殊块同名的存根,则在特殊块中关闭变量的格式将不再崩溃。
解析器不再感到困惑,将eval foo ()
视为语法错误,如果它前面有print;
[perl #16249]。
syscall
的返回值在 64 位平台上不再被截断 [perl #113980]。
常量折叠不再导致print 1 ? FOO : BAR
打印到 FOO 处理程序 [perl #78064]。
do subname
现在调用命名子例程并使用它返回的文件名,而不是打开名为“subname”的文件。
由 rv2cv 检查钩子(由 XS 模块注册)查找的子例程现在在确定foo bar
应该是子例程调用foo(bar)
还是方法调用"bar"->foo
时被考虑在内。
CORE::foo::bar
不再被特殊对待,允许通过CORE::GLOBAL::uc(...)
直接调用全局覆盖 [perl #113016]。
调用类型全局已被取消定义的未定义子例程现在会产生通常的“未定义子例程调用”错误,而不是“不是 CODE 引用”。
修复了两个与 @ISA 相关的错误。*ISA = *glob_without_array
和 undef *ISA; @{*ISA}
会阻止对 @ISA 的未来修改更新用于查找方法的内部缓存。*glob_without_array 情况是 Perl v5.12 的回归。
正则表达式优化有时会导致 $
与 /m
产生失败或不正确的匹配 [perl #114068]。
__SUB__
现在可以在 sort
块中工作,前提是封闭子例程使用 sub foo;
语法预先声明 [perl #113710]。
Unicode 属性仅适用于 Unicode 代码点,这在正则表达式与高于 Unicode 代码点的字符匹配时会导致一些细微差别。会生成一个警告来提醒您注意这一点。但是,此警告在某些情况下会不适当地生成,例如在解析程序时。非 Unicode 匹配,例如 \w
和 [:word:]
,不应该生成警告,因为它们的定义不限制它们仅适用于 Unicode 代码点。现在,只有在与 \p{}
和 \P{}
匹配时才会生成消息。仍然存在一个错误 [perl #114148],针对 Unicode 中极少数仅匹配单个代码点的属性。如果它们与高于 Unicode 代码点的字符匹配,则不会生成警告。
由于一个 off-by-one 错误,未初始化警告提及哈希元素只会提及元素名称,前提是它不在哈希的第一个桶中。
一个正则表达式优化错误会导致多行 "^" 在存在换行符的情况下表现不正确,例如 "/\n\n" =~ m#\A(?:^/$)#im
不会匹配 [perl #115242]。
列表上下文中失败的 fork
不会再破坏堆栈。@a = (1, 2, fork, 3)
以前会吞噬 2 并分配 (1, undef, 3)
,如果 fork
调用失败。
修复了大量内存泄漏,主要涉及死亡的绑定变量、正则表达式字符类和代码块以及语法错误。
将正则表达式 (${qr//}
) 分配给恰好包含浮点数的变量不再会导致调试版本的断言失败。
将正则表达式分配给包含数字的标量不再会导致后续的数字化产生随机数。
将正则表达式分配给魔法变量不再会清除魔法。这是从 v5.10 回归的错误。
将正则表达式分配给已祝福的标量不再会导致崩溃。这也是从 v5.10 回归的错误。
正则表达式现在可以分配给绑定哈希和数组元素,并进行扁平化成字符串。
将正则表达式数字化不再会导致未初始化警告。
负数组索引不再会导致绑定变量的 EXISTS 方法被忽略。这是从 v5.12 回归的错误。
负数组索引不再会导致与非对象绑定的数组崩溃。
$byte_overload .= $utf8
不会再导致双重编码的 UTF-8,即使左侧标量在上次调用重载时恰好生成了 UTF-8 字符串。
goto &sub
现在使用 @_ 的当前值,而不是使用子程序最初被调用的数组。这意味着 local @_ = (...); goto &sub
现在可以工作 [perl #43077]。
如果调试器被递归调用,它不再会覆盖它自己的词法变量。以前在递归下,所有调用将共享相同的词法变量集 [perl #115742]。
从子程序返回的 *_{ARRAY}
不再会自发地变为空。
当使用 say
打印到绑定的文件句柄时,$\
的值会被正确地局部化,即使它之前是未定义的。[perl #119927]
HP-UX 11.00 上 %ENV
中的 UTF8 标记字符串存在错误
HP-UX 11.00 上 UTF8 标记字符串与 %ENV
的交互目前在某些尚未完全诊断的方式下很糟糕。预计在 t/op/magic.t 中会出现测试失败,然后在环境中存储宽字符时会出现未知行为。
来自韩国首尔的 24 岁的 Yoon Hojung (AMORETTE) 于 2013 年 5 月 8 日与一只羊驼雕像和一张签名的 TIMTOADY 卡片一起长眠。他是一位才华横溢的年轻 Perl 5 & 6 黑客,也是 Seoul.pm 的忠实成员。他编写 Perl,谈论 Perl,吃 Perl,热爱 Perl。我们相信他仍然在某个地方用他坏掉的 IBM 笔记本电脑编写 Perl 程序。我们会想念他。
Perl v5.18.0 代表了自 Perl v5.16.0 以来大约 12 个月的开发,包含来自 113 位作者的 2,100 个文件中的大约 400,000 行更改。
得益于充满活力的用户和开发人员社区,Perl 继续在它的第三个十年蓬勃发展。以下人员已知为 Perl v5.18.0 的改进做出了贡献
Aaron Crane, Aaron Trevena, Abhijit Menon-Sen, Adrian M. Enache, Alan Haggai Alavi, Alexandr Ciornii, Andrew Tam, Andy Dougherty, Anton Nikishaev, Aristotle Pagaltzis, Augustina Blair, Bob Ernst, Brad Gilbert, Breno G. de Oliveira, Brian Carlson, Brian Fraser, Charlie Gonzalez, Chip Salzenberg, Chris 'BinGOs' Williams, Christian Hansen, Colin Kuskie, Craig A. Berry, Dagfinn Ilmari Mannsåker, Daniel Dragan, Daniel Perrett, Darin McBride, Dave Rolsky, David Golden, David Leadbeater, David Mitchell, David Nicol, Dominic Hargreaves, E. Choroba, Eric Brine, Evan Miller, Father Chrysostomos, Florian Ragwitz, François Perrad, George Greer, Goro Fuji, H.Merijn Brand, Herbert Breunung, Hugo van der Sanden, Igor Zaytsev, James E Keenan, Jan Dubois, Jasmine Ahuja, Jerry D. Hedden, Jess Robinson, Jesse Luehrs, Joaquin Ferrero, Joel Berger, John Goodyear, John Peacock, Karen Etheridge, Karl Williamson, Karthik Rajagopalan, Kent Fredric, Leon Timmermans, Lucas Holt, Lukas Mai, Marcus Holland-Moritz, Markus Jansen, Martin Hasch, Matthew Horsfall, Max Maischein, Michael G Schwern, Michael Schroeder, Moritz Lenz, Nicholas Clark, Niko Tyni, Oleg Nesterov, Patrik Hägglund, Paul Green, Paul Johnson, Paul Marquess, Peter Martini, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Rhesa Rozendaal, Ricardo Signes, Robin Barker, Ronald J. Kimball, Ruslan Zakirov, Salvador Fandiño, Sawyer X, Scott Lanning, Sergey Alekseev, Shawn M Moore, Shirakata Kentaro, Shlomi Fish, Sisyphus, Smylers, Steffen Müller, Steve Hay, Steve Peters, Steven Schubiger, Sullivan Beck, Sven Strickroth, Sébastien Aperghis-Tramoni, Thomas Sibley, Tobias Leich, Tom Wyant, Tony Cook, Vadim Konoval, Vincent Pit, Volker Schatz, Walt Mankowski, Yves Orton, Zefram.
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的贡献者(非常感谢)的姓名。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可以查看最近发布到 comp.lang.perl.misc 新闻组和 http://rt.perl.org/perlbug/ 上的 Perl 错误数据库的文章。Perl 主页 https://www.perl5.cn/ 上也可能有一些信息。
如果您认为您遇到了未报告的错误,请运行随您的版本一起提供的 perlbug 程序。请务必将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
如果您要报告的错误具有安全隐患,使其不适合发送到公开存档的邮件列表,那么请将其发送到 [email protected]。这指向一个封闭的订阅未存档邮件列表,其中包括所有核心提交者,他们将能够帮助评估问题的影响,找出解决方案,并帮助协调在 Perl 支持的所有平台上发布补丁以减轻或解决问题。请仅将此地址用于 Perl 核心中的安全问题,而不是用于独立分发在 CPAN 上的模块。
Changes 文件,了解如何查看有关更改内容的详尽详细信息。
INSTALL 文件,了解如何构建 Perl。
README 文件,了解一般信息。
Artistic 和 Copying 文件,了解版权信息。