perl5380delta - perl v5.38.0 的新增内容
本文档描述了 5.36.0 版本和 5.38.0 版本之间的差异。
class
特性现在提供了一种用于定义对象类的实验性新语法,其中每个实例的数据存储在表现得像词法单元的“字段”变量中。
use feature 'class';
class Point
{
field $x;
field $y;
method zero { $x = $y = 0; }
}
这在 perlclass 中有更详细的描述。有关其实现的内部机制和其他相关详细信息的说明,请参阅 perlclassguts。
这仍然是一项新的实验性特性,并且仍在开发中。它将在未来的版本中得到进一步的补充、完善和修改。由于它是实验性的,因此它会在 experimental::class
类别中产生警告。可以通过 no warnings
语句使这些警告静默。
use feature 'class';
no warnings 'experimental::class';
有关详细信息,请参阅 https://www.unicode.org/versions/Unicode15.0.0/。
所有弃用警告现在都有自己的特定弃用类别,可以单独禁用。你可以在 perldeprecation 和 warnings 中查看所有已弃用特性的列表。以下列表来自 warnings
+- deprecated ----+
| |
| +- deprecated::apostrophe_as_package_separator
| |
| +- deprecated::delimiter_will_be_paired
| |
| +- deprecated::dot_in_inc
| |
| +- deprecated::goto_construct
| |
| +- deprecated::smartmatch
| |
| +- deprecated::unicode_property_name
| |
| +- deprecated::version_downgrade
仍然可以通过以下方式在单个语句中禁用所有弃用警告
no warnings 'deprecated';
但现在可以进行更细粒度的控制。正如历史上一直发生的那样,这些警告会通过以下方式自动启用
use warnings;
由于各种原因,为一些 perl 关键字创建子例程包装器可能很困难。任何具有未定义原型的关键字都无法用子例程包装,而 perl 允许包装的一些关键字在实践中包装起来非常棘手。例如,require 包装起来很棘手,虽然有可能,但这样做会更改堆栈深度,而导出标准方法假设它们将导出到堆栈中特定堆栈深度的包,除非非常小心地实现,否则包装器将更改导出函数的位置。这可能会非常难处理。
因此,我们引入了一个名为 %{^HOOK}
的新哈希,旨在促进此类情况。当一个关键字支持任何类型的特殊钩子时,该钩子将存在于这个新哈希中。此哈希中的钩子将以其被调用的函数命名,后跟两个下划线,然后是其执行的阶段,当前在关键字执行之前或之后。
在此初始版本中,我们支持两个钩子 require__before
和 require__after
。提供这些钩子是为了简化在 require 语句之前和之后执行任务。
有关更多详细信息,请参阅 perlvar。
添加了一个新环境变量 PERL_RAND_SEED
,可用于使 perl 程序在不显式使用 srand()
或在没有参数的情况下使用 srand()
时可重复。请参阅 perlrun。此功能可以在编译时通过在构建过程中传递
-Accflags=-DNO_PERL_RAND_SEED
给 Configure 来禁用。
现在可以使用 //=
或 ||=
运算符为子例程签名参数分配默认表达式,以在调用者提供未定义或 false 值(分别)时应用默认值,而不仅仅是在完全缺少参数时应用默认值。有关更多详细信息,请参阅 perlsub 中的文档。
@INC
钩子的内部结构已经过强化,可以处理各种边缘情况,并且在钩子在 require 操作期间修改 @INC
时不再会段错误或引发断言失败。作为此项工作的一部分,我们现在确保在 require 调用期间最多执行一次任何给定的钩子,并且任何重复的目录都不会触发额外的目录探测。
为了让开发人员能够更好地控制动态模块查找,现在支持一种新的钩子方法 INCDIR
。支持此方法的对象可以注入到 @INC
数组中,当在模块搜索过程中遇到它时,它将被执行,就像执行 INC 钩子一样,并且其返回值用作要搜索模块的目录列表。返回一个空列表充当空操作。请注意,由于此钩子返回的任何引用都将被字符串化并用作字符串,因此您可能无法通过此 API 返回稍后要执行的钩子。
在 require 过程中调用 @INC
钩子(INC
或 INCDIR
)时,$INC
变量将被本地化为钩子来源的 @INC
索引值。如果钩子希望覆盖 @INC
中的“下一个”索引,它可以将 $INC
更新为比所需索引少 1(undef
等于 -1
)。这允许 @INC
钩子完全重写 @INC
数组,并让 Perl 从 @INC
的开头重新开始其目录探测。
@INC
中不支持 INC
或 INCDIR
方法的 Blessed CODE 引用将不再触发异常,而是会与未 Blessed 的 coderef 一样被处理,并执行为 INC
钩子。
defer
或 finally
中禁止的控制流禁止通过 return
或 goto
等控制流尝试离开 defer
或 finally
块。以前版本的 Perl 只能在运行时实际尝试时检测到这一点。
此版本的 Perl 为许多可以在静态中确定的情况添加了编译时检测。这意味着在以前版本的 Perl 上成功编译的代码现在可能被报告为编译时错误。这仅发生在实际执行代码时会出现错误的情况下;错误只是发生在更早的时候。
在模式中使用 (?{ ... })
和 (??{ ... })
会在该模式中全局禁用各种优化。这可能是程序员希望的,也可能不是。此版本添加了 (*{ ... })
等效项。唯一的区别是它不会禁用正则表达式引擎中的任何优化,并且永远不会禁用。这可能会使其在某种意义上变得不稳定,因为它将来可能会被调用更多或更少次数,但是它的执行次数将真正匹配正则表达式引擎的功能。例如,当 (?{ ... })
包含在模式中时,某些类型的优化会被禁用,因此在正常使用中为 O(N) 的模式会使用 (?{ ... })
模式变为 O(N*N)。切换到 (*{ ... })
意味着模式将保持为 O(N)。
过去,许多正则表达式量词都限制为 U16_MAX
,但现在限制为 I32_MAX
,因此现在可以编写 /(?:word){1000000}/
。请注意,这样做可能会导致正则表达式引擎运行时间更长并使用更多内存。
有两个新的 API 函数用于操作 optree 片段,确保您可以调用 optree 生成过程中可能无法调用的必需部分(例如,在创建自定义 LOGOP 时)。要访问这些函数,您首先需要设置一个 #define
以选择使用这些函数。
#define PERL_USE_VOLATILE_API
这些函数与解释器的内部工作方式密切相关,如果其他内部更改需要,它们可能会随时被更改或删除。
defer
和 finally
块中使用某些 goto
Perl 版本 5.36.0 添加了 defer
块,并允许 finally
关键字也向 try
/catch
语法添加类似的行为。这些块不允许在主体中使用任何 goto
表达式,因为它可能导致控制流跳出块。现在,如果 goto
表达式具有常量目标标签,并且该标签在块中找到,则允许使用一些 goto
表达式。
use feature 'defer';
defer {
goto LABEL;
print "This does not execute\n";
LABEL: print "This does\n";
}
这允许访问当前作用域中匹配的最后一个成功模式。正则表达式引擎的许多方面都引用“最后一个成功模式”。空模式会重复使用它,所有正则表达式魔术变量都与它相关。这允许访问其模式。以下代码
if (m/foo/ || m/bar/) {
s//PQR/;
}
可以重写如下
if (m/foo/ || m/bar/) {
s/${^LAST_SUCCESSFUL_PATTERN}/PQR/;
}
它将执行完全相同的事情。
在具有 GNU 扩展 LC_NAME
类别的平台上,你现在可以使用它作为 POSIX 中的“setlocale” 的类别参数来设置和查询其语言环境。
readline()
,也拼写为 <>
,会在流上发生错误后清除句柄的错误和 eof 标志。
在几乎所有情况下,此清除不再进行,因此错误和 eof 标志现在正确反映了 readline() 之后的流状态。
由于不再清除错误标志,因此在流上调用 close() 可能会失败,并且如果流没有显式关闭,则流的隐式关闭可能会产生警告。
这导致了下游 CPAN 模块中两种主要类型的错误,并且这些错误也可能出现在你的代码中
如果你的代码读到文件结尾,然后将句柄重新绑定到一个新的文件描述符,以前由于 eof 标志未设置,你可以继续从流中读取。你现在需要使用 $handle->clearerr()
自己清除 eof 标志才能继续读取。
如果你的代码在使用 readline() 读取时遇到流错误,则需要调用 $handle->clearerr
才能继续读取。发生这种情况的一种情况是基础文件描述符被标记为非阻塞,因此 read() 系统调用会因 EAGAIN
而失败,这会导致在流上设置错误标志。
在错误时继续清除错误和 eof 标志的唯一情况是在 miniperl 中从 glob() 的子进程中读取时。这允许它在 close() 时正确报告子进程的错误。在正常的 perl 开发过程中不太可能出现此问题。
INIT
块不再在 BEGIN
中的 exit()
之后运行INIT
块将不再在 BEGIN
内执行的 exit()
之后运行。这意味着 -v
选项和 -c
选项的组合不再执行编译检查以及显示 perl 版本。-v
选项在 BEGIN
块内打印版本信息后执行 exit(0),而 -c
检查是通过使用 INIT
钩子实现的,导致 -v
选项优先。
通常,perl 会在遇到编译错误后继续解析源代码。在许多情况下,这很有用,例如,对于拼写错误的变量名,显示尽可能多的错误示例很有用。但在语法错误的情况下,继续进行通常会产生奇怪的错误消息,甚至可能在编译过程中导致分段错误。在此版本中,编译器将在遇到的第一个语法错误处停止。这意味着任何期望看到我们过去生成的特定错误消息的代码都会中断。发出的错误将是我们过去生成的诊断之一,但在某些情况下,过去生成的某些消息将不再显示。
有关更多详细信息,请参见“对现有诊断的更改”。
utf8::upgrade()
从本版本开始,如果输入字符串为 undef
,它将保持为 undef
。以前它会被更改为已定义的零长度字符串。
Perl 5.28 在支持它们的系统上引入了“线程安全”区域设置,即现代 Windows 和支持 POSIX 2008 区域设置操作的系统。这些系统通过使用每个线程的区域设置来实现此目的,同时继续支持旧的全局区域设置操作,以用于不需要采取必要步骤来使用较新的每个线程操作的代码。
事实证明,一些 POSIX 2008 平台有或有过错误的实现,这迫使 perl 不使用它们。${^SAFE_LOCALES}
标量变量包含 0 或 1,以指示 perl 是否认为当前平台具有可工作的线程安全实现。一些实现已经修复,但 FreeBSD 和 Cygwin 被新发现的错误足够多,以至于 perl 从此版本开始不再使用线程安全操作。因此,${^SAFE_LOCALES}
现在对它们来说是 0。可以通过添加Configure 选项 -DNO_POSIX_2008_LOCALE
来配置旧版本的 perl 以避免这些错误的实现。
v5.38 修复了所有以前 perl 中导致区域设置不能完全线程安全的错误。完成的第一个线程导致主线程(名为 thread0
)恢复到启动时有效的全局区域设置,丢弃线程之前设置的任何区域设置。如果任何其他线程通过在 XS 代码中调用 switch_to_global_locale()
切换到全局区域设置,则这些线程将共享全局区域设置,并且 thread0
将不是线程安全的。
'
作为包名称分隔符已弃用自 5.28 以来,在双引号字符串中命名的变量中使用 '
作为包分隔符会发出警告。现在它在字符串插值和非插值上下文中都已弃用,并且将在 Perl 5.42 中删除。
“switch”特性和 smartmatch 运算符 ~~
在 v5.10 中引入。它们的行为在 v5.10.1 中发生了重大变化。当在 v5.18.0 中添加“实验”系统时,switch 和 smartmatch 被追溯声明为实验性的。多年来,修复或补充这些特性的建议不断出现和消失。
在 v5.38.0 中,我们宣布实验失败。一些未来的系统可能会在概念上取代 smartmatch,但它尚未设计或构建。
这些特性将在 v5.42.0 中从 perl 中完全删除。
对常见 OP 模式进行额外的 optree 优化。例如,用一个简化的 OP 替换多个简单的 OP,以便在运行时更高效。[GH #19943], [GH #20063], [GH #20077].
创建匿名子程序不再生成 srefgen
op,现在在 anoncode
或 anonconst
op 中进行引用生成,从而节省了运行时。[GH #20290]
添加了 is_tainted()
内置函数。[GH #19854]
支持 PPC 0018,use feature "module_true";
已添加到 v5.38 及更高版本的默认特性包中。它也可以被明确使用。当在模块内启用时,模块不需要明确返回 true,事实上,无论其最初是什么,返回都将强制为一个简单的 true 值。
Attribute::Handlers 已从版本 1.02 升级到 1.03。
attributes 已从版本 0.34 升级到 0.35。
autodie 已从版本 2.34 升级到 2.36。
B 已从版本 1.83 升级到 1.88。
B::Concise 已从版本 1.006 升级到 1.007。
B::Deparse 已从版本 1.64 升级到 1.74。
Benchmark 已从版本 1.23 升级到 1.24。
bignum 已从版本 0.65 升级到 0.66。
Carp 已从版本 1.52 升级到 1.54。
Class::Struct 已从版本 0.66 升级到 0.68。
Compress::Raw::Bzip2 已从版本 2.103 升级到 2.204_001。
Compress::Raw::Zlib 已从版本 2.105 升级到 2.204_001。
Config::Perl::V 已从版本 0.33 升级到 0.36。
CPAN 已从版本 2.33 升级到 2.36。
Data::Dumper 已从版本 2.184 升级到 2.188。
DB_File 已从版本 1.857 升级到 1.858。
Devel::Peek 已从版本 1.32 升级到 1.33。
Devel::PPPort 已从版本 3.68 升级到 3.71。
Digest::MD5 已从版本 2.58 升级到 2.58_01。
Digest::SHA 已从版本 6.02 升级到 6.04。
DynaLoader 已从版本 1.52 升级到 1.54。
Encode 已从版本 3.17 升级到 3.19。
encoding::warnings 已从版本 0.13 升级到 0.14。
Env 已从版本 1.05 升级到 1.06。
Errno 已从版本 1.36 升级到 1.37。
experimental 已从版本 0.028 升级到 0.031。
ExtUtils::CBuilder 已从版本 0.280236 升级到 0.280238。
ExtUtils::Install 已从版本 2.20 升级到 2.22。
ExtUtils::MakeMaker 已从版本 7.64 升级到 7.70。
ExtUtils::Miniperl 已从版本 1.11 升级到 1.13。
ExtUtils::ParseXS 已从版本 3.45 升级到 3.51。
ExtUtils::PL2Bat 已从版本 0.004 升级到 0.005。
ExtUtils::Typemaps 已从版本 3.45 升级到 3.51。
feature 已从版本 1.72 升级到 1.82。
File::Basename 已从版本 2.85 升级到 2.86。
File::Copy 已从版本 2.39 升级到 2.41。
File::Find 已从版本 1.40 升级到 1.43。
File::Glob 已从版本 1.37 升级到 1.40。
File::Spec 已从版本 3.84 升级到 3.89。
File::stat 已从版本 1.12 升级到 1.13。
FileHandle 已从版本 2.03 升级到 2.05。
Filter::Util::Call 已从版本 1.60 升级到 1.64。
GDBM_File 已从版本 1.23 升级到 1.24。
Getopt::Long 已从版本 2.52 升级到 2.54。
Hash::Util 已从版本 0.28 升级到 0.30。
HTTP::Tiny 已从版本 0.080 升级到 0.083。
I18N::Langinfo 已从版本 0.21 升级到 0.22。
IO 已从版本 1.50 升级到 1.52。
IO-Compress 已从版本 2.106 升级到 2.204。
IO::Socket::IP 已从版本 0.41 升级到 0.41_01。
在 DragonflyBSD 上,检测到即使 setsockopt() 返回成功,IPV6_V6ONLY
也不会被清除。[cpan #148293]
IO::Zlib 已从版本 1.11 升级到 1.14。
JSON::PP 已从版本 4.07 升级到 4.16。
libnet 已从 3.14 版升级至 3.15 版。
Locale::Maketext 已从 1.31 版升级至 1.33 版。
Math::BigInt 已从 1.999830 版升级至 1.999837 版。
Math::BigInt::FastCalc 已从 0.5012 版升级至 0.5013 版。
Math::BigRat 已从 0.2621 版升级至 0.2624 版。
Math::Complex 已从 1.5902 版升级至 1.62 版。
Memoize 已从 1.03_01 版升级至 1.16 版。
MIME::Base64 已从 3.16 版升级至 3.16_01 版。
Module::CoreList 已从 5.20220520 版升级至 5.20230520 版。
mro 已从 1.26 版升级至 1.28 版。
NDBM_File 已从 1.15 版升级至 1.16 版。
Net::Ping 已从 2.74 版升级至 2.76 版。
ODBM_File 已从 1.17 版升级至 1.18 版。
Opcode 已从 1.57 版升级至 1.64 版。
overload 已从 1.35 版升级至 1.37 版。
parent 已从 0.238 版升级至 0.241 版。
PerlIO::via::QuotedPrint 已从 0.09 版升级至 0.10 版。
Pod::Checker 已从 1.74 版升级至 1.75 版。
Pod::Html 已从 1.33 版升级至 1.34 版。
Pod::Usage 已从 2.01 版升级至 2.03 版。
podlators 已从 4.14 版升级至 5.01 版。
POSIX 已从 2.03 版升级至 2.13 版。
re 已从 0.43 版升级至 0.44 版。
Safe 已从 2.43 版升级至 2.44 版。
Scalar::Util 已从 1.62 版升级至 1.63 版。
SDBM_File 已从 1.15 版升级至 1.17 版。
Socket 已从 2.033 版升级至 2.036 版。
Storable 已从 3.26 版升级至 3.32 版。
Sys::Hostname 已从 1.24 版升级至 1.25 版。
Term::Cap 已从 1.17 版升级至 1.18 版。
Test::Simple 已从版本 1.302190 升级到 1.302194。
Text::Balanced 已从版本 2.04 升级到 2.06。
threads 已从版本 2.27 升级到 2.36。
threads::shared 已从版本 1.64 升级到 1.68。
Tie::File 已从版本 1.06 升级到 1.07。
Time::HiRes 已从版本 1.9770 升级到 1.9775。
Time::Piece 已从版本 1.3401 升级到 1.3401_01。
Unicode::Normalize 已从版本 1.31 升级到 1.32。
UNIVERSAL 已从版本 1.14 升级到 1.15。
User::grent 已从版本 1.03 升级到 1.04。
User::pwent 已从版本 1.01 升级到 1.02。
utf8 已从版本 1.24 升级到 1.25。
warnings 已从版本 1.58 升级到 1.65。
XS::APItest 已从版本 1.22 升级到 1.32。
XSLoader 已从版本 0.31 升级到 0.32。
描述新的class
功能。
描述新的class
功能的内部结构。
我们已尝试更新文档以反映此文档中列出的更改。如果您发现我们错过了任何更改,请在 https://github.com/Perl/perl5/issues 中打开一个问题。
此外,已进行以下选定更改
记录了 hv_ksplit
记录了 hv_name_set
记录了 gv_autoload_pv
记录了 gv_autoload_pvn
记录了 gv_autoload_sv
记录了 gv_name_set
记录了 start_subparse
记录了 save_aelem
已记录 save_aelem_flags
已记录 save_helem
已记录 save_helem_flags
添加了有关非计划弃用及其类别的信息。
为现有计划弃用添加了类别信息。
添加了 smartmatch 和撇号作为包分隔符弃用数据。
已记录 save_pushptr
已记录 save_scalar_at
已将新 newAV_alloc_x
、newAV_alloc_xz
和 *_simple
函数的条目添加到 perlguts 中。
已从 perlcommunity 和 perlmodstyle 中删除了对现已失效的 PrePAN 服务的引用。
已将符号命名部分添加到 perlhacktips 中。
perlexperiment 已被编辑,以正确引用 defer 块修改器和引号类运算符的额外成对定界符的警告类别。
Smartmatch 已从实验状态变为弃用状态。不幸的是,实验没有成功。
对 ucfirst
、push
、unshift
和 bless
函数进行了一些措辞改进,并添加了其他示例。
已在 perlhacktips 中添加了一个新部分 "编写更安全的宏",以讨论在 C 和 XS 代码中使用 C 宏的陷阱和解决方案。
已在 perlhacktips 中添加了一个新部分 "选择好的符号名称",以讨论名称中意外的陷阱。
更好地记录了匹配空模式的行为,并正确指定了其与新的 ${^LAST_SUCCESSFUL_PATTERN}
的关系。
添加了 "正则表达式变量的作用域规则" 部分,并对整个文档进行了其他措辞改进。
添加了有关新 %{^HOOK}
接口的信息,以及它公开的新 require__before
和 require__after
钩子。
更正了正则表达式变量 ${^PREMATCH}
、${^MATCH}
和 ${^POSTMATCH}
的信息,由于疏忽,所有这些变量都未正确记录。具体来说,它们仅在使用 /p 修饰符启用它们的正则表达式操作后才能正常工作。
添加了新正则表达式变量 ${^LAST_SUCCESSFUL_PATTERN}
的信息,它表示范围内最后一次成功的正则表达式匹配的模式。
对诊断输出(包括警告和致命错误消息)进行了以下添加或更改。有关诊断消息的完整列表,请参阅 perldiag。
添加了一个新的语法错误,用于 catch
块没有其必需的变量声明的错误。请参阅 catch 块需要 (VAR)
(F) 您尝试使用新式 class
的包名称调用 bless
。这是不必要的,因为构造函数创建的实例已经属于正确的类。无法通过其他方式(例如 bless
)创建实例。
无法将 :param(%s) 分配给字段 %s,因为该名称已在使用中
(F) 尝试将参数名称应用于字段,而该名称已被同一类或其父类中的另一个字段使用。这会导致名称冲突,因此不被允许。
(F) 尝试从已经具有 @ISA
数组的包中创建一个类,并且该数组不为空。这是不允许的,因为它会导致继承不一致的类。
(F) 您尝试通过传入一个不同类的实例值来直接调用一个类的 method
子例程。这是不允许的,因为该方法无法访问正确的实例字段。
(F) 您尝试通过传入不是该类实例的值来直接调用一个类的 method
子例程。这是不允许的,因为该方法随后无法访问其实例字段。
(F) 您尝试在不在此类内部的位置使用仅在 class
定义中才有意义的关键字之一。
(F) 您尝试开始一个已经存在的类的class
定义。一个类只能有一个定义块。
(F) 您尝试对已经引用真实对象实例的值调用bless
。
(F) 在 Cygwin 上,您使用空路径调用路径转换函数。只有非空路径是合法的。
(F) 您尝试使用:isa
属性为class
指定第二个超类,而一个已经指定。与使用bless
创建实例的类不同,通过class
关键字创建的类不能有多个超类。
(F) 您为一个类指定了一个属性,该属性需要在括号中传递一个值,但没有提供。请记住,属性名称和值之间不允许有空格;您必须这样写
class Example::Class :attr(VALUE) ...
(F) 当使用class
:isa
属性创建子类时,命名的超类也必须是使用class
关键字创建的真实类。
(F) 一个字段最多可以应用一次:param
属性来为其分配一个参数名称;一旦应用,就不允许再应用一次。
(F) 您为一个字段指定了一个属性,该属性需要在括号中传递一个值,但没有提供。请记住,属性名称和值之间不允许有空格;您必须这样写
field $var :attr(VALUE) ...
(F) 尝试从不显示在method
子例程主体内的代码中访问类的字段变量。这是不允许的,因为只有方法才能访问实例的字段。
(F)尝试从嵌套在实际定义它的类中的另一个类的函数中访问类的字段变量。这是不允许的,因为只有由给定类定义的函数才能访问该类的字段。
(F)您尝试将 :param
属性应用于数组或哈希字段。目前,这是不允许的。
(F)您调用了具有必需命名参数的类的构造函数,但根本没有传递该参数。
(F)您尝试将除单个类名和可选尾随版本号之外的内容指定为 class
:isa
属性的值。这使解析器感到困惑。
(F)您尝试向 class
定义中添加命名属性,但 Perl 无法识别所请求属性的名称。
(F)您尝试向 field
定义中添加命名属性,但 Perl 无法识别所请求属性的名称。
这是现有诊断的简短形式,用于在没有切换到新区域设置时使用。在这种情况中,之前的诊断具有误导性。
(S experimental::class)如果您使用 use feature 'class'
的 ADJUST
关键字,则会发出此警告。此关键字目前为实验性功能,其行为可能会在 Perl 的未来版本中发生变化。
(S experimental::class)如果您使用 use feature 'class'
的 class
关键字,则会发出此警告。此关键字目前为实验性功能,其行为可能会在 Perl 的未来版本中发生变化。
(W 重新定义)您重新定义了一个方法。要禁止此警告,请说
{
no warnings 'redefine';
*name = method { ... };
}
(W 杂项)您指定了奇数个元素来初始化对象的哈希字段。哈希是根据键/值对列表初始化的,因此每个键都必须有对应的值。最终缺少的值将用 undef 填充。
(W 已弃用,语法)您在变量、子例程或包名称中使用了旧包分隔符“'”。对旧包分隔符的支持将在 Perl 5.40 中删除。
(S experimental::class)如果您使用 use feature 'class' 的 field 关键字,则会发出此警告。此关键字目前处于实验阶段,其行为可能会在 Perl 的未来版本中发生变化。
(S experimental::class)如果您使用 use feature 'class' 的 method 关键字,则会发出此警告。此关键字目前处于实验阶段,其行为可能会在 Perl 的未来版本中发生变化。
编译器现在将在遇到第一个语法错误时停止解析。从历史上看,编译器会尝试“跳过”错误并继续解析,以便它可以列出多个错误。对于严格条件下的未声明变量来说,这是有道理的。然而,对于语法错误,人们发现继续进行往往会导致一系列不相关或奇怪的错误,这些错误大多只是掩盖了真正的错误。在极端情况下,它甚至会导致段错误和其他不正确的行为。
因此,我们已经改革了继续逻辑,以便在看到第一个语法错误后解析将停止。未声明变量等语义错误不会停止解析,因此您在编译代码时仍可能会看到多个错误。但是,如果存在语法错误,它将是 perl 报告的最后一个错误消息,并且您看到的错误都是需要修复的错误。
输出类或包名称的错误消息已修改为输出带有各种转义字符的双引号字符串,以便为读者明确确切的值。转义哪些字符的确切规则可能会随着时间的推移而改变,但目前是可打印的 ASCII 代码点(" 和 \ 除外)和代码点大于 255 的 unicode 单词字符以原始形式输出,任何其他符号都会被转义,就像 Data::Dumper 可能使用 \n 转义换行符和使用 \" 转义双引号等方式对它们进行转义一样。128-255 范围内的代码点始终被转义,因为它们在以原始形式输出时可能会在 unicode 终端上造成问题。
在 perl 的旧版本中,单行命令
$ perl -le'"thing\n"->foo()'
会输出以下错误消息,完全如这里所示,文本跨越多行,因为“\n”将作为原始换行符发出
Can't locate object method "foo" via package "thing
" (perhaps you forgot to load "thing
"?) at -e line 1.
从这个版本开始,我们将输出以下内容(作为一行)
Can't locate object method "foo" via package "thing\n"
(perhaps you forgot to load "thing\n"?) at -e line 1.
请注意,包名称中的换行符已加引号并转义,因此错误消息是一行。这里显示的文本仅换行两行以提高可读性。
当错误中的包或类名称非常大时,多余的中间部分将从消息中省略。从这个版本开始,错误消息将仅显示包或类名称中前 128 个字符和后 128 个字符。例如
$ perl -le'("Foo" x 1000)->new()'
将输出以下内容作为一行
Can't locate object method "new" via package "FooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFo"..."oFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFoo" (perhaps you forgot to load
"FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFo"...
"oFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo
FooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFooFoo"?)
at -e line 1.
请注意,在这种情况下,包名称的“前缀”...“后缀”
形式。在 perl 的以前版本中,将显示完整的字符串,使错误消息超过 6k 长,并且错误消息的长度根本没有上限。如果您不小心将 1MB 字符串用作类名,那么错误消息将超过 2MB 长。在这个 perl 中,考虑到省略和转义,上限应在 2k 左右。
已移除复杂正则子表达式递归限制 (%d) 超过
正则表达式引擎有一段时间没有使用递归了。此警告不再有意义。
参见 [GH #19636].
各种警告过去会在主警告消息下方及其“位置数据”后生成括号提示,现在已更改为将提示与主消息内联。例如
Bareword found where operator expected at -e line 1, near "foo bar"
(Do you need to predeclare foo?)
现在将如下所示,但作为一行
Bareword found where operator expected (Do you need to predeclare
foo?) at -e line 1, near "foo bar"
因此,此类警告将不再触发$SIG{__WARN__}
两次,并且当致命警告生效时提示将可见。
当require
或use
语句失败时生成的错误消息已更改。它过去包含单词@INC 包含:
,并且过去会在 require 完成并失败*之后*显示@INC
的状态。错误消息已更改为@INC 条目已检查:
并反映 require 语句期间执行的实际目录或挂钩。例如
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC contains:) at (eval 1) line 1.
将更改为(省略一些输出以提高清晰度)
perl -e'push @INC, sub {@INC=()}; eval "require Frobnitz"
or die $@'
Can't locate Frobnitz.pm in @INC (you may need to install the
Frobnitz module) (@INC entries checked:
.../site_perl/5.38.0/x86_64-linux .../site_perl/5.38.0
.../5.38.0/x86_64-linux .../5.38.0 CODE(0x562745e684b8))
at (eval 1) line 1.
从而显示实际检查的目录。在错误消息中检查@INC 包含:
的代码应针对@INC
和:
之间的任何未来措辞更改进行强化,例如在测试中使用qr/\@INC[ \w]+:/
而不是使用qr/\@INC contains:/
或qr/\@INC entries checked:/
,因为这将确保向前和向后兼容。
此诊断现在也属于已弃用
类别。
given 已弃用 替换了given 是实验性的
。
when 已弃用 替换了when 是实验性的
。
Smartmatch 已弃用 替换了Smartmatch 是实验性的
。
make -j6 minitest
可能由于主 make 进程和子进程在构建 $(MINIPERL_EXE)
时发生构建冲突而失败。[GH #19829]
当未设置主机名时,正确填充 Dragonfly BSD 上的 osvers。
修复 C99 宏名称 PRIX64
的拼写错误。
移除对 VMS 支持的古老且损坏的 GCC
移除对 /VAXC
限定符的残留引用
移除 VMS 上的 sharedperl 选项
VMS 现在有 mkostemp
Configure
现在正确处理 gcc 输出的带引号元素。[GH #20606]
Configure
通过测试这些函数的声明是否与实现产生函数类型不匹配来探测 malloc() 和 free() 的返回类型。在 Solaris 上,使用 C++ 编译器时,此检查总是失败,因为 Solaris 使用 using
从 std::
导入 malloc() 和 free() 以进行 C++ 构建。由于 malloc() 和 free() 的返回类型由 C 标准明确定义,因此跳过对它们的探测。Configure
命令行参数和提示仍然可以在极不可能需要的情况下覆盖这些类型。[GH #20806]
已添加和更改测试以反映此版本中的其他添加和更改。此外,还进行了以下重大更改
已添加 Unicode 规范化测试。
t/test.pl:添加取消看门狗计时器功能
已移除 DEC Ultrix 的支持代码。Ultrix 是各种 Digital Equipment Corporation 机器上的原生类 Unix 操作系统。其最终版本发布于 1995 年。
跳过测试以解决 setproctitle()
中的一个明显错误。 [GH #19894]
FreeBSD 不再使用线程安全区域设置操作,以避免 FreeBSD 中的一个错误
用 uname -p
替换 archname 的第一部分 [GH #19791]
避免 NetBSD/Solaris 中 regexec.c 和 regcomp.c 中的一些编译器和编译问题。
更新 Synology DSM 7 自述文件。
修复 vmem.h 中 gcc-12 所需的 win32 内存对齐。
如果无法将提供的 time_t
转换为 FILETIME
,则 Win32 上的 utimes() 会向 stderr 打印一条消息。 [GH #19668]
在某些情况下,stat() 和 lstat() 返回的时间戳未考虑夏令时。 [GH #20018] [GH #20061]
stat() 现在适用于 AF_UNIX
套接字文件。 [GH #20204]
readlink() 现在返回符号链接重新解析点的 PrintName
,而不是 SubstituteName
,这应该使其更好地匹配创建链接时使用的名称。 [GH #20271]
Windows 上的 lstat() 现在将链接目标的长度作为文件的大小返回,就像在 POSIX 系统上一样。 [GH #20476]
Windows 上的 symlink() 现在将目标中的任何 /
替换为 \
,因为 Windows 在符号链接中不识别 /
。反向转换不会由 readlink() 执行。 [GH #20506]
symlink() 将目标设为目录的绝对路径时,错误地创建为文件符号链接。 [GH #20533]
POSIX::dup2
不再创建损坏的套接字。 [GH #20920]
关闭繁忙的管道可能导致 Perl 挂起。 [GH #19963]
删除了许多已弃用的 C 函数。
这些函数已弃用很长时间。请参阅 https://github.com/perl/perl5/commit/7008caa915ad99e650acf2aea40612b5e48b7ba2 以获取完整列表。
get_op_descs
、get_op_names
、get_opargs
、get_no_modify
和 get_ppaddr
已标记为已弃用。
hv_free_ent
已标记为内部 API。
save_pushptr
、save_pushptrptr
和 save_pushi32ptr
已标记为内部 API。
5.36 中引入的新布尔类型已添加了新的布尔相关函数和宏
函数为
newSVbool(const bool bool_val)
newSV_true()
newSV_false()
sv_set_true(SV *sv)
sv_set_false(SV *sv)
sv_set_bool(SV *sv, const bool bool_val)
宏为
Perl 不再直接操作 environ
数组。已删除变量 PL_use_safe_putenv
,并且始终定义 PERL_USE_SAFE_PUTENV
。这意味着 XS 模块现在可以调用 setenv
和 putenv
,而不会导致段错误。[perl #19399]
内部 C API 函数现在在支持它的平台上使用 __attribute__((hidden))
隐藏。这意味着它们不再可以在这些平台上的 XS 模块中调用。
需要注意的是,这些函数在 Windows 上一直是隐藏的。此更改只是将此更改应用到其他平台。[perl #19655]
为打印声明为 U32
或 I32
的值添加了新的格式化符号
这些符号的使用方式与现有的类似符号(例如 IVdf
)相同。请参阅 "perlapi 中的“I/O 格式”。
新的 'HvHasAUX' 宏
regexec.c:添加一些分支预测重新排序条件
区域设置:更改宏名称以符合 C 规范
将 PADNAMEt_*
常量重命名为 PADNAMEf_*
将所有用于检索 PV 的 API 宏更改为调用内联函数,以便仅对参数进行一次求值。
regexec.c:多次重构代码以提高代码可读性
perl.h:更改宏名称以符合 C 规范(从 NOT_IN_NUMERIC 宏中删除前导 _)
regcomp.h:除了现有的 BITMAP_BYTE
和 BITMAP_TEST
宏之外,还添加了新的 BITMAP_BIT
宏。
创建新的 regnode 类型 ANYOFH。populate_ANYOF_from_invlist 已重命名为 populate_bitmap_from_invlist
正则表达式:重构 qr/[]/ 的位图与非位图
regcomp.c:添加新函数以从反转列表转换为位图(反之亦然)populate_bitmap_from_invlist
和 populate_invlist_from_bitmap
。
添加 newAVav()
以从现有 AV 创建 AV。添加 newAVhv()
以使用现有 HV 中的键和值创建 AV。
修复 Perl_atof
的定义。
修复与溢出相关的未定义行为 OPTIMIZE_INFTY
和 regcomp.c 中的 delta。
修复 regcomp.h 中的 regnode 指针对齐问题。
CV 标志 CVf_METHOD
和关联的 CvMETHOD
宏已重命名为 CVf_NOWARN_AMBIGUOUS
和 CvNOWARN_AMBIGUOUS
。这更能反映其实际行为(它会禁止生成关于歧义名称的警告),以避免与 CvIsMETHOD
混淆,后者表示 CV 是与 class
特性相关的 method
子例程。
OPf_SPECIAL
标志不再设置在 OP_ENTERSUB
操作中,该操作构造用于调用 VERSION
、import
和 unimport
方法作为 use
语句和属性应用程序的一部分,也不再在分配给 :lvalue
子例程时设置。
已添加新的 CV 标志 CVf_REFCOUNTED_ANYSV
,它表示 CV 是 XSUB,并在 CvXSUBANY.any_sv
联合域中存储 SV 指针。Perl 核心操作(例如克隆或销毁 CV)将维护指向的 SV 的引用计数,并在需要时销毁它。
添加了新的 API 函数 "Perl_localeconv
" in perlapi。这与 POSIX::localeconv
相同(返回 localeconv()
字段的哈希),但可直接从 XS 代码调用。
添加了新的 API 函数 "Perl_langinfo8
" in perlapi。这与普通的 "Perl_langinfo
" in perlapi 相同,但有一个额外的参数,允许调用者简单可靠地知道返回的字符串是否是 UTF-8。
我们对嵌套 eval EXPR
/BEGIN
块和 require
/BEGIN
(以及 use
语句)的数量进行了限制,以防止 C 栈溢出。此变量还可用于禁止在 eval EXPR
编译期间执行 BEGIN
块。该限制默认为 1000
,但可以通过设置 ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
变量来覆盖。默认值本身可以在编译时使用以下命令更改
-Accflags='-DPERL_MAX_NESTED_EVAL_BEGIN_BLOCKS_DEFAULT=12345'
请注意,此值与 C 栈的大小有关,如果您选择了一个不适当的大值,Perl 可能会段错误,因此在选择时要保守。
已添加新的魔术类型 PERL_MAGIC_extvalue
。它可用于像 PERL_MAGIC_ext
一样使用,但它是一个值魔术:在本地化后,新值将不再具有魔术性。
SSNEW()
、SSNEWt()
、SSNEWa()
和 SSNEWat()
API 现在返回 SSize_t
值。SSPTR()
和 SSPTRt()
宏现在需要一个 SSize_t
参数,并在调试版本中强制执行。[GH #20411]
cops 中的文件名现在在多线程下进行引用计数。在多线程下,我们将文件名复制到每个操作码中。这是因为理论上在一个线程中创建的操作码可以在另一个线程中销毁。此更改添加了一个新结构/类型 RCPV
,它是一个使用共享内存的引用计数字符串。它的实现方式是,以前使用 char * 的代码可以继续这样做,因为引用计数数据位于 char * 指针本身之前的特定偏移量处。
添加了 HvNAMEf
和 HvNAMEf_QUOTEDPREFIX
特殊格式。它们将 HV *
作为参数,并使用 HvNAME()
和相关宏来确定字符串、其长度以及它是否是 utf8。
实现长期弃用的 GIMME
宏的底层 Perl_dowantarray
函数已标记为已弃用,因此使用该宏会发出编译时警告。GIMME
已被记录为弃用,取而代之的是 GIMME_V
,自 Perl v5.6.0 起,但之前并未发出警告。
perlapi 中的 API 函数 "utf8_length" 现在效率更高。
添加了 SAVERCPV()
和 SAVEFREERCPV()
以更好地支持使用 RCPV
(引用计数字符串/指针值)结构,目前在操作码中使用这些结构以内存高效的方式共享文件名和警告位数据。
添加了 MORTALSVFUNC_SV()
和 MORTALDESTRUCTOR_SV()
宏,它们可以创建在当前语句末尾触发的析构函数。这使用 PERL_MAGIC_destruct
魔术来使用“free”魔术在释放变量时触发操作。该操作可以指定为 C 函数或 Perl 代码引用。
添加了 %{^HOOK}
api 和相关的 PERL_MAGIC_hook
和 PERL_MAGIC_hookelem
,用于提供钩选某些 Perl 函数的方法,由于某种原因,用自定义子例程包装这些函数存在问题。
添加了对 ${^HOOK}{require__before}
的支持,该支持可用于重写 require
将尝试加载的文件名,还可以阻止 require
加载特定模块,即使通过完全限定的文件名也是如此。该钩子还可用于执行“预先加载”和“后加载”操作。
添加了对 ${^HOOK}{require__after}
的支持,该支持可用于跟踪事后已加载哪些模块。
正则表达式操作码 (regops) 现在使用标准化结构布局,该布局使用联合以不同格式公开数据。这意味着扩展或修改 regops 以使用更多内存应该容易得多。这已被用于使许多 regops 跟踪它们包含多少个括号。
避免递归和堆栈溢出解析“pack”模板
正则表达式代码块中的最后一条语句中的 eval() 可能会触发解释器恐慌;例如
/(?{ ...; eval {....}; })/
禁用 bareword_filehandles
特性不再将 print Class->method
视为错误。[GH #19704]
当 Perl 子例程使用 goto &xs_sub
尾调用 XS 子例程时,XS 子例程现在可以正确确定其调用上下文。以前它总是报告为标量。
此外,在 Perl 子例程同时释放时
sub foo { *foo = sub {}; goto &xs_sub }
如果 XS 子例程尝试使用 PL_op
的值,这以前可能会导致崩溃,因为这已被设置为 NULL。此问题现已修复。
setsockopt() 现在使用 5.36 中添加的机制,以更好地区分作为 OPTVAL
参数提供的数字值和字符串值。[GH #18761]
4 个参数的 select()
现在拒绝代码点高于 255 的字符串。此外,对于代码点 128-255,此运算符现在始终会将相应的八位字节提供给操作系统,而不管 Perl 如何在内存中存储此类代码点。(以前,Perl 会将其内部字符串存储泄漏到操作系统。)[GH #19882]
修复 val {} inside /(?{...})/
中的恐慌问题 [GH #19390]
修复 regexp.c、locale.c 中的多个编译器警告 [GH #19915]
修复在没有 LC_NUMERIC
的平台上查询区域设置的错误 [GH #19890]
防止 S_maybe_multideref()
中的未定义行为。
避免在 use integer
操作中出现有符号整数溢出。
避免在 hv_delete_common
中向 NULL 指针添加偏移量。
PerlIO::get_layers 现在也将接受 IO 引用
以前它只会获取 glob 引用或 glob 的名称。现在它还将接受 IO 引用。
修复 PL_splitstr
的内存处理
如果创建了一个线程,则会释放已分配的字符串两次。
如果提供了两个 -F
开关,则不会释放为第一个开关分配的内存。
正确处理由 CPAN 模块生成的 OP_ANONCODE
操作,这些模块在传播左值上下文时不包含 OPf_REF 标志。[GH #20532]
POSIX::strxfrm 现在使用 LC_CTYPE
区域设置类别来指定其排序规则,而忽略任何不同的 LC_COLLATE
。字符串以一种区域设置(例如 ISO-8859-6,阿拉伯语)进行编码,并基于另一种区域设置(例如 ISO-8859-7,希腊语)对其进行排序,这是没有意义的。Perl 假设当前的 LC_CTYPE
区域设置正确表示编码,并相应地进行排序。
此外,现在允许在输入中嵌入 NUL
字符。
如果平台上未启用区域设置排序(LC_COLLATE
),则输入将保持不变。
已修复在返回重载对象的已绑定标量的字符串化过程中双重 FETCH。FETCH 方法应该只调用一次,但在此版本发布之前实际上调用了两次。[GH #20574]
如果已从选定的输出句柄中清除 IO 对象,则写入与选定的输出句柄关联的魔术变量 $^
、$~
、$=
、$-
和 $%
不再会使 perl 崩溃。[GH #20733]
现在使用 use constant
重新定义 use constant
列表常量会正确发出警告。这改变了 use constant
的行为,但这是核心更改,而不是对 constant.pm 的更改。[GH #20742]
使用空原型常量子例程重新定义 use constant
列表常量会导致断言失败。[GH #20742]
修复了一个回归,其中 @INC
中对象的 INC
方法不会由 AUTOLOAD
解析,而它在 5.36 中会解析。@INC
中对象的 INCDIR
方法不能由 AUTOLOAD
解析,因为 INC
会先解析。[GH #20665]
无论代码在编译期间如何死亡,现在都会在 eval 中调用 $SIG{__DIE__}
。这意味着期望能够将 $@
升级为对象的代码将始终如一地被调用。在早期版本的 perl 中,对于某些编译错误(例如未声明的变量),不会调用 $SIG{__DIE__}
。对于其他错误,如果错误数量超过一定数量,则可能会调用它,但如果数量较少,则不会调用。现在你可以期望在每种情况下都会调用它。
以前,带有错误的代码的编译会根据遇到的错误的数量和类型不一致地停止。目的是在 10 个错误后停止编译,但此逻辑中的错误意味着某些类型的错误会被计数,但不会触发停止编译的阈值检查。其他错误会。在此版本中,最多在 10 个错误后编译将终止,无论它们是什么类型的错误。
请注意,您可以在配置过程中将 PERL_STOP_PARSING_AFTER_N_ERRORS
定义为其他内容,从而更改最大计数。例如
./Configure ... -Accflags='-DPERL_STOP_PARSING_AFTER_N_ERRORS=100'
将允许最多 100 个错误。
API 函数 perlapi 中的 "my_snprintf" 现在会打印非点小数点,如果最终从其调用的 perl 代码位于 use locale
的作用域中,并且生效的区域设置要求这样做。
已修复正则表达式中量化组中捕获组相关的一些错误,尤其是在交替中。例如,在类似于
"foobazfoobar" =~ /((foo)baz|foo(bar))+/
的模式中,正则表达式变量 $2
将不再像以前一样是 "foo",它将是 undef。
已修复捕获组内部的正则表达式反向引用运算符的错误。例如
"xa=xaaa" =~ /^(xa|=?\1a){2}\z/
现在将正确不匹配。[GH #10073]
已重新设计 SSGROW()
和 SSCHECK()
,以确保实际分配了请求的空间。SSCHECK()
现在是 SSGROW()
的别名。
Perl 5.38.0 代表了自 Perl 5.36.0 以来大约 12 个月的开发,并且包含来自 100 位作者的 1,500 个文件中大约 290,000 行的更改。
不包括自动生成的文件、文档和发布工具,大约有 190,000 行更改到 970 个 .pm、.t、.c 和 .h 文件。
由于活跃的用户和开发人员社区,Perl 继续在第四个十年蓬勃发展。已知以下人员为 Perl 5.38.0 的改进做出了贡献
Alex、Alexander Nikolov、Alex Davies、Andreas König、Andrew Fresh、Andrew Ruthven、Andy Lester、Aristotle Pagaltzis、Arne Johannessen、A. Sinan Unur、Bartosz Jarzyna、Bart Van Assche、Benjamin Smith、Bram、Branislav Zahradník、Brian Greenfield、Bruce Gray、Chad Granum、Chris 'BinGOs' Williams、chromatic、Clemens Wasser、Craig A. Berry、Dagfinn Ilmari Mannsåker、Dan Book、danielnachun、Dan Jacobson、Dan Kogai、David Cantrell、David Golden、David Mitchell、E. Choroba、Ed J、Ed Sabol、Elvin Aslanov、Eric Herman、Felipe Gasper、Ferenc Erki、Firas Khalil Khana、Florian Weimer、Graham Knop、Håkon Hægland、Harald Jörg、H.Merijn Brand、Hugo van der Sanden、James E Keenan、James Raspass、jkahrman、Joe McMahon、Johan Vromans、Jonathan Stowe、Jon Gentle、Karen Etheridge、Karl Williamson、Kenichi Ishigaki、Kenneth Ölwing、Kurt Fitzner、Leon Timmermans、Li Linjie、Loren Merritt、Lukas Mai、Marcel Telka、Mark Jason Dominus、Mark Shelor、Matthew Horsfall、Matthew O. Persico、Mattia Barbon、Max Maischein、Mohammad S Anwar、Nathan Mills、Neil Bowers、Nicholas Clark、Nicolas Mendoza、Nicolas R、Paul Evans、Paul Marquess、Peter John Acklam、Peter Levine、Philippe Bruhat (BooK)、Reini Urban、Renee Baecker、Ricardo Signes、Richard Leach、Russ Allbery、Scott Baker、Sevan Janiyan、Sidney Markowitz、Sisyphus、Steve Hay、TAKAI Kousuke、Todd Rinaldo、Tomasz Konojacki、Tom Stellard、Tony Cook、Tsuyoshi Watanabe、Unicode Consortium、vsfos、Yves Orton、Zakariyya Mughal、Zefram、小鸡。
以上列表几乎肯定不完整,因为它是从版本控制历史中自动生成的。特别是,它不包括向 Perl bug 跟踪器报告问题的(非常感谢的)贡献者的姓名。
此版本中包含的许多更改源自 Perl 核心包含的 CPAN 模块。我们感谢整个 CPAN 社区帮助 Perl 蓬勃发展。
要获得 Perl 所有历史贡献者的更完整列表,请参阅 Perl 源代码发行版中的 AUTHORS 文件。
如果您发现您认为是错误的内容,您可以在 https://github.com/Perl/perl5/issues 处查看 perl 错误数据库。Perl 主页 https://www.perl5.cn/ 上也可能有相关信息。
如果您认为自己有一个未报告的错误,请在 https://github.com/Perl/perl5/issues 处打开一个问题。务必将您的错误精简为一个微小但足够的测试用例。
如果您报告的错误具有安全影响,不适合发送到公共问题跟踪器,请参阅 perlsec 中的 “perlsec 中的安全漏洞联系信息”,了解如何报告该问题的详细信息。
如果您希望感谢 Perl 5 Porters 在 Perl 5 中所做的工作,您可以通过运行 perlthanks
程序来实现
perlthanks
这会向 Perl 5 Porters 列表发送一封电子邮件,表达您的谢意。
Changes 文件,解释如何查看已更改内容的详尽详细信息。
INSTALL 文件,解释如何构建 Perl。
README 文件,了解常规内容。
Artistic 和 Copying 文件,了解版权信息。