perl5260delta - perl v5.26.0 的新增功能
本文档描述了 5.24.0 版本和 5.26.0 版本之间的差异。
此版本包含三个具有广泛影响的更新
"."
不再在 @INC
中
出于安全原因,当前目录 ("."
) 默认情况下不再包含在模块搜索路径 (@INC
) 的末尾。这可能会对模块的构建、测试和安装以及脚本的执行产生广泛的影响。有关完整详细信息,请参阅 "从 @INC
中删除当前目录 ("."
)" 部分。
do
现在可能会发出警告
do
现在在无法加载它本来会在 "."
位于 @INC
中时加载的文件时发出弃用警告。
在正则表达式模式中,应转义字面左大括号 "{"
使用 v5.18 中引入的 lexical_subs
特性不再发出警告。以前使用该特性禁用 experimental::lexical_subs
警告类别的现有代码将继续工作。lexical_subs
特性没有影响;所有 Perl 代码都可以使用词法子程序,无论作用域中有哪些特性声明。
这为 Here-文档添加了一个新的修饰符 "~"
,它告诉解析器应该查找 /^\s*$DELIM\n/
作为结束分隔符。
所有这些语法都受支持
<<~EOF;
<<~\EOF;
<<~'EOF';
<<~"EOF";
<<~`EOF`;
<<~ 'EOF';
<<~ "EOF";
<<~ `EOF`;
"~"
修饰符将从 Here-文档中的每一行中剥离与分隔符之前出现的相同空白。
换行符将按原样复制,而没有包含正确开头空白的行将导致 perl 抛出异常。
例如
if (1) {
print <<~EOF;
Hello there
EOF
}
打印 "Hello there\n",没有前导空白。
/xx
指定两个 "x"
字符来修改正则表达式模式会执行单个 "x"
字符所做的一切,但此外,方括号字符类中的 TAB 和 SPACE 字符通常会被忽略,并且可以添加以提高可读性,例如 /[ ^ A-Z d-f p-x ]/xx
。详细信息请参见 perlre 中的 "/x 和 /xx".
@{^CAPTURE}
、%{^CAPTURE}
和 %{^CAPTURE_ALL}
@{^CAPTURE}
将最后一次匹配的捕获缓冲区公开为数组。因此 $1
等于 ${^CAPTURE}[0]
。这与类似 substr($matched_string,$-[0],$+[0]-$-[0])
的代码等效,并且您也不必跟踪 $matched_string
。此变量没有单字符等效项。请注意,与其他正则表达式魔术变量一样,此变量的内容是动态的;如果您希望在匹配生命周期之外存储它,则必须将其复制到另一个数组中。
%{^CAPTURE}
等效于 %+
(即命名捕获)。除了更具自述性之外,两种形式之间没有区别。
%{^CAPTURE_ALL}
等同于 %-
(即所有命名的捕获)。除了更具自述性之外,两种形式之间没有区别。
作为一项实验性功能,Perl 现在允许引用运算符出现在 my()
、state()
、our()
或 local()
之后。此语法必须使用 use feature 'declared_refs'
启用。它处于实验阶段,默认情况下会发出警告,除非 no warnings 'experimental::refaliasing'
生效。它主要用于对引用的赋值。例如
use experimental 'refaliasing', 'declared_refs';
my \$a = \$b;
有关更多详细信息,请参见 "perlref 中的“对引用的赋值”"。
更改列表位于 http://www.unicode.org/versions/Unicode9.0.0/。与核心 Perl 一起发布但未由 p5p 维护的模块不一定支持 Unicode 9.0。 Unicode::Normalize 确实适用于 9.0。
\p{script}
的使用使用了改进的 Script_Extensions 属性Unicode 6.0 引入了改进的 Script (sc
) 属性形式,并将其称为 Script_Extensions (scx
)。当属性仅指定为 \p{script}
时,Perl 现在使用此改进版本。这应该使程序在确定字符是否在给定脚本中使用时更加准确,但对于非常具体地需要旧行为的程序,可能会出现轻微的破坏。复合形式的含义,如 \p{sc=script}
保持不变。请参见 "perlunicode 中的“脚本”"。
一些平台在 UTF-8 本地化中本机地对排序和排序进行了合理的处理。Perl 现在可以与它们一起使用。为了便携性和完全控制,仍然建议使用 Unicode::Collate,但现在您可能不需要做任何特殊的事情来获得足够好的结果,具体取决于您的应用程序。请参见 "perllocale 中的“类别 LC_COLLATE
:排序:文本比较和排序”"。
NUL
字符的字符串的更好的本地化排序在具有多级字符权重的区域设置中,NUL
现在在较高优先级中被忽略。不过,在某些字符串中仍然存在一些问题。请参阅 "perllocale 中包含嵌入式 NUL
字符的字符串的排序"。
CORE
子例程,用于通过引用调用的哈希和数组函数CORE
命名空间中的哈希和数组函数(keys
、each
、values
、push
、pop
、shift
、unshift
和 splice
)现在可以使用取地址符语法(&CORE::keys(\%hash
)和通过引用(my $k = \&CORE::keys; $k->(\%hash)
)调用。以前,它们只能在内联时使用。
我们已切换到混合哈希函数,以更好地平衡短键和长键的性能。
对于短键(16 字节及以下),我们使用 One At A Time Hard 的优化变体,而对于长键,我们使用 Siphash 1-3。对于非常长的键,这在性能方面是一个很大的改进。对于较短的键,性能有所提高。
@INC
中删除当前目录("."
)perl 二进制文件在 @INC
中包含一组默认路径。历史上,它还包含当前目录("."
)作为最后一个条目,除非在启用 taint 模式(perl -T
)的情况下运行。虽然很方便,但这存在安全隐患:例如,当脚本尝试加载可选模块时,其当前目录不可信(例如 /tmp),它可能会从该目录下加载并执行代码。
从 v5.26 开始,"."
默认情况下始终被删除,而不仅仅是在 taint 模式下。这对安装模块和执行脚本有重大影响。
以下新功能已添加,以帮助缓解这些问题。
Configure -Udefault_inc_excludes_dot
有一个新的 Configure 选项,default_inc_excludes_dot
(默认情况下启用),它构建一个没有 "."
的 perl 可执行文件;使用 -U
取消设置此选项会将 perl 恢复到旧的行为。这可能会解决您的路径问题,但会重新引入所有安全问题,因此除非您确实确信您的环境中不存在此类问题,否则不要像这样构建 perl 可执行文件。
PERL_USE_UNSAFE_INC
Perl 解释器现在识别一个新的环境变量。如果该变量在 Perl 解释器启动时值为 1,则 `"."` 将自动追加到 `@INC` 中(在 taint 模式下除外)。
这允许您在个别情况下恢复旧的 Perl 解释器行为。但请注意,这只是一个临时的权宜之计,此功能可能会在未来的某个 Perl 版本中被移除。目前,`cpan` 工具和 `Test::Harness` 会设置该变量,以简化尚未更新以处理缺少点符号的 CPAN 模块的安装。再次强调,除非您确定不会重新引入任何安全问题,否则不要使用此功能。
`do` 发出的新的弃用警告。
虽然众所周知 `use` 和 `require` 使用 `@INC` 搜索要加载的文件,但许多人没有意识到 `do "file"` 也会在文件为相对路径时搜索 `@INC`。随着 `"."` 的移除,简单的 `do "file.pl"` 将无法从当前目录读取并执行 `file.pl`。由于这通常是预期的行为,因此现在每当 `do` 无法加载本来应该找到的文件(如果 `@INC` 中包含点符号)时,就会发出新的弃用警告。
以下是脚本和模块作者可能需要做的一些事情,以使他们的软件在新环境中正常工作。
脚本作者
如果问题出在您自己的代码中(而不是包含的模块中),那么您有两个主要选择。首先,如果您确信您的脚本只会在受信任的目录中运行(您期望在该目录中找到受信任的文件和模块),那么将 `"."` 添加回路径中;例如:
BEGIN {
my $dir = "/some/trusted/directory";
chdir $dir or die "Can't chdir to $dir: $!\n";
# safe now
push @INC, '.';
}
use "Foo::Bar"; # may load /some/trusted/directory/Foo/Bar.pm
do "config.pl"; # may load /some/trusted/directory/config.pl
另一方面,如果您的脚本旨在从不受信任的目录(例如 `/tmp`)中运行,那么您的脚本突然无法加载文件可能表明存在安全问题。您很可能需要将所有相对路径替换为完整路径;例如:
do "foo_config.pl"
可能会变成
do "$ENV{HOME}/foo_config.pl"
如果您绝对确定要让您的脚本从当前目录加载并执行文件,那么请使用 `./` 前缀;例如
do "./foo_config.pl"
安装和使用 CPAN 模块
如果您使用 `cpan` 等自动工具安装 CPAN 模块,那么该工具本身将在构建和测试模块时设置 `PERL_USE_UNSAFE_INC` 环境变量,这可能足以安装尚未更新以识别点符号的模块。如果您想手动安装这样的模块,那么您需要将传统的调用
perl Makefile.PL && make && make test && make install
替换为类似以下内容:
(export PERL_USE_UNSAFE_INC=1; \
perl Makefile.PL && make && make test && make install)
请注意,这仅有助于构建和安装未修复的模块。测试可能会通过(因为它们是在 `PERL_USE_UNSAFE_INC=1` 下运行的),但模块本身可能无法在生产环境中正常运行。在这种情况下,您可能需要临时修改您的脚本,直到发布模块的修复版本。例如
use Foo::Bar;
{
local @INC = (@INC, '.');
# assuming read_config() needs '.' in @INC
$config = Foo::Bar->read_config();
}
这很少需要。再次强调,如果这样做,请先评估由此带来的风险。
模块作者
如果您维护一个 CPAN 发行版,则可能需要更新才能在无点环境中运行。虽然 cpan
和其他此类工具目前会在模块构建期间设置 PERL_USE_UNSAFE_INC
,但这只是针对依赖于 "."
存在于 @INC
中以进行安装和测试的模块集的临时解决方法,这可能会掩盖更深层的问题。它可能导致一个模块通过测试并安装,但在运行时失败。
在构建、测试和安装期间,通常情况下,任何 perl 进程都将在解压缩的发行版的根目录或该目录的已知子目录(例如 t/)中直接执行。Makefile.PL 或 t/foo.t 很可能尝试使用其直接相对文件名包含本地模块和配置文件,这现在将失败。
但是,如上所述,cpan 等自动工具将(目前)设置 PERL_USE_UNSAFE_INC
环境变量,这会在构建期间引入点。
这使得您的现有构建和测试代码很可能能够正常工作,但这可能会掩盖您的代码中仅在安装后使用时才会出现的问题。明智的做法是尝试在显式禁用该变量的情况下运行您的构建过程。
(export PERL_USE_UNSAFE_INC=0; \
perl Makefile.PL && make && make test && make install)
这更有可能显示出您的模块构建过程甚至模块本身的任何潜在问题。修复此类问题将确保您的模块可以再次手动安装,并且在 PERL_USE_UNSAFE_INC
支柱消失后仍能构建。
在修复由于从 @INC
中删除点而导致的测试问题时,应谨慎地将点重新插入 @INC
,因为这也会抑制运行时代码中的真实错误。鼓励您尽可能地应用上述方法,使用显式绝对/相对路径,或者将所需文件重新定位到子目录中,并将该子目录插入 @INC
。
如果您的运行时代码在无点 @INC
下存在问题,那么上面关于如何修复脚本作者的评论也大多适用于此。但请记住,模块全局添加点到 @INC
被认为是不好的做法,因为它会引入安全风险并隐藏意外在 @INC
中要求点的错误,如上所述。
在 Unix 系统上,Perl 在启动新进程时会将 PATH
环境变量中的任何相对路径视为受污染的。以前,它允许使用反斜杠来转义冒号(与操作系统不同),因此如果将 PATH 设置为类似 /\:.
的内容,则相对路径会被认为是安全的。该检查已修复,在该示例中将 "."
视为受污染的。
-Di
开关才能输出 PerlIO 调试信息这用于调试 PerlIO 中的代码,以避免递归调用。以前,如果 perl 不是以 setuid 方式运行,并且尚未解析 -T
或 -t
开关,则此输出将发送到 PERLIO_DEBUG
环境变量指定的 文件。
如果 perl 在尚未解析其开关的情况下执行输出,这可能会导致 perl 创建或覆盖 PERLIO_DEBUG
指定的文件,即使提供了 -T
开关也是如此。
Perl 现在要求在生成 PerlIO 调试输出之前存在 -Di
开关。默认情况下,它会写入 stderr
,但可以选择通过设置 PERLIO_DEBUG
环境变量将其重定向到文件。
如果 perl 以 setuid 方式运行或提供了 -T
开关,则会忽略 PERLIO_DEBUG
,并且调试输出将发送到 stderr
,就像任何其他 -D
开关一样。
"{"
字符不再允许您现在必须使用类似 "\{"
或 "[{]"
的内容来指定匹配左大括号;否则,它将是一个致命的模式编译错误。此更改将允许将来对语言进行扩展。
这些自 v5.16 起已弃用,从 v5.22 开始,某些使用情况会引发弃用消息。不幸的是,添加用于引发消息的代码存在错误,并且在某些情况下未能发出警告,而这些情况下本应发出警告。因此,对这些情况的禁令执行推迟到 Perl 5.30,但代码已修复,以便在此期间为它们引发默认开启的弃用消息。
字面量 "{"
的某些使用情况发生在我们预计其含义永远不会是字面量以外的任何内容的上下文中,例如模式中的第一个字符,或在 "|"
后面表示交替。因此
qr/{fee|{fie/
匹配字符串 {fee
或 {fie
中的任意一个。为了避免强制进行不必要的代码更改,这些使用不需要转义,也不会发出警告,目前也没有计划更改这一点。
但始终正确地转义 "{"
,记住的简单规则是始终这样做。
scalar(%hash)
返回签名已更改scalar(%hash)
返回的值将不再显示有关哈希中分配的桶的信息。它将简单地返回已使用键的计数。因此,它等效于 0+keys(%hash)
。
通过 Hash::Util::bucket_ratio()
提供了一种向后兼容的形式,它提供了与 Perl 5.24 及更早版本中提供的 scalar(%hash)
相同的行为。
keys
从左值子例程返回从左值子例程返回的 keys
不能再在列表上下文中赋值。
sub foo : lvalue { keys(%INC) }
(foo) = 3; # death
sub bar : lvalue { keys(@_) }
(bar) = 3; # also an error
这使得左值子例程情况与 (keys %hash) = ...
和 (keys @_) = ...
一致,它们也是错误的。 [GH #15339]
${^ENCODING}
功能已移除与为该变量赋值相关的特殊行为已被移除。因此,encoding 编译指示的默认模式不再受支持。如果您仍然需要以 UTF-8 以外的编码编写源代码,请使用源代码过滤器,例如 CPAN 上的 Filter::Encoding 或 encoding 的 Filter
选项。
POSIX::tmpnam()
已移除在 Perl 5.22 中,基本不安全的 tmpnam()
接口已弃用,现在已移除。作为替代,您可以使用例如 File::Temp 接口。
require ::Foo::Bar
现在是非法的。以前,require ::Foo::Bar
会尝试读取 /Foo/Bar.pm。现在,任何以双冒号开头的裸字 require 都会导致死亡。
变量名不再允许包含字面控制字符。这些以前在 ASCII 平台上的单字符名称中是允许的,但从 Perl 5.20 开始就被弃用。这会影响诸如 $\cT
之类的东西,其中 \cT 是源代码中的字面控制字符(例如 NAK
或 NEGATIVE ACKNOWLEDGE
字符)。
NBSP
在 \N{...}
中不再允许字符名称不再允许包含不间断空格。从 Perl 5.22 开始,这种做法已被弃用。
为了让 Perl 最终能够允许使用 Unicode 字素簇作为字符串分隔符(看起来像单个字符,但实际上可能是多个字符的序列),我们必须停止允许使用非独立字素作为单个字符分隔符。这些分隔符在实际代码中不太可能存在,因为它们通常会显示为附加到前面的字符。
\cX
映射到可打印字符不再被弃用这意味着我们没有计划删除此功能。它仍然会发出警告,但只有在启用语法警告时才会发出。此功能最初旨在提供一种表达没有助记符的不可打印字符的方法(\t
和 \n
是两个不可打印字符的助记符,但大多数不可打印字符没有助记符)。但是,此功能可以用来指定一些可打印字符,尽管这些字符更清楚地表达为可打印字符本身。请参阅 http://www.nntp.perl.org/group/perl.perl5.porters/2017/02/msg242944.html。
在布尔上下文中,哈希现在有时更快,例如
if (!%h) { ... }
这已经是一个特殊情况,但有些情况被遗漏了(例如 grep %$_, @AoH
),即使那些没有被遗漏的情况也得到了改进。
64 位构建上的新快速哈希函数
我们对短键和长键使用不同的哈希函数。这应该会提高性能和安全性,尤其是对于长键。
readline 更快
使用 readline()
或 <>
从文件中逐行读取现在通常更快,因为搜索下一个换行符的代码实现得到了改进。
将一个引用赋值给另一个引用,例如 $ref1 = $ref2
,在某些情况下已经过优化。
移除了一些创建写时复制字符串的例外情况。字符串缓冲区增长算法略有改变,因此您不太可能遇到无法进行写时复制的字符串。
更好地优化数组和哈希赋值:当数组或哈希出现在列表赋值的左侧时,例如 (..., @a) = (...);
,它可能会快得多,尤其是在涉及清空数组/哈希时。例如,与 Perl 5.24.0 相比,这段代码运行速度快了大约三分之一。
my @a;
for my $i (1..10_000_000) {
@a = (1,2,3);
@a = ();
}
将一位数字符串转换为数字现在快得多。
split
内建函数现在在许多情况下速度略快:特别是对于两种特殊处理的形式。
my @a = split ...;
local @a = split ...;
实验性子程序签名功能的相当缓慢的实现已经变得快得多;它现在的速度与传统的 my ($a, $b, @c) = @_
相当。
现在允许裸词常量字符串参与常量折叠。它们最初在 1999 年 8 月(Perl 5.6 开发期间)被免除常量折叠,以确保 use strict "subs"
仍然适用于裸词常量。现在已经通过另一种方式实现了这一点,因此裸词与其他常量一样,现在可以从常量折叠中获得性能优势。
这也意味着裸词常量表达式的空上下文警告现在会报告折叠的常量操作数,而不是操作本身;这与非裸词常量的行为一致。
IO::Compress 已从版本 2.069 升级到 2.074。
Archive::Tar 已从版本 2.04 升级到 2.24。
arybase 已从版本 0.11 升级到 0.12。
attributes 已从版本 0.27 升级到 0.29。
:unique
和 :locked
属性的弃用消息现在提到它们将在 Perl 5.28 中消失。
B 已从版本 1.62 升级到 1.68。
B::Concise 已从版本 0.996 升级到 0.999。
它现在对 op_private
标志的输出更具描述性。
B::Debug 已从版本 1.23 升级到 1.24。
B::Deparse 已从版本 1.37 升级到 1.40。
B::Xref 已从版本 1.05 升级到 1.06。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
base 已从版本 2.23 升级到 2.25。
bignum 已从版本 0.42 升级到 0.47。
Carp 已从版本 1.40 升级到 1.42。
charnames 已从版本 1.43 升级到 1.44。
Compress::Raw::Bzip2 已从版本 2.069 升级到 2.074。
Compress::Raw::Zlib 已从版本 2.069 升级到 2.074。
Config::Perl::V 已从版本 0.25 升级到 0.28。
CPAN 已从版本 2.11 升级到 2.18。
CPAN::Meta 已从版本 2.150005 升级到 2.150010。
Data::Dumper 已从版本 2.160 升级到 2.167。
XS 实现现在支持 Deparse。
DB_File 已从版本 1.835 升级到 1.840。
Devel::Peek 已从版本 1.23 升级到 1.26。
Devel::PPPort 已从版本 3.32 升级到 3.35。
Devel::SelfStubber 已从版本 1.05 升级到 1.06。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
diagnostics 已从版本 1.34 升级到 1.36。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
Digest 已从版本 1.17 升级到 1.17_01。
Digest::MD5 已从版本 2.54 升级到 2.55。
Digest::SHA 已从版本 5.95 升级到 5.96。
DynaLoader 已从版本 1.38 升级到 1.42。
Encode 已从版本 2.80 升级到 2.88。
encoding 已从版本 2.17 升级到 2.19。
此模块的默认模式不再受支持。现在,除非使用 Filter
选项,否则它在导入时会报错。
encoding::warnings 已从版本 0.12 升级到 0.13。
此模块不再受支持。它会发出警告,然后什么也不做。
Errno 已从版本 1.25 升级到 1.28。
现在它记录了使用 %!
会自动为您加载 Errno。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
ExtUtils::Embed 已从版本 1.33 升级到 1.34。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
ExtUtils::MakeMaker 已从版本 7.10_01 升级到 7.24。
ExtUtils::Miniperl 已从版本 1.05 升级到 1.06。
ExtUtils::ParseXS 已从版本 3.31 升级到 3.34。
ExtUtils::Typemaps 已从版本 3.31 升级到 3.34。
feature 已从版本 1.42 升级到 1.47。
File::Copy 已从版本 2.31 升级到 2.32。
File::Fetch 已从版本 0.48 升级到 0.52。
File::Glob 已从版本 1.26 升级到 1.28。
现在针对 File::Glob::glob()
发出弃用消息。
File::Spec 已从版本 3.63 升级到 3.67。
FileHandle 已从版本 2.02 升级到 2.03。
Filter::Simple 已从版本 0.92 升级到 0.93。
它不再将紧随 use MyFilter
之后的 no MyFilter
视为文件结束。 [GH #11853]
Getopt::Long 已从版本 2.48 升级到 2.49。
Getopt::Std 已从版本 1.11 升级到 1.12。
Hash::Util 已从版本 0.19 升级到 0.22。
HTTP::Tiny 已从版本 0.056 升级到 0.070。
内部 599 系列错误现在包含重定向历史记录。
I18N::LangTags 已从版本 0.40 升级到 0.42。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
IO 已从版本 1.36 升级到 1.38。
IO::Socket::IP 已从版本 0.37 升级到 0.38。
IPC::Cmd 已从版本 0.92 升级到 0.96。
IPC::SysV 已从版本 2.06_01 升级到 2.07。
JSON::PP 已从版本 2.27300 升级到 2.27400_02。
lib 已从版本 0.63 升级到 0.64。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
List::Util 已从版本 1.42_02 升级到 1.46_02。
Locale::Codes 已从版本 3.37 升级到 3.42。
Locale::Maketext 已从版本 1.26 升级到 1.28。
Locale::Maketext::Simple 已从版本 0.21 升级到 0.21_01。
Math::BigInt 已从版本 1.999715 升级到 1.999806。
Math::BigInt::FastCalc 已从版本 0.40 升级到 0.5005。
Math::BigRat 已从版本 0.260802 升级到 0.2611。
Math::Complex 已从版本 1.59 升级到 1.5901。
Memoize 已从版本 1.03 升级到 1.03_01。
Module::CoreList 已从版本 5.20170420 升级到 5.20170530。
Module::Load::Conditional 已从版本 0.64 升级到 0.68。
Module::Metadata 已从版本 1.000031 升级到 1.000033。
mro 已从版本 1.18 升级到 1.20。
Net::Ping 已从版本 2.43 升级到 2.55。
现在支持 IPv6 地址和 AF_INET6
套接字,以及其他一些增强功能。
NEXT 已从版本 0.65 升级到 0.67。
Opcode 已从版本 1.34 升级到 1.39。
open 已从版本 1.10 升级到 1.11。
OS2::Process 已从版本 1.11 升级到 1.12。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
overload 已从版本 1.26 升级到 1.28。
其编译速度略有提高。
parent 已从版本 0.234 升级到 0.236。
perl5db.pl 已从版本 1.50 升级到 1.51。
现在它在非 Unix 系统上忽略 /dev/tty。 [GH #12244]
Perl::OSType 已从版本 1.009 升级到 1.010。
perlfaq 已从版本 5.021010 升级到 5.021011。
PerlIO 已从版本 1.09 升级到 1.10。
PerlIO::encoding 已从版本 0.24 升级到 0.25。
PerlIO::scalar 已从版本 0.24 升级到 0.26。
Pod::Checker 已从版本 1.60 升级到 1.73。
Pod::Functions 已从版本 1.10 升级到 1.11。
Pod::Html 已从版本 1.22 升级到 1.2202。
Pod::Perldoc 已从版本 3.25_02 升级到 3.28。
Pod::Simple 已从版本 3.32 升级到 3.35。
Pod::Usage 已从版本 1.68 升级到 1.69。
POSIX 已从版本 1.65 升级到 1.76。
这修复了使其符号可导出的几个缺陷。 [GH #15260]
POSIX::tmpnam()
接口已被移除,请参阅 "POSIX::tmpnam() 已被移除"。
以下已弃用的函数已被移除
POSIX::isalnum
POSIX::isalpha
POSIX::iscntrl
POSIX::isdigit
POSIX::isgraph
POSIX::islower
POSIX::isprint
POSIX::ispunct
POSIX::isspace
POSIX::isupper
POSIX::isxdigit
POSIX::tolower
POSIX::toupper
尝试导入没有实际实现的 POSIX 子例程(例如 POSIX::atend()
)现在会在导入时失败,而不是等到运行时。
re 已从版本 0.32 升级到 0.34
这添加了对新的 /xx
正则表达式模式修饰符的支持,以及对 use re 'strict'
实验功能的更改。当启用 re 'strict'
时,现在将对正则表达式模式中所有未转义的 "}"
和 "]"
字符(在方括号字符类之外)使用产生警告,这些字符将被视为字面量。这使它们更符合 ")"
字符,该字符始终是元字符,除非转义。作为元字符,有时取决于距离的行动,可能会导致模式的含义与预期大不相同,而 re 'strict'
模式旨在最大限度地减少这种情况。
Safe 已从版本 2.39 升级到 2.40。
Scalar::Util 已从版本 1.42_02 升级到 1.46_02。
Storable 已从版本 2.56 升级到 2.62。
修复了 [GH #15714]。
Symbol 已从版本 1.07 升级到 1.08。
Sys::Syslog 已从版本 0.33 升级到 0.35。
Term::ANSIColor 已从版本 4.04 升级到 4.06。
Term::ReadLine 已从版本 1.15 升级到 1.16。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
Test 已从版本 1.28 升级到 1.30。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
Test::Harness 已从版本 3.36 升级到 3.38。
Test::Simple 已从版本 1.001014 升级到 1.302073。
Thread::Queue 已从版本 3.09 升级到 3.12。
Thread::Semaphore 已从 2.12 升级到 2.13。
添加了 down_timed
方法。
threads 已从版本 2.07 升级到 2.15。
threads::shared 已从版本 1.51 升级到 1.56。
Tie::Hash::NamedCapture 已从版本 0.09 升级到 0.10。
Time::HiRes 已从版本 1.9733 升级到 1.9741。
现在可以在使用 C++11 编译器(如 G++ 6 和 Clang++ 3.9)的系统上构建。
现在使用 clockid_t
。
Time::Local 已从版本 1.2300 升级到 1.25。
Unicode::Collate 已从版本 1.14 升级到 1.19。
Unicode::UCD 已从版本 0.64 升级到 0.68。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
version 已从版本 0.9916 升级到 0.9917。
VMS::DCLsym 已从版本 1.06 升级到 1.08。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
warnings 已从版本 1.36 升级到 1.37。
XS::Typemap 已从版本 0.14 升级到 0.15。
XSLoader 已从版本 0.21 升级到 0.27。
修复了安全漏洞,该漏洞允许从 @INC
之外的路径加载二进制文件。
它现在使用 3 参数 open()
而不是 2 参数 open()
。 [GH #15721]
此文件记录了所有即将弃用的功能,以及一些已经移除的弃用功能。此文档的目的是双重的:记录哪些功能将消失以及将在哪个版本消失,并为处理代码的人提供指南,这些代码在升级 Perl 后不再具有某些功能。
我们已尝试更新文档以反映此文档中列出的更改。如果您发现任何遗漏的更改,请发送电子邮件至 [email protected]。
此外,所有对 Usenet 的引用都已删除,并进行了以下选定更改
删除了关于 defined()
在聚合上的过时文本,这些文本应该在该功能被移除时就删除。
更正了 eval()
和 evalbytes()
的文档。
澄清了 seek()
、tell()
和 sysseek()
的文档,强调位置以字节为单位,而不是以字符为单位。 [GH #15438]
澄清了 sort()
的文档,涉及变量 $a
和 $b
。
在 split()
中指出某些模式修饰符是合法的,并添加了关于在 v5.11 之前的 Perl 版本中使用它的警告。
删除了关于 study()
的过时文档,并指出它现在是一个空操作。
注意到 vec()
在字符串包含代码点大于 255 的字符时效果不佳。
添加了关于 Size_t
和 SSize_t
操作数的格式化打印 的建议。
阐明要使用哪些编辑器制表符规则,并指出我们正在迁移,不再使用制表符,而是用空格序列替换它们。
给出了另一个使用 cBOOL
将表达式转换为布尔值的理由。
注意,宏 TRUE
和 FALSE
可用于表示布尔值。
perlinterp 已扩展,以提供更详细的示例,说明如何搜索解析器以了解如何处理给定运算符。
某些语言环境与 Perl 不兼容。请注意,这些语言环境会导致核心转储。
添加了各种说明。
更新了站点镜像列表。
添加了关于使用完全限定名称调用方法的部分。
不要阻止手动使用 @ISA
。
更多地提及 Moo
。
注意,如果分隔符是单词字符(即匹配 \w
),则必须使用空格来引用运算符。
阐明,在由单引号分隔的正则表达式模式中,不会进行变量插值。
第一部分经过了广泛的重写,以整合各种基本要点,这些要点在早期版本中是在关于版本 8 正则表达式的附录中提到的。
请注意,使用 /x
修饰符并忘记这意味着 "#"
必须转义是很常见的。
添加介绍性材料。
请注意,元字符出现在它不能表示该含义的上下文中时,会默默地失去其元字符特性并按字面匹配。 use re 'strict'
可以捕获其中的一些。
更正了关于 Unicode 字节顺序标记处理的文本。
更新了文本以对应于 Unicode UTS#18 中关于正则表达式的更改,以及 Perl 与其说明的兼容性。
记录 @ISA
。它在其他地方有记录,但在 perlvar 中没有。
(A) 您不小心通过 bash 或其他 shell 而不是 Perl 运行了您的脚本。检查 #!
行,或者手动将您的脚本输入 Perl。文件顶部的 #!
行可能如下所示
#!/usr/bin/perl
(A) 您不小心通过 zsh 或其他 shell 而不是 Perl 运行了您的脚本。检查 #!
行,或者手动将您的脚本输入 Perl。文件顶部的 #!
行可能如下所示
#!/usr/bin/perl
(F) 要声明对变量的引用,如 my \%x
,您必须首先启用该特性
no warnings "experimental::declared_refs";
use feature "declared_refs";
参见 "声明对变量的引用"。
在另一个正则表达式中,代码块内的空模式(重新执行最后成功匹配的模式),例如 /(?{ s!!new! })/
,以前总是会导致段错误。现在会产生此错误。
在正则表达式模式的某些上下文中,未转义的左大括号现在是非法的。在其他上下文中,它们仍然只是已弃用;它们将在 Perl 5.30 中变为非法。
(F) 解析器发现一行以 <<<<<<<
、>>>>>>>
或 =======
开头。这些可能是由版本控制系统在合并操作失败后留下的,用于标记冲突。
(S experimental::declared_refs) 如果您在 my()
、state()
、our()
或 local()
的右侧使用引用构造函数,则会发出此警告。如果您想使用此功能,只需抑制警告,但请注意,这样做意味着您正在承担使用实验性功能的风险,该功能可能会在未来的 Perl 版本中发生更改或被删除。
no warnings "experimental::declared_refs";
use feature "declared_refs";
$fooref = my \$foo;
参见 "声明对变量的引用"。
由于 "."
现在默认情况下已从 @INC
中删除,因此 do
现在将触发警告,建议修复 do
语句。
File::Glob::glob()
将在 perl 5.30 中消失。请改用 File::Glob::bsd_glob()
。
从 Perl 5.30 开始,使用未分配的代码点或非独立的字素作为分隔符将成为致命错误
请参阅 "弃用"
当 require
失败时,我们现在不再提供 @INC
,因为 require
是针对文件而不是模块。
当 @INC
未被扫描以进行 require
调用时,我们不再显示 @INC
,以避免混淆。
属性“locked”已弃用,将在 Perl 5.28 中消失
此现有警告已在此版本中添加了“并将消失”文本。
属性“unique”已弃用,将在 Perl 5.28 中消失
此现有警告已在此版本中添加了“并将消失”文本。
调用 POSIX::%s() 已弃用
此警告已移除,因为已弃用的函数已从 POSIX 中移除。
来自可能在其他地方修改的词法变量的常量已弃用。这在 Perl 5.32 中将不被允许。
此现有警告已在此版本中添加了“这将不被允许”文本。
在错误条件中弃用 my()
的使用。这将在 Perl 5.30 中成为致命错误。
此现有警告已在此版本中添加了“这将成为致命错误”文本。
dump()
最好写成 CORE::dump()
。dump()
将在 Perl 5.30 中不再可用。
此现有警告已在此版本中添加了“不再可用”文本。
此消息现在后跟更实用的文本。 [GH #15291]
实验性“%s”子例程未启用。
此警告已移除,因为词法子例程不再是实验性的。
具有多个 /%c 正则表达式修饰符已弃用。
此弃用警告已移除,因为 /xx
现在具有新的含义。
在 :utf8
处理程序上弃用 %s()。这将在 Perl 5.30 中成为致命错误。 .
其中“%s”是 sysread
、recv
、syswrite
或 send
之一。
此现有警告已在此版本中添加了“这将成为致命错误”文本。
此警告现在默认启用,因为所有 deprecated
类别的警告都应该启用。
$*
不再受支持。其使用将在 Perl 5.30 中成为致命错误。
此现有警告已在此版本中添加了“其使用将成为致命错误”文本。
$#
不再受支持。其使用将在 Perl 5.30 中成为致命错误。
此现有警告已在此版本中添加了“其使用将成为致命错误”文本。
有关确切问题的详细信息已添加到此消息的末尾。
此警告过去会警告 require
,即使实际上是 do
正在执行。现在它能正确获取操作名称。
在 charnames 别名定义中使用 NO-BREAK SPACE 已弃用。
此警告已移除,因为此行为现在是错误。
此警告现在包含有问题的子例程的名称。
将目录句柄 %s 也作为文件打开。这将在 Perl 5.28 中成为致命错误。
此现有警告已在此版本中添加了“这将成为致命错误”文本。
将文件句柄 %s 同时打开为目录。这在 Perl 5.28 中将是致命错误。
此现有警告已在此版本中添加了“这将成为致命错误”文本。
panic: ck_split, type=%u
panic: pp_split, pm=%p, s=%p
这些 panic 错误已被移除。
将格式错误的 UTF-8 传递给 "%s" 已被弃用
此警告已更改为致命错误 Malformed UTF-8 string in "%s"
将 $/
设置为对 %s 的引用作为一种吞噬形式已被弃用,将被视为 undef。这在 Perl 5.28 中将是致命错误。
此现有警告在此版本中添加了“这将是致命错误”文本。
${^ENCODING}
不再受支持。在 Perl 5.28 中使用它将是致命错误。
此警告以前是:“设置 ${^ENCODING}
已被弃用”。
变量 ${^ENCODING}
的特殊操作以前用于实现 encoding
pragma。从 Perl 5.26 开始,它不再被弃用,而是对该变量赋值现在没有任何效果,除了发出警告。
此警告现在包含有问题的子例程的名称。
此警告现在包含有问题的子例程的名称。
正则表达式中的未转义左大括号在此处已被弃用(并在 Perl 5.30 中将是致命错误),在正则表达式中传递;在 m/%s/ 中用 <-- HERE 标记。
此现有警告在此版本中添加了“此处(并在...中将是致命错误)”文本。
未知的字符名称 '' 已被弃用。在 Perl 5.28 中使用它将是致命错误。
此现有警告已在此版本中添加了“其使用将成为致命错误”文本。
使用裸 << 表示 <<"" 已被弃用。在 Perl 5.28 中使用它将是致命错误。
此现有警告已在此版本中添加了“其使用将成为致命错误”文本。
使用代码点 0x%s 已被弃用;允许的最大值为 0x%s。这在 Perl 5.28 中将是致命错误。
此现有警告在此版本中添加了“这将是致命错误”文本。
使用无逗号的变量列表已被弃用。在 Perl 5.28 中使用它将是致命错误。
此现有警告已在此版本中添加了“其使用将成为致命错误”文本。
使用非方法 %s() 的继承 AUTOLOAD
已被弃用。这在 Perl 5.28 中将是致命错误。
此现有警告在此版本中添加了“这将是致命错误”文本。
使用代码点超过 0xFF 的字符串作为 %s 运算符的参数已被弃用。这在 Perl 5.28 中将是致命错误。
此现有警告已在此版本中添加了“这将成为致命错误”文本。
这些旧的实用程序早已被 h2xs 取代,现在已从发行版中删除。
删除了多余的可执行位。
考虑 DOS 文件结尾的可能性。
许多改进。
整理文件,重命名一些符号。
用 \w
替换模糊的字符范围。
尝试在测试失败时提供更多帮助。
避免枚举的无限循环。
消息正文中的长行现在在 900 个字符处换行,以保持在 SMTP 邮件传输代理施加的 1000 个字符限制内。这对于 Configure 的参数列表尤其重要,例如,如果它命名了几个非默认的安装路径,该列表很容易超过限制。此更改还为 perlbug 添加了第一个单元测试。 [perl #128020]
-Ddefault_inc_excludes_dot
已添加,并默认启用。
dtrace
构建过程有进一步的更改 [GH #15718]
如果 -xnolibs
可用,请使用它,以便可以在 FreeBSD 监狱中构建 dtrace perl。
在构建 dtrace 对象文件(FreeBSD、Solaris 和 SystemTap 的 dtrace 模拟)的系统上,将输入对象复制到单独的目录中并在那里处理它们,并在链接中使用这些对象,因为 dtrace -G
也会修改这些对象。
在 FreeBSD 10.x 上的构建中添加 libelf,因为 dtrace 添加了对 libelf 符号的引用。
如果 dtrace -G
无法构建它,则生成一个虚拟的 dtrace_main.o。Solaris 上的默认构建会从未使用的内联函数生成探测,而 FreeBSD 上不会,这会导致 dtrace -G
失败。
现在可以通过在配置 perl 时使用 -Accflags=NO_PERL_HASH_ENV
来禁用 perl 对 PERL_HASH_SEED
和 PERL_PERTURB_KEYS
环境变量的使用。
现在可以通过在配置 perl 时使用 -Accflags=-DNO_PERL_HASH_SEED_DEBUG
来禁用 perl 对 PERL_HASH_SEED_DEBUG
环境变量的使用。
Configure 现在在计算 80 位 NaN
和 Inf
的字节数时会将对齐字节清零,以使构建更具可重复性。 [GH #15725]
从 v5.18 开始,为了测试目的,我们包含了对使用各种非标准且不推荐的哈希函数构建 perl 的支持。由于我们不建议使用这些函数,因此我们已将其及其相应的构建选项删除。具体来说,这包括以下构建选项
PERL_HASH_FUNC_SDBM
PERL_HASH_FUNC_DJB2
PERL_HASH_FUNC_SUPERFAST
PERL_HASH_FUNC_MURMUR3
PERL_HASH_FUNC_ONE_AT_A_TIME
PERL_HASH_FUNC_ONE_AT_A_TIME_OLD
PERL_HASH_FUNC_MURMUR_HASH_64A
PERL_HASH_FUNC_MURMUR_HASH_64B
删除“警告:perl 似乎在您的路径中”
此安装警告或多或少已经过时,因为大多数平台已经会提供由操作系统提供的 /usr/bin/perl 或类似的程序。
减少 make install.man
的详细程度
以前,每个手册页都会发出两条进度消息:一条由 installman 本身发出,另一条由它调用的 install_lib.pl 中的函数发出,用于实际安装文件。在每种情况下禁用第二个消息可以节省超过 750 行无用的输出。
清理以支持 clang -Weverything
。 [GH #15683]
Configure:signbit 扫描假设太多,停止假设负 0。
已消除各种编译器警告。
已进行了一些较小的更改,以消除在 C++11 下编译的障碍。
使用 USE_PAD_RESET
的构建现在再次有效;此配置已过时。
在 Configure 中添加了对 gai_strerror
的探测,以检查 gai_strerror()
例程是否可用,以及是否可用于将 getaddrinfo()
返回的错误代码转换为人类可读的字符串。
如果同时请求 -Duselongdouble
和 -Dusequadmath
,Configure 现在将中止。 [GH #14944]
修复了 Configure 可能将 -quadmath
附加到 archname 的错误,即使它已经存在。 [GH #15423]
已修复使用 -DPERL_GLOBAL_STRUCT
或 -DPERL_GLOBAL_STRUCT_PRIVATE
的 Clang 构建(通过为这些配置禁用线程安全分析)。
make_ext.pl 现在不再在没有文件需要更新时更新模块的 pm_to_blib 文件。这可能会导致依赖项(特别是 perlmain.c)被不必要地重建。 [GH #15060]
perl -V
的输出已重新格式化,以便每个配置和编译时选项现在都列在一行上,以提高可读性。
配置现在如果使用-Dusecrosscompiler
但没有使用-Dtargethost=somehost
,就会构建miniperl
和generate_uudmap
。这意味着您可以提供目标平台的config.sh
,生成头文件并继续构建您的交叉目标perl。 [GH #15126]
使用-Accflags=-DPERL_TRACE_OPS
构建的Perl现在只在环境变量PERL_TRACE_OPS
设置为非零整数时才会转储操作计数。这允许make test
在这样的构建上通过。
在使用GCC 6和链接时优化(gcc
的-flto
选项)构建时,配置将所有探测到的符号视为系统上存在,无论它们是否实际存在。这个问题已经修复。 [GH #15322]
t/test.pl库用于Perl本身的内部测试,也被一些CPAN模块复制。其中一些模块必须在旧版本的Perl上工作,因此t/test.pl必须反过来避免使用较新的Perl特性。与Perl 5.8的兼容性在一段时间前被无意中删除了;现在它已经被恢复了。 [GH #15302]
构建过程不再在构建每个“简单”扩展(只有*.pm和*.pod文件)之前发出额外的空行。
测试被添加和更改以反映此版本中的其他添加和更改。此外,还进行了以下实质性更改
添加了一个新的测试脚本comp/parser_run.t,它类似于comp/parser.t,但包含了test.pl,以便runperl()
等可以使用。
用于区域设置的测试错误地使用了与Perl不兼容的区域设置。
测试套件中的一些部分试图对正则表达式实现中的边缘情况进行详尽的测试,已被限制为最多运行五分钟。在速度较慢的系统上,它们可能会花费几个小时,而不会显著提高我们对被测代码正确性的理解。
一个新的内部工具允许分析Perl自身测试套件中各个测试所花费的时间;请参见Porting/harness-timer-report.pl。
t/re/regexp_nonull.t已被添加以测试正则表达式引擎是否可以处理在字符串末尾没有空字节的标量。
添加了一个新的测试脚本,t/op/decl-refs.t,用于测试新功能 "声明对变量的引用"。
添加了一个新的测试脚本,t/re/keep_tabs.t,用于包含测试,其中 \t
字符不应扩展为空格。
添加了一个新的测试脚本,t/re/anyof.t,用于测试由方括号字符类生成的 ANYOF 节点是否符合预期。
现在对与 Unicode 相关的 API 宏和函数进行了更广泛的测试。
一些运行时间较长的 API 测试文件已被拆分为多个测试文件,以便可以并行运行它们。
t/harness 现在尽力避免运行位于 Perl 源代码树之外的测试。 [GH #14578]
防止调试器测试(lib/perl5db.t)因 $ENV{PERLDB_OPTS}
的内容而失败。 [GH #15782]
Perl 现在可以在 VAX 机器上的 NetBSD 上编译。但是,该平台无法实现与大多数现代系统兼容的浮点无穷大和 NaN,这些系统实现了 IEEE-754 浮点标准。十六进制浮点数(0x...p[+-]n
字面量,printf %a
)也没有实现。make test
通过了 98% 的测试。
测试修复和次要更新。
考虑缺乏 inf
、nan
和 -0.0
支持。
不要将 -Dprefix=/usr
视为特殊情况:而是需要额外的选项 -Ddarwin_distribution
才能产生相同的结果。
OS X El Capitan 未实现 clock_gettime()
或 clock_getres()
API;根据需要模拟它们。
macOS 10.12 上已弃用 syscall(2)
。
一些测试已更新以在 EBCDIC 平台上工作(或被跳过)。
Net::Ping UDP 测试现在在 HP-UX 上被跳过。
Hurd 的提示已得到改进,支持 malloc 包装并报告使用的 GNU libc(以前报告为空字符串)。
NetBSD 现在支持 VAX 浮点格式。
在 Unix shell 下运行时,PERL5LIB
和 PERLLIB
环境条目中的路径分隔符现在为冒号 (":"
)。在 DCL 下运行时没有变化(仍然是 "|"
)。
configure.com 现在识别 VSI 品牌的 C 编译器,不再识别“DEC”品牌的 C 编译器(因为 15 年或更长时间以来就没有这样的编译器了)。
添加了使用 Microsoft Visual Studio 2015(包含 Visual C++ 14.0)在 Windows 上编译 perl 的支持。
此版本的 VC++ 包含一个完全重写的 C 运行时库,其中的一些更改意味着在 perl #120091 和 perl #118059 中解决套接字 close()
错误所做的工作,在当前状态下无法与此版本的 VC++ 一起使用。因此,我们实际上已针对 VS2015 及更高版本恢复了该错误修复,因为能够使用 VS2015 及更高版本比保留错误修复更重要。我们可能会在将来重新审视这个问题,尝试以与 VS2015 兼容的方式再次修复该错误。
这些更改不会影响使用 GCC 或 Visual Studio 版本(包括 VS2013)进行编译,即,对于这些编译器,错误修复将保留(不变)。
请注意,如果您将使用 GCC 或 VS <= VS2013 构建的 perl 与使用 VS2015 构建的 XS 模块混合使用,或者如果您将使用 VS2015 构建的 perl 与使用 GCC 或 VS <= VS2013 构建的 XS 模块混合使用,您可能会遇到兼容性问题。一些不兼容性可能是由于针对 VS2015 构建的 perl 恢复的错误修复造成的,但由于 VS2015 中的重写 CRT,也可能存在不兼容性(例如,请参阅 http://stackoverflow.com/questions/30412951 中的讨论)。
它现在会自动检测 GCC 与 Visual C,并在 Win32 上设置 VC 版本号。
放弃对 Linux a.out 可执行文件格式的支持。Linux 已使用 ELF 超过 20 年。
OpenBSD 6 仍然不支持使用 SA_SIGINFO
返回 pid
、gid
或 uid
。请确保对此进行处理。
t/uni/overload.t:跳过 FreeBSD 上挂起的测试。
DragonFly BSD 现在支持 setproctitle()
。 [GH #15703].
一个新的 API 函数 sv_setpv_bufsize()
允许同时设置 SV
中缓冲区的长度和分配大小,并在必要时扩展缓冲区。
一个新的 API 宏 SvPVCLEAR()
将其 SV
参数设置为一个空字符串,类似于 Perl 空间中的 $x = ''
,但具有多个优化。
API 中添加了几个用于处理 Unicode 和 UTF-8 编码字符串的新宏和函数,以及一些现有函数功能的更改(有关更多详细信息,请参阅 "Unicode 支持" in perlapi)
添加了 API 宏的新版本,例如 isALPHA_utf8
和 toLOWER_utf8
,每个版本都带有 _safe
后缀,例如 isSPACE_utf8_safe
。这些宏需要一个额外的参数,指定可以安全读取字符串的范围。如果 UTF-8 格式不正确,使用旧版本可能会导致尝试读取超出输入缓冲区末尾的内容,并且现在使用它们会引发弃用警告。详细信息请参阅 "字符分类" in perlapi。
像 isALPHA_utf8
和 toLOWER_utf8
这样的宏现在会在检测到其输入 UTF-8 格式错误时引发异常。从 Perl 5.18 开始,已经发出弃用警告。
几个用于分析 utf8 序列有效性的新宏。这些是
UTF8_GOT_ABOVE_31_BIT
UTF8_GOT_CONTINUATION
UTF8_GOT_EMPTY
UTF8_GOT_LONG
UTF8_GOT_NONCHAR
UTF8_GOT_NON_CONTINUATION
UTF8_GOT_OVERFLOW
UTF8_GOT_SHORT
UTF8_GOT_SUPER
UTF8_GOT_SURROGATE
UTF8_IS_INVARIANT
UTF8_IS_NONCHAR
UTF8_IS_SUPER
UTF8_IS_SURROGATE
UVCHR_IS_INVARIANT
isUTF8_CHAR_flags
isSTRICT_UTF8_CHAR
isC9_STRICT_UTF8_CHAR
这些函数都是 is_utf8_string_*()
函数的扩展,它们对被识别为有效的 UTF-8 应用了各种限制
is_strict_utf8_string
, is_strict_utf8_string_loc
, is_strict_utf8_string_loclen
,
is_c9strict_utf8_string
,is_c9strict_utf8_string_loc
,is_c9strict_utf8_string_loclen
,
is_utf8_string_flags
,is_utf8_string_loc_flags
,is_utf8_string_loclen_flags
,
is_utf8_fixed_width_buf_flags
,is_utf8_fixed_width_buf_loc_flags
,is_utf8_fixed_width_buf_loclen_flags
。
is_utf8_invariant_string
。 is_utf8_valid_partial_char
。 is_utf8_valid_partial_char_flags
。
函数 utf8n_to_uvchr
及其衍生函数的行为发生了若干变化。
在 DEBUGGING 版本中,调用它们时,如果传递的字符串长度为 0,则会断言,否则会返回 Unicode 替换字符。如果你没有要解码的内容,就不应该调用解码函数。
如果调用时传入的 UTF-8 存在超长畸形,并且该畸形被输入参数允许,它们现在会返回 Unicode 替换字符。这种畸形是指 UTF-8 在语法上看起来有效,但存在更短的序列可以生成相同的代码点。自 Unicode 版本 3.1 以来,这种畸形就被禁止了。
它们现在接受一个输入标志来允许溢出畸形。这种畸形是指 UTF-8 在语法上可能有效,但它所代表的代码点无法在平台上的字长中表示。在这种情况下,“允许”的意思是,函数不会返回错误,并且会将解析指针移到有问题的 UTF-8 之后,但会返回 Unicode 替换字符作为代码点的值(因为真实值无法表示)。
它们不再在遇到第一个畸形时就放弃搜索其他畸形。因此,调用这些函数之一可能会生成多个诊断信息,而不仅仅是一个。
valid_utf8_to_uvchr()
已添加到 API 中(尽管它之前在核心代码中存在)。与 utf8_to_uvchr_buf()
相似,但假设下一个字符是格式良好的。请谨慎使用。
添加了一个新函数 utf8n_to_uvchr_error
,供需要了解 UTF-8 畸形细节的模块使用,而不仅仅是通过/失败。以前,了解序列畸形原因的唯一方法是捕获和解析生成的诊断信息,或者进行自己的分析。
现在有一个更安全的 utf8_hop() 版本,称为 utf8_hop_safe()
。与 utf8_hop() 不同,utf8_hop_safe() 不会在提供的缓冲区开始之前或结束之后导航。
新增了两个函数,utf8_hop_forward()
和 utf8_hop_back()
,它们类似于 utf8_hop_safe()
,但用于你知道要移动的方向的情况。
新增了两个宏,它们返回有用的 utf8 字节序列
Perl 现在默认情况下使用 PERL_OP_PARENT
编译器定义进行构建。要禁用它,请使用 PERL_NO_OP_PARENT
编译器定义。此标志会更改 OP
结构中 op_sibling
字段的使用方式,并且从 perl 5.22 开始可以选择使用。
有关此构建选项的更多详细信息,请参阅 perl5220delta 中的“内部更改”。
新增了三个操作符,OP_ARGELEM
、OP_ARGDEFELEM
和 OP_ARGCHECK
。它们主要用于实现子例程签名的各个元素,以及任何所需的整体检查。
OP_PUSHRE
操作符已被删除,OP_SPLIT
操作符已从 LISTOP
类更改为 PMOP
类。
以前,split
的第一个子节点将是一个 pushre
,它将附带 split
的正则表达式。现在,正则表达式直接附加到 split
操作符,并且 pushre
已被删除。
新增了 op_class()
API 函数。它类似于现有的 OP_CLASS()
宏,但可以更准确地确定操作符分配的结构。例如,OP_CLASS()
可能返回 OA_BASEOP_OR_UNOP
,表示此类型的操作符通常分配为 OP
或 UNOP
;而 op_class()
将根据情况返回 OPclass_BASEOP
或 OPclass_UNOP
。
内部的所有部分现在都一致认为 sassign
操作符是一个 BINOP
;以前它在 regen/opcodes 中被列为 BASEOP
,这意味着内部的几个部分必须进行特殊处理才能适应它。这种奇特的最初动机是处理类似 $x ||= 1
的代码;现在以更简单的方式处理。
函数(由 op_dump()
perl -Dx
使用)的输出格式已更改:现在显示“ASCII 艺术”树结构,并显示有关每个操作的更多低级详细信息,例如其地址和类。
PADOFFSET
类型已从无符号更改为有符号,并且几个与填充相关的变量(例如 PL_padix
)已从 I32
类型更改为 PADOFFSET
类型。
增强了正则表达式编译和执行的 DEBUGGING
模式输出。
已消除几个不常用的 SV 标志,有时还消除了操作它们的宏:SVpbm_VALID
、SVpbm_TAIL
、SvTAIL_on
、SvTAIL_off
、SVrepl_EVAL
、SvEVALED
。
已消除一个 OP op_private
标志:OPpRUNTIME
。它过去常在 PMOP
操作中设置,但随着时间的推移已变得毫无意义。
在具有 libc 中有错误的 strxfrm()
实现的机器上,Perl 在切换到某些区域设置时不再出现恐慌。 [GH #13768]
如果正则表达式没有命名捕获, $-{$name}
将在每次访问时泄漏一个 AV
。同样适用于使用 Tie::Hash::NamedCapture 和 all => 1
绑定的任何哈希的访问。 [GH #15882]
尝试在间接对象方法调用中使用已弃用的变量 $#
作为对象会导致堆使用后释放或缓冲区溢出。 [GH #15599]
在检查间接对象方法调用时,在某些罕见情况下,解析器可能会重新分配行缓冲区,但随后继续使用指向旧缓冲区的指针。 [GH #15585]
将 glob 作为格式参数提供给 formline
会导致断言失败。 [GH #15862]
类似 $value1 =~ qr/.../ ~~ $value2
的代码将匹配转换为 qr//
运算符,在堆栈上留下额外的元素以混淆任何周围的表达式。 [GH #15859]
从 v5.24 开始,在某些不常见的情况下,包含来自多个来源(例如,通过 qr//
对象嵌入)的代码块的正则表达式最终可能会使用错误的当前填充并崩溃或给出奇怪的结果。 [GH #15657]
偶尔,模式中代码块中的 local()
在模式匹配回溯到代码块时没有被撤消。 [GH #15056]
使用 substr()
修改魔法变量在某些情况下可能会访问已释放的内存。 [GH #15871]
在 use utf8
下,现在检查整个源代码是否为 UTF-8 格式良好,而不仅仅像以前那样检查引用的字符串。 [GH #14973].
在 unicode_strings
特性作用域内,字符串上的范围运算符 ".."
现在可以正确处理其参数。之前的行为非常出乎意料,我们认为没有正确的程序可以利用它。
split
运算符在标量上下文中没有确保为其返回值分配足够的内存空间。它可能会在为堆栈分配的内存块的末尾立即写入单个指针。 [GH #15749]
在当前输出位置与正确位置对齐的情况下,使用 "W"
打包模板字符的大代码点可能会导致在分配的缓冲区末尾立即写入单个零字节。 [GH #15572]
在格式参数列表中提供格式的图片参数,其中图片指定修改参数,可能会导致访问新释放的已编译格式。 [GH #15566]
sort() 运算符的内置数字比较函数无法处理不能完全用双精度数表示的大整数。现在使用与实现 <>
运算符相同的代码。 [GH #15768]
修复了 /(?{ ... <<EOF })/
的问题,这些问题破坏了 Method::Signatures。 [GH #15779]
修复了 chop
和 chomp
的断言失败,这可能是由 chop(@x =~ tr/1/1/)
触发的。 [GH #15738].
修复了 /x
下模式中的注释跳过错误;它可能过早地停止跳过一个字节,这可能在 UTF-8 字符的中间。 [GH #15790].
perldb 现在在非 Unix 系统上忽略 /dev/tty。 [GH #12244];
修复了 $x
未定义时 {}->$x
的断言失败。 [GH #15791].
修复了在模式中的前瞻字符串超过最小长度时可能触发的断言错误。 [GH #15796].
每个文字数字只警告一次关于错误放置的 "_"
。 [GH #9989].
tr///
解析代码在解析错误后可能正在查看未初始化的数据。 [GH #15624].
在模式匹配中,对未匹配捕获的反向引用 (\1
) 可能会读取超出正在匹配的字符串的开头。 [GH #15634].
use re 'strict'
应该警告你是否使用范围(例如 /(?[ [ X-Y ] ])/
),其起始和结束数字不是来自同一组 10。它没有对从 U+1D7E
开始的五组数学数字执行此操作。
包含具有相同名称的“forward”声明的子例程(例如,sub c { sub c; }
)有时可能会崩溃或无限循环。 [GH #15557]
修复了在对也使用 UTF-8 的目标字符串执行使用非锚定 UTF-8 子字符串的正则表达式时发生的崩溃。 [GH #15628]
以前,类似于 #!perl -i u
的 Shebang 行可能会被错误地解释为请求 -u
选项。此问题已修复。 [GH #15623]
以前,正则表达式引擎在某些罕见情况下会产生不正确的结果,这些情况下是在回溯到仅匹配一项的交替时发生的。这表现为捕获缓冲区($1
、$2
等)错误地包含来自未实际执行的正则表达式执行路径的数据。 [GH #15666]
某些使用实验性 regex_sets
功能的正则表达式可能会触发断言失败。此问题已修复。 [GH #15620]
对引用构造函数的无效赋值(例如,\eval=time
)有时可能会在出现语法错误之外还会导致崩溃。 [GH #14815]
如果在 evalbytes
之后出现裸词,解析器有时可能会崩溃。 [GH #15586]
如果在将调用者祝福到的包中存在存根,则通过方法调用进行自动加载会在存在存根的情况下错误地发出警告(“对非方法使用继承的 AUTOLOAD”)。在这种情况下,不再发出警告。 [GH #9094]
对具有不存在元素的数组使用 splice
可能会导致其他运算符崩溃。 [GH #15577]
当模式包含固定的 utf8 子字符串时,可能会发生缓冲区溢出。 [GH #15534]
修复了 Perl 词法分析器中的两个可能的 use-after-free 错误。 [GH #15549]
修复了 s///l
在它认为自己正在处理 UTF-8 但实际上并非如此时发生的崩溃。 [GH #15543]
修复了正则表达式解析器在语法错误的模式上未正确设置语法错误的地方。 [GH #15565]
&.
运算符(以及 "&"
运算符,当它将参数视为字符串时)如果至少有一个字符串在内部标记为 utf8,则无法追加尾随空字节。许多代码路径(系统调用、正则表达式编译)仍然期望在逻辑字符串末尾的字符串缓冲区中存在一个空字节。结果是断言失败。 [GH #15606]
在解析器中创建语法无效的 heredoc 错误消息时,避免出现堆后使用错误。 [GH #15527]
修复在 DEBUGGING 构建中使用 -DC
选项运行时的段错误。 [GH #15563]
修复了子例程属性中解析器错误处理,针对没有结束 '")"
' 的 ':attr(foo
'。
修复 perl 词法分析器,使其能够正确处理在引号字符串上下文中作为最后一个字符的反斜杠。这实际上修复了两个错误,[GH #15546] 和 [GH #15582]。
在 API 函数 gv_fetchmethod_pvn_flags
中,重新设计分隔符解析以防止使用无效的 len
参数可能发生的字符串溢出。 [GH #15598]
解决就地数组排序问题:类似 @a = sort { ... } @a
的代码,其中排序的源和目标是同一个普通数组,被优化为减少复制操作。这种优化有两个副作用:排序例程看到的 @a
内容被部分排序;并且在某些情况下,在排序期间访问 @a
会导致解释器崩溃。这两个问题都已修复,排序函数会看到 @a
的原始值。 [GH #15387]
非 ASCII 字符串分隔符现在在未终止字符串的错误消息中得到正确报告。 [GH #15469]
pack("p", ...)
以前在某些情况下会错误地发出警告(“尝试将指针打包到临时值”),但现在已修复。
@DB::args
现在免受“仅使用一次”警告。警告仅在 -w 下出现,因为 warnings.pm 本身多次使用 @DB::args
。
如果变量之前没有被提及,在双引号字符串中使用内置数组或哈希切片不再发出警告(“可能存在意外插值...”)。这影响了类似 qq|@DB::args|
和 qq|@SIG{'CHLD', 'HUP'}|
的代码。(特殊变量 @-
和 @+
已经免受警告。)
gethostent
和类似函数现在在内部执行空值检查,以避免在使用 torsocks 库时崩溃。这是从 v5.22 开始的回归。 [GH #15478]
defined *{'!'}
、defined *{'['}
和 defined *{'-'}
如果相关类型全局变量以前从未被访问过,现在不再泄漏内存。
在调试构建中,在同一行中连续两次提及同一个常量(这是一个语法错误)不再导致断言失败。这是从 v5.20 开始的回归。 [GH #15017]
修复了与十六进制浮点数printf "%a"
相关的许多问题。此外,现在支持“次正规数”(以前称为“非正规数”)浮点数,包括普通 IEEE 754 浮点数(64 位或 128 位)和 x86 80 位“扩展精度”。请注意,次正规十六进制浮点数字面量会发出有关“指数下溢”的警告。 [GH #15495] [GH #15503] [GH #15504] [GH #15505] [GH #15510] [GH #15512]
修复了 v5.24 中 tr/\N{U+...}/foo/
的回归问题,其中代码点介于 128 和 255 之间。 [GH #15475].
在允许此操作的平台上,现在可以使用代码点高于 2**31 的字符串分隔符。以前,由于截断,某些字符会与具有特殊含义的其他分隔符字符混淆(例如 m?...?
中的 "?"
),导致行为不一致。请注意,这不可移植,并且基于 Perl 对 UTF-8 的扩展,可能无法在任何编辑器中显示或输入。 [GH #15477]
@{x
后面跟着一个换行符,其中 "x"
代表一个控制字符或非 ASCII 字符,不再产生乱码的语法错误消息或崩溃。 [GH #15518]
修复了 %: = 0
的断言失败。 [GH #15358]
在 Perl 5.18 中,"$foo::$bar"
的解析意外更改,使其被视为 $foo."::".$bar
。已恢复之前的行为,即将其解析为 $foo:: . $bar
。 [GH #15408]
从 Perl 5.20 开始,当使用 -x 开关调用 perl 时,行号会偏离一个。此问题已修复。 [GH #15413]
在已删除的存储区中激活子例程存根(例如,delete $My::{"Foo::"}; \&My::Foo::foo
)不再导致崩溃。它在 Perl 5.18 中开始崩溃。 [GH #15420]
一些罕见情况下,子例程和文件句柄同时被释放会导致崩溃,但已修复。崩溃是在 Perl 5.22 中引入的。 [GH #15435]
查找与未初始化值关联的变量名的代码可能会在涉及魔术的情况下导致断言失败,例如 $ISA[0][0]
。此问题现已修复。 [GH #15364]
修复了由生成警告“子例程 STASH::NAME 重新定义”的代码引起的崩溃,例如 sub P::f{} undef *P::; *P::f =sub{};
。在这些情况下,如果 STASH 丢失,警告现在将显示为“子例程 NAME 重新定义”。 [GH #15368]
修复了由处理格式中已弃用行为的一些代码触发的断言,例如,在以下情况下
format STDOUT =
@
0"$x"
在 Windows 上的字符串转换代码中,已避免了可能的除零错误,修复了在整理空字符串时发生的崩溃。 [GH #15439]
一些正则表达式解析故障可能导致使用诸如 /(?<=/
和 /(?<!/
之类的正则表达式出现断言失败。现在已修复此问题。 [GH #15332]
until ($x = 1) { ... }
和 ... until $x = 1
现在在启用语法警告时会正确发出警告。 [GH #15138]
socket()
现在在失败时将系统返回的错误代码保留在 $!
中。 [GH #15383]
在 bitwise
特性下,如果左侧是数组或哈希,则任何按位运算符的赋值变体都会崩溃。 [GH #15346]
require
后面跟着一个冒号(如 foo() ? require : ...
)现在被正确解析为带有隐式 $_
的 require
,而不是 require ""
。 [GH #15380]
标量 keys %hash
现在可以在所有标量左值上下文中一致地赋值。以前它在某些上下文中有效,但在其他上下文中无效。
将列表赋值给 vec
或 substr
,其第一个参数为数组或哈希,以前会导致运行时崩溃或“无法强制转换”错误消息,这与标量赋值不同,标量赋值会在编译时给出错误。列表赋值现在也会在编译时给出错误。 [GH #15370]
包含 &&
或 ||
运算符(或其同义词 and
和 or
)的表达式在某些情况下被错误地编译。如果左侧包含否定裸字常量或包含常量表达式的否定 do {}
块,而右侧包含否定不可折叠表达式,则其中一个否定实际上被忽略。对于 if
和 unless
语句修饰符也是如此,尽管左右两侧已交换。这个长期存在的错误现在已修复。 [GH #15285]
reset
带有参数在遇到除全局变量以外的存储区条目时不再崩溃。 [GH #15314]
将哈希赋值给名为 *::::::
的类型全局变量,以及删除这些类型全局变量,不再会导致崩溃。 [GH #15307]
Perl 没有正确处理列表赋值左侧的真/假值;特别是布尔运算符返回的真值。这可能会在以下类似情况下触发断言失败
for ($x > $y) {
($_, ...) = (...); # here $_ is aliased to a truth value
}
这是从 v5.24 开始的回归。 [GH #15690]
断言失败,原因是用户定义的类 Unicode 属性。 [GH #15696]
修复正则表达式中未关闭的 \N{
的错误消息。未关闭的 \N{
可能会给出错误的错误消息:"\N{NAME} must be resolved by the lexer"
。
在列表上下文中进行列表赋值,其中左侧包含聚合,并且右侧元素不足,以前会跳过标量左值。以前,(($a,$b,@c,$d) = (1))
在列表上下文中返回 ($a)
;现在它返回 ($a,$b,$d)
。(($a,$b,$c) = (1))
保持不变:它仍然返回 ($a,$b,$c)
。这可以在以下示例中看到
sub inc { $_++ for @_ }
inc(($a,$b,@c,$d) = (10))
以前,($a,$b,$d)
的值将保留为 (11,undef,undef)
;现在它们是 (11,1,1)
。
像这样的代码:/(?{ s!!! })/
当作用域内的最后一个成功模式本身时,可能会在 C 堆栈(而不是正常的 perl 堆栈)上触发无限递归。我们通过简单地禁止在解析为当前正在执行的模式时使用空模式来避免段错误。 [GH #15669]
当行缓冲区末尾有短 UTF-8 字符时,避免在 perl 的词法分析器中读取超出行缓冲区末尾。 [GH #15531]
正则表达式中的交替有时无法将 utf8 字符串与 utf8 交替匹配。 [GH #15680]
使 do "a\0b"
失败并静默(并返回 undef
并设置 $!
),而不是抛出错误。 [GH #15676]
chdir
没有参数没有确保有足够的堆栈空间来返回其结果。 [GH #15569]
所有与 do
相关的错误消息现在都引用 do
;以前有些声称来自 require
。
执行 undef $x
,其中 $x
被绑定或具有魔法,不再错误地将变量归咎于绑定/魔法代码遇到的未初始化值警告。
像 $x = $x . "a"
这样的代码在 $x
是具有未定义值的词法变量时,错误地无法产生 使用未初始化值 警告。现在已修复。 [GH #15269]
undef *_; shift
或 undef *_; pop
在子例程中,没有参数传递给 shift
或 pop
,在 Perl 5.14 中开始崩溃,但现在已修复。
"string$scalar->$*"
现在如果 $scalar->$*
返回一个重载对象,则会正确地优先选择连接重载而不是字符串重载,使其与 $$scalar
保持一致。
/@0{0*->@*/*0
和类似的扭曲代码以前会导致崩溃,但现在不会了,只会产生语法错误。 [GH #15333]
do
或 require
使用一个引用或类型全局变量作为参数,该参数在字符串化时包含一个空字符,在 Perl 5.20 中开始崩溃,但现在已修复。 [GH #15337]
改进缺少 tie()
包/方法的错误消息。这使错误消息与用于普通方法调用的错误消息保持一致。
解析错误的 POSIX 字符类不再导致内存泄漏。 [GH #15382]
G++ 6 处理次正规(非规格化)浮点数的方式不同于 gcc 6 或 g++ 5,导致“清零”。最终结果是,如果您使用十六进制浮点格式指定非常小的值,例如 0x1.fffffffffffffp-1022
,它们将变为零。 [GH #15990]
修复了递归正则表达式的问题。该行为在 Perl 5.24 中已修复。 [GH #14935]
Jon Portnoy (AVENJ),一位多产的 Perl 作者和备受尊敬的 Gentoo 社区成员,于 2016 年 8 月 10 日去世。所有与他接触过的人都会怀念他,他的智慧、机智和精神会永远留存。
我们也怀着沉痛的心情,哀悼 Kip Hampton 的逝世。他最广为人知的是 XML.com 上 Perl & XML 专栏的作者,他是 AxKit 的核心贡献者,AxKit 是一个 XML 服务器平台,后来成为 Apache 基金会的项目。在 OSCON 的早期,他经常发言,最近一次是在麦迪逊的 YAPC::NA 上。他经常在 irc.perl.org 上以 ubu 的身份出现,通常在 #axkit-dahut 社区,该社区负责 2011 年在阿什维尔的 YAPC::NA。
Kip 和他对社区的持续贡献将被深深地怀念。
Perl 5.26.0 代表了自 Perl 5.24.0 发布以来的大约 13 个月的开发,包含了来自 86 位作者的 2,600 个文件中的大约 360,000 行代码变更。
不包括自动生成的代码、文档和发布工具,对 1,800 个 .pm、.t、.c 和 .h 文件进行了大约 230,000 行代码变更。
Perl 进入第三个十年,依然蓬勃发展,这得益于充满活力的用户和开发者社区。以下人员为 Perl 5.26.0 的改进做出了贡献。
Aaron Crane, Abigail, Ævar Arnfjörð Bjarmason, Alex Vandiver, Andreas König, Andreas Voegele, Andrew Fresh, Andy Lester, Aristotle Pagaltzis, Chad Granum, Chase Whitener, Chris 'BinGOs' Williams, Chris Lamb, Christian Hansen, Christian Millour, Colin Newell, Craig A. Berry, Dagfinn Ilmari Mannsåker, Dan Collins, Daniel Dragan, Dave Cross, Dave Rolsky, David Golden, David H. Gutteridge, David Mitchell, Dominic Hargreaves, Doug Bell, E. Choroba, Ed Avis, Father Chrysostomos, François Perrad, Hauke D, H.Merijn Brand, Hugo van der Sanden, Ivan Pozdeev, James E Keenan, James Raspass, Jarkko Hietaniemi, Jerry D. Hedden, Jim Cromie, J. Nick Koston, John Lightsey, Karen Etheridge, Karl Williamson, Leon Timmermans, Lukas Mai, Matthew Horsfall, Maxwell Carey, Misty De Meo, Neil Bowers, Nicholas Clark, Nicolas R., Niko Tyni, Pali, Paul Marquess, Peter Avalos, Petr Písař, Pino Toscano, Rafael Garcia-Suarez, Reini Urban, Renee Baecker, Ricardo Signes, Richard Levitte, Rick Delaney, Salvador Fandiño, Samuel Thibault, Sawyer X, Sébastien Aperghis-Tramoni, Sergey Aleynikov, Shlomi Fish, Smylers, Stefan Seifert, Steffen Müller, Stevan Little, Steve Hay, Steven Humphrey, Sullivan Beck, Theo Buehler, Thomas Sibley, Todd Rinaldo, Tomasz Konojacki, Tony Cook, Unicode Consortium, Yaroslav Kuzmin, Yves Orton, Zefram.
上面的列表几乎肯定是不完整的,因为它是由版本控制历史自动生成的。特别是,它不包括向 Perl 错误跟踪器报告问题的贡献者(非常感谢)的姓名。
此版本中包含的许多更改源自 Perl 内核中包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
有关 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码分发中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可以在 https://rt.perl.org/ 上查看 perl 错误数据库。您也可以在 https://www.perl5.cn/(Perl 主页)上找到信息。
如果您认为您遇到了未报告的错误,请运行随您的版本一起提供的 perlbug 程序。请务必将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected]
,由 Perl 移植团队进行分析。
如果您报告的错误存在安全隐患,不适合发送到公开存档的邮件列表,请参阅 "perlsec 中的 SECURITY VULNERABILITY CONTACT INFORMATION",了解如何报告该问题。
如果您想感谢 Perl 5 移植者在 Perl 5 中所做的工作,您可以运行 perlthanks
程序。
perlthanks
这将向 Perl 5 Porters 列表发送一封电子邮件,以表达您的感谢。
有关更改内容的详细说明,请参阅Changes文件。
有关如何构建 Perl 的说明,请参阅INSTALL文件。
有关一般信息,请参阅README文件。
有关版权信息,请参阅Artistic和Copying文件。