perl5280delta - perl v5.28.0 的新增功能
本文档描述了 5.26.0 版本和 5.28.0 版本之间的差异。
如果您要从早期版本(例如 5.24.0)升级,请先阅读 perl5260delta,其中描述了 5.24.0 和 5.26.0 之间的差异。
更改列表位于 http://www.unicode.org/versions/Unicode10.0.0。
delete
用于键/值哈希切片delete
现在可用于 键/值哈希切片,返回键及其已删除的值。 [GH #15982]
如果您发现难以记住如何编写某些模式断言,现在可以使用字母同义词。
CURRENT NEW SYNONYMS
------ ------------
(?=...) (*pla:...) or (*positive_lookahead:...)
(?!...) (*nla:...) or (*negative_lookahead:...)
(?<=...) (*plb:...) or (*positive_lookbehind:...)
(?<!...) (*nlb:...) or (*negative_lookbehind:...)
(?>...) (*atomic:...)
这些断言被视为实验性功能,因此使用任何这些断言都会引发(除非已关闭)experimental::alpha_assertions
类别中的警告。
字符串中混合使用脚本(例如西里尔字母和拉丁字母)通常是欺骗攻击的标志。现在,一种新的正则表达式结构允许轻松检测这些脚本。例如,您可以说
qr/(*script_run: \d+ \b )/x
匹配的数字将全部来自同一组 10 个数字。您不会从具有不同于其外观值的不同脚本中获得相似的数字。
或者
qr/(*sr: \b \w+ \b )/x
确保所有字符都来自同一脚本。
您还可以将脚本运行与 (?>...)
(或 *atomic:...)
)结合使用。
不要编写
(*sr:(?<...))
现在您可以运行
(*asr:...)
# or
(*atomic_script_run:...)
这被视为实验性功能,因此使用它会引发(除非已关闭)experimental::script_run
类别中的警告。
perl -i
进行就地编辑更安全了以前,只要您开始处理新文件,就地编辑 (perl -i
) 就会删除或重命名输入文件。
如果没有备份,当写入输出文件时,如果出现错误(例如磁盘已满),这会导致数据丢失。
这种情况已经改变,现在只有在输出文件完全写入并成功关闭后,才会替换输入文件。
该操作通过在同一目录中创建一个工作文件来实现,一旦输出文件完成,该工作文件就会重命名为输入文件。
不兼容性
由于此重命名只需要发生一次,因此如果您创建线程或子进程,则该重命名只会发生在原始线程或进程中。
如果您在处理文件时更改目录,并且您的操作系统不提供 unlinkat()
、renameat()
和 fchmodat()
函数,则最终重命名步骤可能会失败。
现在可以通过表达式(例如 state @a = qw(x y z)
)初始化持久词法数组或哈希变量。仍然无法初始化持久词法变量的列表。
在 inode 号码类型大于 perl 的本机整数数值类型的平台上,stat 将通过以十进制数字字符串的形式返回 inode 号码来保留大型 inode 号码的全部内容。因此,可以通过使用 eq
而不是 ==
进行比较来实现 inode 号码的精确比较。使用 ==
进行比较以及其他数值运算(这些运算通常对 inode 号码没有意义)的效果与以前一样,也就是说它们会退回到浮点数,并最终对相当无用的舍入 inode 号码进行运算,如果真正的 inode 号码对于浮点数格式来说太大。
sprintf
%j
格式大小修饰符现可用于 C99 前编译器实际使用的尺寸取决于平台,因此仍然不可移植。
在打开文件描述符时,perl 现在通常在支持这样做的平台上打开它,其关闭时执行标志已设置。这提高了线程安全性,因为这意味着由一个线程发起的 exec
不再可能导致另一个线程正在打开的文件描述符意外传递给已执行的程序。
此外,perl 现在更可靠地设置关闭时执行标志,无论是否以原子方式进行。大多数文件描述符都设置了标志,但有些被遗漏了。
Perl 5.22 中引入的新字符串特定 (&. |. ^. ~.
) 和数字特定 (& | ^ ~
) 按位运算符在 use feature 'bitwise'
范围内可用,不再是实验性的。由于数字特定运算符的拼写方式与根据其操作数选择其行为的现有运算符相同,因此这些运算符仍必须通过“按位”功能启用,这两种方式之一
use feature "bitwise";
use v5.28; # "bitwise" now included
它们现在也通过 -E 命令行开关启用。
“按位”功能不再发出警告。禁用该功能以前使用的“实验性::按位”警告类别的现有代码将继续工作。
模块作者应该注意的一个警告是,数字运算符现在将第五个 TRUE 参数传递给重载方法。任何检查操作数数量的方法如果超出预期,都可能崩溃。特别是 XS 作者应该意识到这一点
SV *
bitop_handler (lobj, robj, swap)
可能需要将其更改为
SV *
bitop_handler (lobj, robj, swap, ...)
这些系统包括从 Visual Studio 2005 开始的 Windows 以及 POSIX 2008 系统。
这意味着你现在可以自由地在多线程环境中使用区域设置并更改它们。你的更改只影响你的线程。请参阅 perllocale 中的“多线程操作”
${^SAFE_LOCALES}
如果 Perl 解释器在可以安全使用和更改区域设置的环境中运行,则此变量为 1(请参阅 perllocale。)当 perl 未多线程或在支持线程安全区域设置操作的平台上编译时,此变量为 true(请参阅上一项)。
使用不区分大小写的修饰符编译某些正则表达式模式可能会导致堆缓冲区溢出并使 perl 崩溃。此问题现已修复。 [GH #16021]
对于正则表达式模式中的某些类型的语法错误,错误消息可能包含随机、可能较大的内存块的内容,或者可能使 perl 崩溃。此问题现已修复。 [GH #16025]
$ENV{$key}
堆栈缓冲区溢出在 Windows 上Windows 上 %ENV
代码中可能的堆栈缓冲区溢出已通过完全删除缓冲区得到修复,因为该缓冲区本来就是多余的。 [GH #16051]
Perl 5.28.0 弃用了各种旧哈希函数,因为这些函数在 Perl 中的使用被认为不够安全。我们现在支持四种通用哈希函数、Siphash(2-4 和 1-3 变体)和 Zaphod32 以及 StadtX 哈希。此外,我们还支持 SBOX32(一种表格哈希形式)来哈希短字符串,并与提供的任何其他哈希函数结合使用。
默认情况下,Perl 被配置为支持对最多 24 个字符的字符串进行 SBOX 哈希,并结合在 64 位版本上使用 StadtX 哈希,在 32 位版本上使用 Zaphod32 哈希。
您可以使用以下选项来控制这些设置以进行配置
-DPERL_HASH_FUNC_SIPHASH
-DPERL_HASH_FUNC_SIPHASH13
-DPERL_HASH_FUNC_STADTX
-DPERL_HASH_FUNC_ZAPHOD32
要禁用 SBOX 哈希,您可以使用
-DPERL_HASH_USE_SBOX32_ALSO=0
要设置使用 SBOX32 哈希的最大长度,可以使用
-DSBOX32_MAX_LEN=16
允许的最大长度为 256。将其设置为高于默认值可能没什么意义。
实验性子例程签名功能已更改,因此子例程属性现在必须在签名之前而不是之后出现。这是因为诸如 :lvalue
之类的属性会影响签名中代码的编译,例如
sub f :lvalue ($a = do { $x = "abc"; return substr($x,0,1)}) { ...}
请注意这是它们第二次被翻转
sub f :lvalue ($a, $b) { ... }; # 5.20; 5.28 onwards
sub f ($a, $b) :lvalue { ... }; # 5.22 - 5.26
不再允许省略传递给格式的变量之间的逗号。这已从 Perl 5.000 开始弃用。
:locked
和 :unique
属性已删除这些属性已成为无操作,并分别从 Perl 5.12 和 5.10 开始弃用。
\N{}
现在是非法的这已从 Perl 5.24 开始弃用。
使用 open()
和 opendir()
将文件句柄和目录句柄同时关联到同一符号(glob 或标量)已从 Perl 5.10 开始弃用。
<<
表示 <<""
不再允许使用裸终止符已从 Perl 5.000 开始弃用。
这以前就像将它设置为 undef
一样,但已从 Perl 5.20 开始弃用。
IV_MAX
的 Unicode 代码点现在是致命的这已从 Perl 5.24 开始弃用。
B::OP::terse
方法已删除改用 B::Concise::b_terse
。
这在 Perl 5.004 中已弃用。
代码点超过 0xFF
对按位运算符没有意义,此类操作现在会 croak,但仍有少数例外。请参阅 perldeprecation。
这在 Perl 5.24 中已弃用。
${^ENCODING}
设置为已定义值现在是非法的自 Perl 5.22 起,此功能已弃用,自 Perl 5.26 起,此功能已成为无操作。
-S
开关转义冒号以前,-S
开关在遍历 PATH
环境变量时错误地将反斜杠 ("\") 视为冒号的转义字符。 [GH #15584]
在使用调试支持构建 perl 时,已删除 -D
调试选项的 H
标志。此标志本应转储哈希值,但已损坏多年。
在 Perl 5.12 中首次稳定发布时,...
(yada-yada)运算符明确旨在用作语句,而不是表达式。但是,原始实现对此感到困惑,导致解析不一致。在某些情况下,运算符被错误地接受,而这些情况下它并未用作完整语句,例如
... . "foo";
... if $a < $b;
现在解析已变得一致,只允许 yada-yada 作为语句。受影响的代码可以使用 do{...}
将 yada-yada 放入任意表达式上下文中。
自 Perl 5.8 起,sort 实用程序具有子实用程序 _mergesort
、_quicksort
和 _qsort
,可用于指定 perl 应使用哪个算法来实现 sort 内置函数。这始终被认为是一个可能不会持续存在的可疑特性,因此拼写为下划线,并且记录为不可移植到 Perl 5.8 之外。这些子实用程序现已删除,任何尝试使用它们都是错误。 sort 实用程序仍然存在,并且可以中立算法的 stable
子实用程序来控制排序行为。 [GH #13234]
八进制和二进制浮点字面量过去允许任何十六进制数字出现在基数点之后。现在,这些数字仅限于适用于基数的数字,就像基数点之前的数字一样。
unpackstring()
的返回类型C API 函数 unpackstring()
和 unpack_str()
的返回类型已从 I32
更改为 SSize_t
,以便容纳超过 20 亿个项目的 dataset。
vec
已弃用此类字符串在内部以 UTF-8 表示,而 vec
是一种面向位的操作,在这些字符串上可能会产生意外的结果。
"{"
的某些用法不再致命Perl 5.26.0 将未转义的左大括号的某些用法标记为致命,但在最后一刻做出了例外,专门设计为对 GNU Autoconf 进行最小更改以使其正常工作。该工具被大量依赖,并且继续使用已弃用的用法。它使用未转义的左大括号,我们无意将 "{"
重新用作它本身以外的东西。
该例外现在已概括为包括其他各种此类情况,其中 "{"
不会被重新使用。
请注意,这些用法会继续引发弃用消息。
"("
之后使用未转义的 "{"
已弃用在任何地方使用未转义的左大括号都已正式弃用,但不会在它们的使用不会干扰语言预期扩展的情况下强制执行。当大括号紧跟在左括号之后时,此版本中会添加弃用。在此之前,即使大括号是合法量词的一部分,它也不会被解释为量词,而是解释为字面字符,这与紧跟在 "("
之后的其他量词不同,后者被视为错误。现在,除非关闭,否则使用它们会引发弃用消息。
$[
进行赋值将是致命的自 Perl 5.12 以来,向 $[
分配非零值已被弃用,但从未给出删除的截止日期。现在已将其安排在 Perl 5.30 中。
向 Sys::Hostname::hostname()
传递参数已弃用,但没有删除日期。现在已将其安排在 Perl 5.32 中。 [GH #14662]
以下模块将在未来版本中从核心发行版中移除,届时需要从 CPAN 安装。需要这些模块的 CPAN 发行版需要将它们列为先决条件。
这些模块的核心版本现在将发出 “已弃用”
类别警告,以提醒您这一事实。要取消这些弃用警告,请从 CPAN 安装有问题的模块。
请注意,这些模块(极少数例外)是优秀的模块,我们鼓励您继续使用。它们从核心版本中剔除,主要是因为它们对于引导完全功能的、支持 CPAN 的 Perl 安装是必需的,通常不是因为它们的设计问题。
在大多数情况下,使用 Unicode 属性(\p{...}
)创建正则表达式模式的启动开销已大大降低。
由于内部引入了将多个连接组合到单个操作中的 multiconcat
操作码,并且可以选择 =
或 .=
,因此现在许多字符串连接表达式变得相当快。例如,除了检索 $s
、$a
和 $b
之外,整个表达式现在都被视为单个操作
$s .= "a=$a b=$b\n"
作为特例,如果赋值的左侧是词法变量或 my $s
,则操作本身会处理检索词法变量,这会更快。
一般来说,表达式包含常量字符串和变量表达式的混合越多,表达式越长,并且它将非 utf8 字符串和 utf8 字符串混合在一起越多,性能改进就越明显。例如,在 x86_64
系统上,此代码已被基准测试,运行速度提高了四倍
my $s;
my $a = "ab\x{100}cde";
my $b = "fghij";
my $c = "\x{101}klmn";
for my $i (1..10_000_000) {
$s = "\x{100}wxyz";
$s .= "foo=$a bar=$b baz=$c";
}
此外,具有仅包含 %s
和 %%
格式元素的常量格式并且具有固定数量参数的 sprintf
表达式现在也已优化为 multiconcat
操作。
ref()
内置函数在布尔语境中现在快得多,因为它不再费心构造临时字符串,如 Foo=ARRAY(0x134af48)
。
keys()
在 void 和标量上下文中现在更有效率。
比较 index() 结果和 -1 的常用习惯用法现在经过专门优化,例如:
if (index(...) != -1) { ... }
for()
循环和类似构造现在在大多数情况下更有效率。
File::Glob 已修改,以移除不必要的回溯和递归,感谢 Russ Cox。有关更多详细信息,请参阅 https://research.swtch.com/glob。
XS 级 SvTRUE()
API 函数现在更有效率。
各种返回整数的运算现在在标量/布尔上下文中更有效率。
解析 stash 名称时的性能略有提升。 [GH #15689]
对已加载模块的 require
调用现在稍快一些。 [GH #16175]
模式匹配 [[:ascii:]]
和 [[:^ascii:]]
的性能已得到显著提升,EBCDIC 平台除外。
已对匹配正则表达式模式应用各种优化,因此在适当的情况下,可能会注意到性能大幅提升。但在具有许多不同模式的应用程序中,总体上可能几乎看不到提升。
已对 UTF-8 处理应用其他优化,但这些优化通常不是大多数应用程序中的主要因素。
此版本中跨多个模块的主要亮点
自 Perl 5.6.0 中引入 our
以来,已不鼓励使用 use vars
。在可能的情况下,现已从 Perl 源代码中移除此 pragma 的用法。
这略微改善了 B::Deparse 中 WARNING_BITS 的输出。
XSLoader 更现代,并且大多数模块已经需要 perl 5.6 或更高版本,因此切换不会丢失任何功能。在某些情况下,我们还对本地实现进行了更改,由于希望保持更多向后兼容性,因此可能不会反映在 CPAN 上的版本中。
Archive::Tar 已从版本 2.24 升级到 2.30。
此更新还处理了 CVE-2018-12015:目录遍历漏洞。 [cpan #125523]
arybase 已从版本 0.12 升级到 0.15。
Attribute::Handlers 已从版本 0.99 升级到 1.01。
attributes 已从版本 0.29 升级到 0.33。
B 已从版本 1.68 升级到 1.74。
B::Concise 已从版本 0.999 升级到 1.003。
B::Debug 已从版本 1.24 升级到 1.26。
注意:B::Debug 已弃用,可能会从未来版本的 Perl 中移除。
B::Deparse 已从版本 1.40 升级到 1.48。
它包含了许多错误修复,特别是,它现在可以正确地解析变量属性
my $x :foo; # used to deparse as
# 'attributes'->import('main', \$x, 'foo'), my $x;
base 已从版本 2.25 升级到 2.27。
bignum 已从版本 0.47 升级到 0.49。
blib 已从版本 1.06 升级到 1.07。
bytes 已从版本 1.05 升级到 1.06。
Carp 已从版本 1.42 升级到 1.50。
如果调用堆栈上的包包含名为 ISA
的常量,Carp 将不再抛出“不是 GLOB 引用”错误。
Carp 在生成堆栈跟踪时,现在尝试解决由 Perl 的非引用计数堆栈导致的长期错误。 [GH #9282]
Carp 已被修改,以避免假设在没有加载 overload 模块的情况下无法重载对象(这可能发生在由 XS 模块创建的对象中)。以前,如果 XS 定义的重载方法本身调用了 Carp,则会导致无限递归。 [GH #16407]
Carp 现在避免使用 overload::StrVal
,部分原因是较旧版本的 overload(包含在 perl 5.14 及更早版本中)在运行时加载 Scalar::Util,如果在语法错误后调用了 Carp,这将失败。
charnames 已从版本 1.44 升级到 1.45。
Compress::Raw::Zlib 已从版本 2.074 升级到 2.076。
这解决了“zlib”库(与 Compress-Raw-Zlib 捆绑在一起)的旧版本中的一个安全漏洞。
Config::Extensions 已从版本 0.01 升级到 0.02。
Config::Perl::V 已从版本 0.28 升级到 0.29。
CPAN 已从版本 2.18 升级到 2.20。
Data::Dumper 已从版本 2.167 升级到 2.170。
glob 名称的引用现在遵守 Useqq 选项 [GH #13274]。
不再将通过组合 getter/setter 方法将选项设置为 undef
的尝试误认为 getter 调用 [GH #12135]。
Devel::Peek 已从版本 1.26 升级到 1.27。
Devel::PPPort 已从版本 3.35 升级到 3.40。
Devel::PPPort 已从 cpan-first 迁移到 perl-first 维护
Devel::PPPort 中代码的主要责任已移至核心 perl。从实际意义上讲,不应该有任何变化,除了希望它能更及时地更新 perl 中符号所做的更改,而不是需要在事后更新。
Digest::SHA 已从版本 5.96 升级到 6.01。
DirHandle 已从版本 1.04 升级到 1.05。
DynaLoader 已从版本 1.42 升级到 1.45。
其文档现在显示了 __PACKAGE__
和直接对象语法的用法 [GH #16190]。
Encode 已从版本 2.88 升级到 2.97。
encoding 已从版本 2.19 升级到 2.22。
Errno 已从版本 1.28 升级到 1.29。
experimental 已从版本 0.016 升级到 0.019。
Exporter 已从版本 5.72 升级到 5.73。
ExtUtils::CBuilder 已从版本 0.280225 升级到 0.280230。
ExtUtils::Constant 已从版本 0.23 升级到 0.25。
ExtUtils::Embed 已从版本 1.34 升级到 1.35。
ExtUtils::Install 已从版本 2.04 升级到 2.14。
ExtUtils::MakeMaker 已从版本 7.24 升级到 7.34。
ExtUtils::Miniperl 已从版本 1.06 升级到 1.08。
ExtUtils::ParseXS 已从版本 3.34 升级到 3.39。
ExtUtils::Typemaps 已从版本 3.34 升级到 3.38。
ExtUtils::XSSymSet 已从版本 1.3 升级到 1.4。
feature 已从 1.47 版升级到 1.52 版。
fields 已从 2.23 版升级到 2.24 版。
File::Copy 已从 2.32 版升级到 2.33 版。
现在,它将使用 Time::HiRes 提供的 utime() 的亚秒精度变体(如果可用)。[GH #16225]。
File::Fetch 已从 0.52 版升级到 0.56 版。
File::Glob 已从 1.28 版升级到 1.31 版。
File::Path 已从 2.12_01 版升级到 2.15 版。
File::Spec 和 Cwd 已从 3.67 版升级到 3.74 版。
File::stat 已从 1.07 版升级到 1.08 版。
FileCache 已从 1.09 版升级到 1.10 版。
Filter::Simple 已从 0.93 版升级到 0.95 版。
Filter::Util::Call 已从 1.55 版升级到 1.58 版。
GDBM_File 已从 1.15 版升级到 1.17 版。
其文档现在解释了 each
和 delete
不会与绑定到此模块的哈希混合 [GH #12894]。
如果要求 gdbm 将块大小设为默认值失败,它现在将重试使用可接受的块大小打开 [GH #13232]。
Getopt::Long 已从 2.49 版升级到 2.5 版。
Hash::Util::FieldHash 已从 1.19 版升级到 1.20 版。
I18N::Langinfo 已从 0.13 版升级到 0.17 版。
此模块现在可在所有平台上使用,在缺少 nl_langinfo(3) 的系统上模拟系统 nl_langinfo(3)。有些注意事项适用,如 其文档中所述,最严重的是,除了 MS Windows 外,CODESET
项未在这些系统上实现,始终返回 ""
。
如果字符串包含合法的非 ASCII UTF-8,并且区域设置为 UTF-8,它现在将在其返回的标量中设置 UTF-8 标志 [GH #15131]。
此更新还修复了一个错误,即底层区域设置被忽略,用于 RADIXCHAR
(始终返回为点)和 THOUSEP
(始终为空)。现在返回与区域设置相符的值。
I18N::LangTags 已从 0.42 版升级到 0.43 版。
if 已从 0.0606 版升级到 0.0608 版。
IO 已从 1.38 版升级到 1.39 版。
IO::Socket::IP 已从 0.38 版升级到 0.39 版。
IPC::Cmd 已从 0.96 版升级到 1.00 版。
JSON::PP 已从 2.27400_02 版升级到 2.97001 版。
libnet
发行版已从 3.10 版升级到 3.11 版。
List::Util 已从 1.46_02 版升级到 1.49 版。
Locale::Codes 已从 3.42 版升级到 3.56 版。
注意:Locale::Codes 计划在 Perl 5.30 中从核心移除。
Locale::Maketext 已从 1.28 版升级到 1.29 版。
Math::BigInt 已从 1.999806 版升级到 1.999811 版。
Math::BigInt::FastCalc 已从 0.5005 版升级到 0.5006 版。
Math::BigRat 已从 0.2611 版升级到 0.2613 版。
Module::CoreList 已从 5.20170530 版升级到 5.20180622 版。
mro 已从 1.20 版升级到 1.22 版。
Net::Ping 已从 2.55 版升级到 2.62 版。
NEXT 已从 0.67 版升级到 0.67_01 版。
ODBM_File 已从 1.14 版升级到 1.15 版。
Opcode 已从 1.39 版升级到 1.43 版。
overload 已从 1.28 版升级到 1.30 版。
PerlIO::encoding 已从 0.25 版升级到 0.26 版。
PerlIO::scalar 已从 0.26 版升级到 0.29 版。
PerlIO::via 已从 0.16 版升级到 0.17 版。
Pod::Functions 已从 1.11 版升级到 1.13 版。
Pod::Html 已从 1.2202 版升级到 1.24 版。
现在将从 POD 文档中的“NAME”部分自动生成 HTML 文档的标题,就像在该模块被重写为使用 Pod::Simple::XHTML 来完成其核心工作之前一样 [GH #11954]。
Pod::Perldoc 已从 3.28 版升级到 3.2801 版。
podlators
发行版已从 4.09 版升级到 4.10 版。
手册页引用和函数名称现在遵循 Linux 手册页格式标准,而不是 Solaris 标准。
POSIX 已从 1.76 版升级到 1.84 版。
关于在多线程应用程序中使用特定于区域设置的函数,添加了一些其他注意事项。
re 已从版本 0.34 升级到 0.36。
Scalar::Util 已从版本 1.46_02 升级到 1.50。
SelfLoader 已从版本 1.23 升级到 1.25。
Socket 已从版本 2.020_03 升级到 2.027。
sort 已从版本 2.02 升级到 2.04。
Storable 已从版本 2.62 升级到 3.08。
Sub::Util 已从版本 1.48 升级到 1.49。
subs 已从版本 1.02 升级到 1.03。
Sys::Hostname 已从版本 1.20 升级到 1.22。
Term::ReadLine 已从版本 1.16 升级到 1.17。
Test 已从版本 1.30 升级到 1.31。
Test::Harness 已从版本 3.38 升级到 3.42。
Test::Simple 已从版本 1.302073 升级到 1.302133。
threads 已从版本 2.15 升级到 2.22。
文档现在更详细地描述了从线程返回值时出现的问题,并且不再警告在 BEGIN
块中创建线程。 [GH #11563]
threads::shared 已从版本 1.56 升级到 1.58。
Tie::Array 已从版本 1.06 升级到 1.07。
Tie::StdHandle 已从版本 4.4 升级到 4.5。
Time::gmtime 已从版本 1.03 升级到 1.04。
Time::HiRes 已从版本 1.9741 升级到 1.9759。
Time::localtime 已从版本 1.02 升级到 1.03。
Time::Piece 已从版本 1.31 升级到 1.3204。
Unicode::Collate 已从版本 1.19 升级到 1.25。
Unicode::Normalize 已从版本 1.25 升级到 1.26。
Unicode::UCD 已从版本 0.68 升级到 0.70。
函数 num
现在接受一个可选参数,以帮助诊断错误返回。
User::grent 已从版本 1.01 升级到 1.02。
User::pwent 已从版本 1.00 升级到 1.01。
utf8 已从版本 1.19 升级到 1.21。
vars 已从版本 1.03 升级到 1.04。
version 已从版本 0.9917 升级到 0.9923。
VMS::DCLsym 已从版本 1.08 升级到 1.09。
VMS::Stdio 已从 2.41 版升级到 2.44 版。
warnings 已从 1.37 版升级到 1.42 版。
现在包括以 _at_level
结尾的新函数,允许调用者指定确切的调用帧。 [GH #16257]
XS::Typemap 已从 0.15 版升级到 0.16 版。
XSLoader 已从 0.27 版升级到 0.30 版。
其文档现在显示了 __PACKAGE__
的用法,以及直接对象语法,例如 DynaLoader
用法 [GH #16190]。
使用 mod2fname
编辑可加载库名称的平台现在会在未编辑的正确名称下查找引导程序 (.bs) 文件。
VMS::stdio
兼容性垫片已删除。
我们已尝试更新文档以反映本文档中列出的更改。如果您发现我们遗漏了任何更改,请发送电子邮件至 [email protected]。
此外,已进行以下选定的更改
API 函数 perl_parse()
、perl_run()
和 perl_destruct()
现在得到全面记录,而以前唯一的文档是对 perlembed 教程的引用。
newGIVENOP()
的文档已延迟更新,以解决词法 $_
的删除问题。
API 函数 newCONSTSUB()
和 newCONSTSUB_flags()
的文档比以前全面得多。
DB::sub()
将被调用的条件的描述已得到澄清。 [GH #16055]
perldiag 中的“正则表达式 m/%s/ 中未实现可变长度后向引用”
这现在提供了更多关于 Perl 5.18 中引入的问题的解决方法的想法(但未在其 perldelta 中明确记录),因为一些 Unicode /i
规则导致一些序列(例如
(?<!st)
被视为可变长度,因此不允许。
“使用状态 $_ 是实验性的”在 perldiag 中
此条目已被移除,因为在 perl 5.24.0 中移除了对该构造的实验性支持。
诊断 当前禁止在列表上下文中初始化状态变量
已更改为 当前禁止在列表中初始化状态变量
,因为现在允许对单个聚合状态变量进行列表上下文初始化。
在 perlembed 中,示例在退出方式上变得更加便携,并且从嵌入式 Perl 解释器获取退出代码的示例现在从正确的位置获取。将构造的 argv 传递给 Perl 的示例现在显示了强制性的空 argv[argc]
。
在 perlembed 中的一个示例在调用 croak() 时将 ERRSV
的字符串值用作格式字符串。如果该字符串包含诸如 %s
之类的格式代码,这可能会使程序崩溃。
这已更改为对 croak_sv() 的调用。
另一种方法可能是提供一个简单的格式字符串
croak("%s", SvPV_nolen(ERRSV));
或作为 ERRSV
的特殊情况,只需
croak(NULL);
现在有一个注释,指出由内置函数生成的警告记录在 perldiag 和 warnings 中。 [GH #12642]
exists
运算符的文档不再说自动生成行为“可能会在未来的版本中修复”。我们已经确定我们不会更改默认行为。 [GH #15231]
bless
运算符文档中的一些小细节已经得到澄清。 [GH #14684]
require
文档中对 @INC
钩子的描述已更正为过滤器子例程接收无用的第一个参数。 [GH #12569]
ref
的文档已重写以提高清晰度。
use
的文档现在解释了在语法上如何将版本号作为其模块版本检查功能的限定条件。
warn
的文档已更新,以反映自 Perl 5.14 以来,它以等同于 die
的方式处理复杂的异常对象。 [GH #13641]
die
和 warn
的文档已经过修订以提高清晰度。
each
的文档已经过改进,对迭代器状态共享的描述更加明确,并对 while-each 循环的脆弱性提出了警告。 [GH #16334]
对 require
的说明已经过添加,以解释以下内容之间的差异:
require Foo::Bar;
require "Foo/Bar.pm";
现在明确规定了识别 smoke-me
分支的精确规则。
perlguts 中关于引用计数的部分已经过大幅修订,以描述程序员需要考虑的引用方式,而不是物理数据结构。
改进与 UTF-8 多字节相关的文档。
内部函数 newXS_len_flags()
和 newATTRSUB_x()
现在已经过记录。
关于 DESTROY
方法的文档已经过更正、更新和修订,尤其是在它们与异常交互的方式方面。 [GH #14083]
perlop 中对 x
运算符的描述已经过说明。 [GH #16253]
perlop 已经过更新,以指出 qw
的空格规则不同于 split
的规则,因为只使用 ASCII 空格。
对运算符优先级和结合性的总体说明已经过更正和说明。 [GH #15153]
\
引用运算符的文档现在解释了它为其操作数提供的不同寻常的上下文。 [GH #15932]
关于元字符和字符类的说明
说明元字符。
说明 -M 和 -m 之间的差异。 [GH #15998]
关于 set-id 脚本的文档已经过更新和修订。 [GH #10289]
已添加有关使用 sudo
运行 Perl 脚本的章节。
已从 perlsyn 中删除了“真与假”章节(该章节不属于该文档),并将其合并到 perldata 中有关同一主题的现有段落中。
用于消除代码块和哈希构造函数之间歧义的方法(已在 perlref 中记录)现在也记录在 perlsyn 中。 [GH #15918]
perluniprops 已更新,以指出 \p{Word}
现在包括与 \p{Join_Control}
属性匹配的代码点。对该属性的更改是在 Perl 5.18 中进行的,但直到现在才记录下来。目前只有两个代码点与此属性匹配:U+200C(零宽度不连接符)和 U+200D(零宽度连接符)。
对于每个二进制表或属性,文档现在都包括它在 \x00-\xFF
范围中匹配的字符,以及在该范围以上匹配的前几个代码点范围的列表。
已扩展 perlvar 中 $+
的条目,以描述对多重命名的捕获组的处理。
在各个地方,改进了 while 循环条件表达式中的特殊情况的文档,例如隐式 defined
和对 $_
的赋值。 [GH #16334]
已对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
(F) 执行了“goto”语句以跳转到 given
块的中间。您无法从这里到达那里。请参阅 perlfunc 中的“goto”。
禁止使用 goto
跳转到二进制或列表运算符的参数,以防止崩溃和堆栈损坏。 [GH #15914]
您只能输入采用固定数量参数的运算符的第一个参数,因为这是不会导致堆栈损坏的情况。 [GH #16415]
(W 语法) 您在双引号字符串中命名的变量中使用了旧包分隔符“'”,例如 "In $name's house"
。这等同于 "In $name::s house"
。如果您指的是前者,请在撇号前加反斜杠("In $name\'s house"
)。
在递归正则表达式中使用数字量化的子模式时发出的误报警告已静音。 [GH #16106]
现在针对具有多个连接的表达式(例如 $a.$b.$c
)生成关于在空上下文中无用地使用连接运算符的警告,而以前错误地不发出警告。 [GH #3990]
变量或子例程“掩盖了在同一...中的早期声明”的警告,或 our
变量已被重新声明的警告已被移至新的警告类别“shadow”。以前它们属于“misc”类别。
Sys::Hostname::hostname()
的弃用警告指出它现在不接受参数,并指出警告将升级为错误的 Perl 版本。 [GH #14662]
关于 set-id 脚本的错误的 perldiag 条目已扩展,以明确指出该错误报告的是特定安全漏洞,并建议如何修复它。
无法刷新 stdout
错误消息缺少尾随换行符。[debian #875361]
已添加 --help
和 --version
选项。
C89 要求
Perl 已被记录为自 1998 年 10 月起需要一个 C89 编译器才能构建。现在,Perl 的内部结构已经进行了各种简化,以依赖于 C89 标准所指定的特性。我们相信,此内部更改并未改变 Perl 构建的平台集,但如果 Perl 现在在您的平台上构建时出现新问题,请报告一个错误。
在 GCC 上,-Werror=pointer-arith
现在默认启用,禁止对 void 和函数指针进行算术运算。
在安装了文档的 HTML 版本的情况下,HTML 文档现在使用相对链接来相互引用。从 perlipc 的索引页面到各个部分文档的链接现在是正确的。 [GH #11941]
lib/unicore/mktables 现在正确规范化其生成的文件中存储的依赖项的名称。
regen/mk_invlists.pl 与其他 regen/*.pl 脚本不同,它使用 $0
在其生成的文件中存储的依赖项中命名自身。它现在使用一个文字,以便生成的文件中存储的路径不依赖于如何调用 regen/mk_invlists.pl。
这种缺乏规范名称可能会导致 t/porting/regen.t 中的测试失败。 [GH #16446]
新探针
XS-APItest 目录的测试现在在适用情况下并行进行。
Perl 现在为 github 镜像上的 Travis CI 测试包含一个默认的 .travis.yml 文件。 [GH #14558]
re/pat_psycho.t 中的看门狗计时器计数现在可以被覆盖。
此测试可能需要很长时间才能运行,因此有一个计时器来保持此测试(当前为 5 分钟)。此提交添加了检查环境变量 PERL_TEST_TIME_OUT_FACTOR
;如果设置,则超时设置将乘以其值。
harness 在运行 t/io/openpid.t 时不再等待 30 秒。 [GH #13535] [GH #16420]
过去几年,我们使用三种不同的归档格式发布 perl:bzip (.bz2
)、LZMA2 (.xz
) 和 gzip (.gz
)。由于 xz 压缩效果更好,解压缩速度更快,而 gzip 兼容性更高且占用内存更少,因此我们在此版本中放弃了 .bz2
归档格式。(如果这会带来问题,请告知我们;请参见下文的 "报告错误"。)
已移除针对这些明显已停用的平台的编译器提示和其他支持。
现已修复在 CentOS 5 上的编译。
现在可以在 Cygwin 上使用 quadmath 库进行构建。
在支持它们的 Darwin 版本上,Perl 现在正确使用可重入函数,如 asctime_r
。
FreeBSD 的 /usr/share/mk/sys.mk 为 ARM 和 MIPS 以外的架构指定 -O2
。默认情况下,现在使用相同的优化级别编译 perl。
针对 configure.com 的若干修复,标记 VMS 具有(或不具有)的功能。
嵌入式程序现在可以在调用 Perl 之前使用 decc$feature_set
和 decc$feature_set_value
函数设置 CRTL 功能。以前,在映像初始化后尝试设置功能会被忽略。
已添加使用 Microsoft Visual Studio 2017(包含 Visual C++ 14.1)在 Windows 上编译 perl 的支持。
已改进 Visual C++ 编译器版本检测,使其可在非英语语言系统上运行。
我们现在使用早于 14.1 的 Visual C++ 版本为 64 位构建正确设置 $Config{libpth}
。
已向编译器添加一个新的优化阶段 optimize_optree()
,它在窥孔优化器运行之前对完整的 optree 进行自上而下的扫描。此阶段当前不可挂钩。
已添加一个 OP_MULTICONCAT
op。在 optimize_optree()
时间,一个 OP_CONCAT
和 OP_CONST
op 的链,以及一个 OP_STRINGIFY
和/或 OP_SASSIGN
(可选),被合并成一个 OP_MULTICONCAT
op。该 op 的类型为 UNOP_AUX
,并且 aux 数组包含参数计数,以及指向常量字符串和一组段长度的指针。例如
my $x = "foo=$foo, bar=$bar\n";
常量字符串将是 "foo=, bar=\n"
,段长度将是 (4,6,1)。如果字符串包含 \x80
等字符,其表示形式在 utf8 下发生变化,则会预先计算并存储两组字符串和长度。
在多线程存在的情况下,直接访问 PL_keyword_plugin
是不安全的。已添加一个新的 wrap_keyword_plugin
函数,以允许 XS 模块安全地定义自定义关键字,即使从线程加载,类似于 PL_check
/ wrap_op_checker
。
已移除 PL_statbuf
解释器变量。
已移除可从 XS 代码访问的已弃用函数 to_utf8_case()
。
已添加一个新函数 is_utf8_invariant_string_loc()
,它类似于 is_utf8_invariant_string()
,但需要一个额外的指针参数,用于存储第一个变体字符的位置(如果找到的话)。
已添加一个新函数 Perl_langinfo()
。它几乎可以直接替换系统 nl_langinfo(3)
,但适用于缺少该函数的平台;并且更具线程安全性,并隐藏了调用者在处理区域设置时遇到的一些问题。使用此函数的代码无需使用 localeconv(3)
(并受这些问题影响)来查找小数点、千位分隔符或货币符号。请参阅 "Perl_langinfo" in perlapi。
已添加一个新的 API 函数 sv_rvunweaken()
来补充 sv_rvweaken()
。该实现取自 "unweaken" in Scalar::Util。
已添加一个新标志 SORTf_UNSTABLE
。这将允许未来的提交在用户指定“no sort stable”时使归并排序不稳定,因为已决定归并排序在默认情况下应保持稳定。
XS 模块现在可以在线程 Perl 上自动获取系统函数的可重入版本。
通过添加
#define PERL_REENTRANT
在 XS
文件的开头附近,它将被编译,以便 perl 在该系统上了解的任何可重入函数都将自动且无形地用于普通非可重入版本。例如,如果你在代码中编写 getpwnam()
,在具有 getpwnam_r()
的系统上,对前者的所有调用都将无形地转换为后者。这仅在多线程 perl 上发生,因为在其他情况下不需要它们。请注意,具有可重入版本的函数因系统而异。
不再支持 PERL_NO_OP_PARENT
构建定义,这意味着 perl 现在始终在启用 PERL_OP_PARENT
的情况下构建。
附加到 OP_TRANS
/OP_TRANSR
操作的 op_pv
字段的非 utf8 音译表的格式和内容已更改。它现在是 struct OPtrans_map
。
已添加新的编译器 #define
,dTHX_DEBUGGING
。这对于仅需要线程上下文或 C 代码的 XS 代码非常有用,因为它们仅在 -DDEBUGGING
下编译的调试语句需要一个线程上下文。
已添加新的 API 函数 perlapi 中的“Perl_setlocale”。
已修改 perlapi 中的“sync_locale”,以返回一个布尔值,指示系统是否使用全局区域设置。
已引入一种新的魔术标量,称为“nonelem”标量。它存储在数组中以表示不存在的元素,只要在潜在的 lvalue 上下文中访问此类元素时。它在可能的情况下替换现有的“defelem”(延迟元素)魔术,效率更高。这意味着 some_sub($sparse_array[$nonelem])
不再必须每次都创建一个新的魔术 defelem 标量,只要元素在数组中即可。
当数组被移位或取消移位时,它部分修复了延迟元素与其数组不同步的罕见错误。 [GH #16364]
在某些罕见情况下,列表赋值 (aassign
) 可能会在 mortals 堆栈上分配一个条目,并使该条目未初始化,从而可能导致崩溃。 [GH #16017]
尝试将属性应用于 our
变量(其中已存在该名称的函数)可能会导致在预期 SV 的位置提供 NULL 指针,从而导致 perl 崩溃。 [perl #131597]
split ' '
现在正确处理 unicode_strings
特性作用域内的被分割参数。以前,当使用单字节内部表示形式的字符串包含 Unicode 规则(但不是 ASCII 规则)定义为空白的字符时,它会将这些字符视为字段的一部分,而不是字段分隔符。 [GH #15904]
以前,几个内置函数都存在错误,这些错误会导致它们在未为要写入的项目分配空间的情况下写入内部堆栈。在极少数情况下,这可能会导致崩溃。这些错误现在已修复,如果将来引入任何类似的错误,它们将在调试版本中自动检测到。
在调用 XSUB 时,entersub
运算符也会执行这些引入的内部堆栈使用情况检查。这意味着我们可以报告哪个 XSUB 未能分配足够的堆栈空间。 [GH #16126]
在调试版本中,使用带有后置引用语法作为散列查找中的键的符号引用会导致断言失败。 [GH #16029]
名称以脱字符号开头的数组和散列变量现在允许在插值到字符串中时在其大括号内进行索引,例如 "${^CAPTURE[0]}"
以对 @{^CAPTURE}
进行索引。 [GH #16050]
获取以前是 UTF-8 但不再是 UTF-8 的全局变量的名称将返回标记为 UTF-8 的该名称。 [GH #15971]
perl sprintf()
函数(通过底层 C 函数 Perl_sv_vcatpvfn_flags()
)已被大量修改,以修复许多小错误,包括大宽度和精度说明符的整数换行和潜在的缓冲区溢出。在许多情况下,它也变得更快。
从 eval
退出,无论是正常退出还是通过异常退出,现在总是在设置 $@
之前 释放临时值(可能调用析构函数)。例如
sub DESTROY { eval { die "died in DESTROY"; } }
eval { bless []; };
# $@ used to be equal to "died in DESTROY" here; it's now "".
修复了 -flto -mieee-fp
版本的重复符号失败。pp.c 定义了 _LIB_VERSION
,而 -lieee
已定义了该版本。 [GH #16086]
如果浮点数的指数部分不完整,则标记器不再使用它。 [GH #16073]
在非线程构建中,对于 m/$null/
(其中 $null
是空字符串)不再被视为在先前的匹配匹配操作符包含 /o
标志时存在 /o
标志。用于实现此行为的重写可能会混淆解释器。这与线程构建的行为相匹配。 [GH #14668]
如果 sub
关键字后面跟着包含换行符(和注释)的空白,则解析 sub
定义可能会导致释放后使用。 [GH #16097]
在 ${identifier}
构造中跳过空白时,分词器现在可以正确调整解析指针。 [perl #131949]
在对非 glob 执行各种 I/O 操作后,不再断言访问 ${^LAST_FH}
。 [GH #15372]
XS 级 Copy()
、Move()
、Zero()
宏及其变体现在断言提供的指针是否为 NULL
。即使其计数参数为零,ISO C 也将向这些宏构建的函数提供 NULL 指针视为未定义的行为。基于这些断言和原始错误报告,三个宏调用被设为条件。 [GH #16079] [GH #16112]
仅允许使用 =
运算符为子例程签名中的参数定义默认值。以前,其他赋值运算符(例如 +=
)也意外地被允许。 [GH #16084]
包名称现在始终包含在 :prototype
警告中 [perl #131833]
以前仅在调试构建的 jmpenv
结构中找到的 je_old_stack_hwm
字段也已添加到非调试构建中。这修复了某些 CPAN 模块的问题,该问题是由此结构的大小在调试和非调试构建之间变化引起的。 [GH #16122]
ninstr()
宏的参数现在正确加上了括号。
已修复 S_regmatch()
函数中的 NULL 指针取消引用。 [perl #132017]
使用空 LIST
调用 exec PROGRAM LIST 已修复。这应该使用空 argv
数组(仅包含终止 NULL
指针)调用 execvp()
,但实际上只是返回 false(并且没有设置 $!
)。 [GH #16075]
如果将常量子例程存储在 stash 中作为简单标量引用而不是完整类型 glob,则 gv_fetchmeth_sv
C 函数在 Perl 5.22 中无法正常获取具有 UTF-8 名称的常量。此问题已得到纠正。
后面带有以标点符号开头的参数的单字母调试器命令(例如 p$^V
和 x@ARGV
)现在可以再次工作。它们错误地要求命令和参数之间有一个空格。 [GH #13342]
splice 现在在修改只读数组时会抛出异常(“尝试修改只读值”)。到目前为止,它一直在静默修改数组。新行为与 push 和 unshift 的行为一致。 [GH #15923]
如果给定包含空字符的文件名,stat()
、lstat()
和文件测试运算符现在会失败,就像 open()
已经失败一样。
如果由于应用于已关闭或其他无效的文件句柄而导致失败,stat()
、lstat()
和文件测试运算符现在会可靠地设置 $!
。
针对在特定平台上不存在的 Unix 权限位的文件测试运算符(例如 Windows 上的 -k
(粘滞位))现在会在返回一概为假的结果之前检查要测试的文件是否存在,如果参数不引用文件,则会产生适当的错误。
在转换运算符的字符集开头使用 \N{}
解析以 \N{}
开头的范围时,修复了“缓冲区前读取”溢出。 [GH #16189]
在编译时解析空 \N{}
时修复了泄漏的标量。 [GH #16189]
现在,在目录或块设备上调用 do $path
会在 $!
中产生有意义的错误代码。 [GH #14841]
使用提供受污染字符串化的重载替换值的正则表达式替换现在可以正确污染结果字符串。 [GH #12495]
do
块中的词法子声明(例如 do { my sub lex; 123 }
)可能会破坏堆栈,擦除包含语句中堆栈上的项目。此问题已修复。 [GH #16243]
pack
和 unpack
现在可以处理超过 20 亿的重复计数和长度。 [GH #13179]
在浮点小数有效数字不适合整数类型时,八进制和二进制浮点字面量中基数点后的数字现在具有正确的权重。
规范真值不再具有作为可调用子例程的虚假特殊含义。它曾经是缺少 import
或 unimport
方法的魔术占位符,但现在像任何其他字符串 1
一样被对待。 [GH #14902]
system
现在会将其参数缩减为父进程中的字符串,因此对它们进行字符串化(例如调用重载方法或发出警告)的任何效果都可以在程序预期的方式中看到。 [GH #13561]
readpipe()
内置函数现在在编译时检查它只有一个参数表达式,并将其置于标量上下文中,从而确保它不会在运行时破坏堆栈。 [GH #2793]
sort
现在在对 $a
和 $b
进行别名时执行正确的引用计数,从而避免了如果在执行排序比较器期间重新对它们进行别名,则过早销毁和标量泄漏。 [GH #11422]
没有操作数的 reverse
默认情况下会反转 $_
,不再有破坏堆栈的危险。 [GH #16291]
exec
、system
等不再可能因可重入调用和绑定标量等魔术而导致其参数列表损坏。 [GH #15660]
Perl 自身的 malloc
不再会因尝试在 64 位平台上分配超过 1 GB 而感到困惑。 [GH #13273]
排序比较器表达式中堆叠的文件测试运算符不再会导致崩溃。 [GH #15626]
对引用执行恒等 tr///
转换不再被误认为该引用,以决定是否可以对其进行赋值。 [GH #15812]
当解析意义如此之低的数字以至于它们无法影响浮点数时,长度较长的十六进制、八进制或二进制浮点数文字不再会导致未定义的行为。 [GH #16114]
open $$scalarref...
和类似的调用不再泄漏文件句柄。 [GH #12593]
某些复杂的正则表达式类型在编译时不再导致算术溢出。 [GH #16113]
默认类型映射现在不再通过避免 newGVgen
在 XSUB 返回文件句柄(PerlIO *
或 FILE *
)时发生泄漏。 [GH #12593]
创建具有原型的 XS 子例程作为 BEGIN
块不再由于子例程的提前释放而崩溃。
printf
格式说明符 %.0f
不再错误地进行舍入 [GH #9125],现在显示负零的正确符号。
修复了一个问题,其中当数组名以 Inf
开头时,错误 标量值 @arrayname[0] 应写为 $arrayname
会给出错误 无法使用 'c' 打印 Inf
。 [GH #16335]
PathTools 发行版中 Cwd
中 getcwd()
的 Perl 实现现在在错误上与 XS 实现的行为相同:它返回一个错误,并设置 $!
。 [GH #16338]
将数组元素放入堆栈时对其进行激活。修复 [GH #5310](于 2002 年 4 月报告)。
修复了在圆括号后解析带大括号的下标。修复 [GH #4688](于 2001 年 12 月报告)。
当替换字符列表的长度大于 0x7fff 时,tr/non_utf8/long_non_utf8/c
可能会给出错误的结果。
tr/non_utf8/non_utf8/cd
无法将隐含的 \x{100}-\x{7fffffff}
添加到搜索字符列表。
现在,在“perl-within-perl”构造(例如字符串插值和 s///e
的右侧部分)中编译失败会导致编译提前中止。
以前,编译可以继续报告其他错误,但失败的子解析可能会在解析器移位-归约堆栈上留下部分解析的构造,从而混淆解析器,导致 perl 崩溃。 [GH #14739]
在小数点(基数)字符不是句点的多线程 perl 中,当一个线程需要使用实际基数字符(例如使用 sprintf
)时,线程之间可能会发生竞争。现在已通过在没有线程安全区域设置的系统上使用互斥锁来修复此问题,并且在具有线程安全区域设置的系统上根本不会出现此问题。
编译正则表达式字符类时的错误有时会触发断言失败。 [GH #16172]
Perl 5.28.0 代表了自 Perl 5.26.0 以来大约 13 个月的开发,包含来自 77 位作者的 2,200 个文件中大约 730,000 行的更改。
不包括自动生成的文件、文档和发行工具,大约有 580,000 行更改到 1,300 个 .pm、.t、.c 和 .h 文件。
由于活跃的用户和开发人员社区,Perl 在其第四个十年继续蓬勃发展。已知以下人员为 Perl 5.28.0 的改进做出了贡献
Aaron Crane、Abigail、Ævar Arnfjörð Bjarmason、Alberto Simões、Alexandr Savca、Andrew Fresh、Andy Dougherty、Andy Lester、Aristotle Pagaltzis、Ask Bjørn Hansen、Chris 'BinGOs' Williams、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Collins、Daniel Dragan、David Cantrell、David Mitchell、Dmitry Ulanov、Dominic Hargreaves、E. Choroba、Eric Herman、Eugen Konkov、Father Chrysostomos、Gene Sullivan、George Hartzell、Graham Knop、Harald Jörg、H.Merijn Brand、Hugo van der Sanden、Jacques Germishuys、James E Keenan、Jarkko Hietaniemi、Jerry D. Hedden、J. Nick Koston、John Lightsey、John Peacock、John P. Linderman、John SJ Anderson、Karen Etheridge、Karl Williamson、Ken Brown、Ken Cotterill、Leon Timmermans、Lukas Mai、Marco Fontani、Marc-Philip Werner、Matthew Horsfall、Neil Bowers、Nicholas Clark、Nicolas R.、Niko Tyni、Pali、Paul Marquess、Peter John Acklam、Reini Urban、Renee Baecker、Ricardo Signes、Robin Barker、Sawyer X、Scott Lanning、Sergey Aleynikov、Shirakata Kentaro、Shoichi Kaji、Slaven Rezic、Smylers、Steffen Müller、Steve Hay、Sullivan Beck、Thomas Sibley、Todd Rinaldo、Tomasz Konojacki、Tom Hukins、Tom Wyant、Tony Cook、Vitali Peil、Yves Orton、Zefram。
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的(非常感谢的)贡献者的姓名。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
要获得所有 Perl 历史贡献者的更完整列表,请参阅 Perl 源代码发行版中的 AUTHORS 文件。
如果您发现您认为是一个错误,您可以在 https://rt.perl.org/ 查看 perl 错误数据库。Perl 主页 https://www.perl5.cn/ 上也可能会有信息。
如果您认为您有一个未报告的错误,请运行发行版中包含的 perlbug 程序。务必将您的错误精简为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],供 Perl 移植团队分析。
如果您报告的错误具有安全影响,不适合发送到公开存档的邮件列表,请参阅 perlsec 中的“安全漏洞联系信息”,了解如何报告该问题。
如果您希望感谢 Perl 5 Porters 在 Perl 5 中所做的工作,您可以通过运行 perlthanks
程序来实现
perlthanks
这会向 Perl 5 Porters 列表发送一封电子邮件,表示您的感谢。
Changes 文件,了解如何查看已更改内容的详尽详细信息。
INSTALL 文件,了解如何构建 Perl。
README 文件,了解一般信息。
Artistic 和 Copying 文件,了解版权信息。