perl58delta - perl v5.8.0 的新增功能
本文档描述了 5.6.0 版本和 5.8.0 版本之间的差异。
5.8.0 中的许多错误修复已在 5.6.1 维护版本中出现,因为这两个版本在发布时保持紧密协调(当时 5.8.0 仍被称为 5.7.something)。
已集成到 5.6.1 版本中的更改标记为 [561]
。自 5.6.1 发布以来,许多这些更改已得到进一步开发,这些更改标记为 [561+]
。
您可以通过阅读 perl561delta 来查看 5.6.1 版本中的更改列表(来自 5.005_03 版本和 5.6.0 版本)。
更好的 Unicode 支持
新的 IO 实现
新的线程实现
更好的数值精度
安全信号
许多新的模块
更广泛的回归测试
Perl 5.8 与早期版本的 Perl 不兼容。
您需要重新编译您的 XS 模块。
(纯 Perl 模块应该继续工作。)
不兼容的主要原因是新的 IO 架构,称为 PerlIO。PerlIO 是默认配置,因为没有它,Perl 5.8 的许多新功能无法使用。换句话说:您只需要重新编译包含 XS 代码的模块,对此表示歉意。
在未来的 Perl 版本中,不支持 PerlIO 的 XS 模块可能会完全不支持。然而,这对模块作者来说不应该太难:PerlIO 被设计为 stdio 接口的直接替换(在源代码级别)。
根据您的平台,我们决定打破二进制兼容性的原因还有其他原因,请继续阅读。
如果您的指针宽度为 64 位,则不再使用 Perl malloc,因为它不适用于 8 字节指针。此外,通常这些平台上的系统 malloc 针对这种大型内存模型进行了更好的优化,而不是 Perl malloc。一些内存密集型 Perl 应用程序(如 PDL)无法与 Perl 的 malloc 良好配合。最后,除了 Perl 之外的其他应用程序(如 mod_perl)倾向于使用系统 malloc。这些平台包括 Alpha 和 64 位 HPPA、MIPS、PPC 和 Sparc。
AIX 动态加载现在在 AIX 版本 4.3 及更高版本中使用 AIX 的原生 dlopen 接口,而不是旧的模拟接口。此更改可能会破坏与已编译模块的向后兼容性。进行此更改是为了使 Perl 更加符合其他应用程序(如 mod_perl),这些应用程序使用 AIX 原生接口。
my
变量的属性现在在运行时处理my EXPR : ATTRS
语法现在在运行时应用变量属性。(子例程和 our
变量仍然在编译时应用属性。)有关更多详细信息,请参阅 attributes。但是,这尤其允许变量属性对 tie
接口有用,这是早期版本的一个缺陷。请注意,新语义不适用于 Attribute::Handlers 模块(截至版本 0.76)。
Socket 扩展现在是动态加载的,而不是静态构建的。这可能是也可能不是 VMS 的古老 TCP/IP 堆栈的问题:我们不知道,因为我们无法在这些配置中测试 Perl。
Perl 现在在 OpenVMS Alpha 上使用 IEEE 格式 (T_FLOAT) 作为默认的内部浮点格式,这可能会破坏与外部库或现有数据的二进制兼容性。G_FLOAT 仍然可以作为配置选项使用。VAX 上的默认值 (D_FLOAT) 没有改变。
use utf8
)以前在 Perl 5.6 中,要使用 Unicode,需要使用 "use utf8",然后操作(如字符串连接)在该词法范围内是 Unicode 意识的。
这种接口被发现很不方便,在 Perl 5.8 中,Unicode 模型已经完全改变:现在 "Unicode 性" 与数据本身绑定,大多数情况下根本不需要 "use utf8"。 "use utf8" 的唯一剩余用途是当 Perl 脚本本身是用 Unicode 的 UTF-8 编码编写的。(UTF-8 还没有成为默认编码,因为有很多 Perl 脚本使用各种国家/地区的八位字符集,这些字符集在 UTF-8 中是非法的。)
有关当前模型的说明,请参阅 perluniintro,有关 utf8 pragma 的当前用法,请参阅 utf8。
现在支持 Unicode 脚本。脚本类似于(并且优于)Unicode 块。脚本和块之间的区别在于,脚本是语言或语言组使用的字形,而块是基于 Unicode 编号的(主要是)256 个字符的人为分组。
一般来说,脚本更具包容性,但并非普遍如此。例如,虽然 Latin
脚本包含所有拉丁字符及其各种带重音符号的版本,但它不包含各种标点符号或数字(因为它们不完全是 Latin
)。
现在支持许多其他属性,包括 \p{L&}
、\p{Any}
\p{Assigned}
、\p{Unassigned}
、\p{Blank}
[561] 和 \p{SpacePerl}
[561](当然还有它们的 \P{...}
版本)。有关详细信息和更多新增内容,请参阅 perlunicode。
在使用 \p{...}
和 \P{...}
时,名称前缀 In
或 Is
现在几乎总是可选的。唯一的例外是,当块名称与脚本名称冲突时,需要使用 In
前缀来表示 Unicode 块。例如,\p{Tibetan}
指的是脚本,而 \p{InTibetan}
指的是块。当没有名称冲突时,您可以省略块名称中的 In
(例如 \p{BraillePatterns}
),但为了安全起见,最好始终使用 In
)。
对引用的引用现在会字符串化为 "REF(0x81485ec)" 而不是 "SCALAR(0x81485ec)",以便与 ref() 的返回值保持一致。
未记录的 pack/unpack 模板字母 D/F 已被重用以获得更好的使用:现在它们代表长双精度(如果平台支持)和 NV(Perl 内部浮点类型)。(它们曾经是 d/f 的别名,但你永远不会知道。)
来自 glob()(或 <...>)的文件名列表现在默认按字母顺序排序,以符合 csh 规范(这在大多数 Unix 平台上之前就是这样)。(bsd_glob() 仍然按平台原生排序,ASCII 或 EBCDIC,除非指定了 GLOB_ALPHASORT。)[561]
bless(REF, REF) 的语义不清楚,除非有人证明它有意义,否则它是禁止的。
过时的 chat2 库不应该被允许逃离实验室,现在已被停用。
使用 chdir("") 或 chdir(undef) 而不是显式 chdir() 是不可取的。失败(考虑 chdir(some_function()))会导致意外地 chdir() 到主目录,因此这种行为已被弃用。
内置的 dump() 函数可能已经失去了大部分用处。核心转储功能将在未来作为对 CORE::dump()
的显式调用而保留,但在未来的版本中,未限定的 dump()
调用的行为可能会改变。
eg/ 目录中的非常陈旧的示例已被删除。欢迎提供新的闪亮示例的建议,但主要问题是示例需要被记录、测试和(最重要的是)维护。
(伪造的)转义序列 \8 和 \9 现在会给出可选的警告(“未识别的转义序列已通过”)。不需要对任何 \w
字符进行 \ 转义。
*glob{FILEHANDLE} 已被弃用,请使用 *glob{IO} 代替。
package;
语法(不带参数的 package
)已被弃用。它的语义从未明确,其实现更是如此。如果您使用此功能来禁止除完全限定变量以外的所有变量,请改用 use strict;
。
未实现的 POSIX 正则表达式功能 [[.cc.]] 和 [[=c=]] 仍然被识别,但现在会导致致命错误。以前默认忽略它们并在请求时发出警告的行为是不可接受的,因为它在某种程度上错误地承诺了这些功能可以使用。
在未来的版本中,不支持 PerlIO 的 XS 模块可能会完全不受支持。由于 PerlIO 是 stdio 在源代码级别的直接替代品,因此这应该不会是一个巨大的变化。
以前版本的 perl 和 Camel III 中某些部分的一些解读暗示 :raw
“规则” 是 :crlf
的反面。关闭“crlfness” 不再足以使流真正成为二进制流。因此,PerlIO :raw
层(或使用 Camel 书籍中较旧的术语的“规则”)现在正式定义为等效于 binmode(FH) - 这反过来被定义为执行任何必要的操作以按原样传递每个字节,而无需任何转换。特别是 binmode(FH) - 以及 :raw
- 现在将关闭 CRLF 和 UTF-8 转换,并删除其他会修改字节流的层(例如:encoding())。
从 Perl 5.8.0 开始,伪哈希的当前用户可见实现(第一个数组元素的奇怪用法)已被弃用,并将从 Perl 5.10.0 中删除,并且该功能将以不同的方式实现。当前的接口不仅相当丑陋,而且当前的实现会明显减慢正常的数组和哈希使用速度。fields
pragma 接口将继续可用。受限哈希 接口预计将成为替代接口(参见 Hash::Util)。如果您的现有程序依赖于底层实现,请考虑使用 CPAN 上的 Class::PseudoHash。
@a->[...]
和 %h->{...}
语法现已弃用。
经过多年的尝试,suidperl 被认为过于复杂,永远无法被认为是真正安全的。suidperl 功能可能会在未来的版本中删除。
5.005 线程模型(模块 Thread
)已弃用,预计将在 Perl 5.10 中移除。多线程代码应迁移到新的 ithreads 模型(参见 threads、threads::shared 和 perlthrtut)。
已移除长期弃用的字符串比较运算符的大写别名(EQ、NE、LT、LE、GE、GT)。
tr///C 和 tr///U 功能已移除,不会再恢复;该接口是一个错误。对此表示歉意。有关类似功能,请参见 pack('U0', ...) 和 pack('C0', ...)。[561]
早期的 Perl 将 "sub foo (@bar)" 等同于 "sub foo (@)"。现在在编译时会更好地检查原型以查找无效语法。会生成一个可选警告(“原型中存在非法字符...”),但在将来的版本中可能会升级为致命错误。
exec LIST
和 system LIST
操作现在会在污染数据时产生警告,并且在将来的某个版本中会产生致命错误。
本地化绑定数组和哈希时的现有行为是错误的,将在将来的版本中更改,因此请勿依赖现有行为。请参见 "本地化绑定数组和哈希已损坏"。
现在,Unicode 的总体可用性应该比 Perl 5.6.0(甚至 5.6.1)要高得多。Unicode 可用于哈希键,正则表达式中的 Unicode 现在应该可以工作,tr/// 中的 Unicode 现在应该可以工作,I/O 中的 Unicode 现在应该可以工作。有关介绍,请参见 perluniintro,有关详细信息,请参见 perlunicode。
Perl 附带的 Unicode 字符数据库已升级到 Unicode 3.2.0。有关更多信息,请参见 http://www.unicode.org/ 。[561+](5.6.1 包含 UCD 3.0.1。)
对于有兴趣增强 Perl Unicode 功能的开发人员:几乎所有 UCD 文件都包含在 Perl 发行版中的 lib/unicore 子目录中。出于空间考虑,最显著的遗漏是 Unihan 数据库。
已添加属性 \p{Blank} 和 \p{SpacePerl}。“Blank”类似于 C 中的 isblank(),即它只包含“水平空白”(空格字符是,换行符不是),而“SpacePerl”是 \s
的 Unicode 等效项(\p{Space} 不是,因为它包含垂直制表符,而 \s
不包含)。
有关 Unicode 属性更改的更多信息,请参见本文档前面部分的“新的 Unicode 属性”。
现在默认情况下,IO 操作通过 PerlIO 完成,而不是系统的“stdio”。PerlIO 允许将“层”推送到文件句柄上以改变句柄的行为。层可以在打开时通过 open 的三参数形式指定
open($fh,'>:crlf :utf8', $path) || ...
或者在已打开的句柄上通过扩展的 binmode
指定
binmode($fh,':encoding(iso-8859-7)');
内置的层有:unix(底层读写)、stdio(如之前的 Perl 版本)、perlio(以可移植的方式重新实现 stdio 缓冲)、crlf(在 Win32 上执行 CRLF <=> "\n" 转换,但在任何平台上都可用)。如果平台支持,则可能提供 mmap 层(主要是 Unix 系统)。
可以通过 'open' pragma 指定默认应用的层。
有关 PerlIO 对您的体系结构名称的影响,请参阅 "安装和配置改进"。
如果您的平台支持 fork(),您可以使用 open
的列表形式来创建管道。例如
open KID_PS, "-|", "ps", "aux" or die $!;
将 fork ps(1) 命令(不生成 shell,因为 open() 有三个以上的参数),并通过 KID_PS
文件句柄读取其标准输出。请参阅 perlipc。
文件句柄可以通过伪层 ":utf8" 标记为接受 Perl 的内部 Unicode 编码(根据平台的不同,为 UTF-8 或 UTF-EBCDIC)。
open($fh,">:utf8","Uni.txt");
注意 EBCDIC 用户:伪层 ":utf8" 对您来说命名错误,因为您将获得的不是 UTF-8,而是 UTF-EBCDIC。请参阅 perlunicode、utf8 和 http://www.unicode.org/reports/tr16/ 以获取更多信息。在将来的版本中,此命名可能会更改。有关 UTF-8 的更多信息,请参阅 perluniintro。
如果您的环境变量(LC_ALL、LC_CTYPE、LANG)看起来像您要使用 UTF-8(任何变量都匹配 /utf-?8/i
),那么您的 STDIN、STDOUT、STDERR 句柄和默认 open 层(请参阅 open)将被标记为 UTF-8。(此功能,以及其他将 Unicode 和 I/O 结合在一起的新功能,仅在使用 PerlIO 时才有效,但这是默认设置。)
请注意,在执行此操作后,Perl 确实假设所有内容都是 UTF-8:例如,如果某些输入句柄不是 UTF-8,Perl 很可能会很快抱怨输入数据,例如“格式错误的 UTF-8...” 因为任何旧的八位数据都不是合法的 UTF-8。
注意代码作者:如果您希望允许用户使用 UTF-8 作为其默认编码,但在您的代码中仍然使用八位 I/O 流(例如图像或 zip 文件),您需要使用 :bytes
显式打开() 或 binmode()(请参阅 "perlfunc 中的 open" 和 "perlfunc 中的 binmode"),或者您只需使用 binmode(FH)
(对于 5.8.0 之前的向后兼容性来说很好)。
文件句柄可以通过 ":encoding()" 层在读写时将字符编码转换为/从 Perl 的内部 Unicode 形式转换。
文件句柄可以打开到 Perl 标量中保存的“内存中”文件,方法是
open($fh,'>', \$variable) || ...
无需使用 'use FileHandle' 或其他模块即可使用匿名临时文件,方法是
open($fh,"+>", undef) || ...
这是一个字面上的 undef,而不是一个未定义的值。
Arthur Bergman 实现的新解释器线程(简称“ithreads”)多线程实现取代了旧的“5.005 线程”实现。在 ithreads 模型中,线程之间任何数据共享必须是显式的,这与数据共享隐式的模型相反。参见 threads 和 threads::shared,以及 perlthrtut。
作为 ithreads 实现的一部分,Perl 还将使用任何必要的和可检测的重入 libc 接口。
受限哈希被限制为一组特定的键,不能添加该组之外的任何键。此外,可以限制单个键,以便不能删除该键,也不能更改其值。没有涉及新的语法:Hash::Util 模块是接口。
Perl 过去很脆弱,因为在不合适的时间到达的信号可能会破坏 Perl 的内部状态。现在 Perl 将信号处理推迟到安全的时候(在操作码之间)。
此更改可能会产生意想不到的副作用,因为信号不再立即中断 Perl。Perl 现在将首先完成正在执行的操作,例如完成内部操作(如 sort())或外部操作(如 I/O 操作),然后才查看任何到达的信号(并在开始下一个操作之前)。由于当前操作始终先完成,因此不再存在损坏的内部状态,但信号可能需要更多时间才能被听到。请注意,从可能阻塞的操作中退出仍然应该有效。
总的来说,在 Perl 对数字(整数和浮点数)的理解方面,已经进行了大量的修复。由于在许多系统中,标准数字解析函数(如 strtoul()
和 atof()
)似乎存在错误,因此 Perl 试图绕过这些缺陷。这有望导致更准确的数字。
Perl 现在尝试在内部使用整数在数字转换和基本算术运算(+ - * /)中使用整数,并尝试将结果存储为整数。此更改导致算术运算通常更快,并且始终损失更少。(以前 Perl 在其数学运算中始终偏好浮点数。)
在双引号字符串中,数组现在始终插值,无论如何。在早期版本的 perl 5 中,如果数组在字符串编译之前被提及,则数组会插值到字符串中,否则 Perl 会引发致命编译时错误。在 5.000 到 5.003 版本中,错误是
Literal @example now requires backslash
在 5.004_01 到 5.6.0 版本中,错误是
In string, @example now must be written as \@example
这里的想法是让人们养成在需要字面 @
符号时编写 "fred\@example.com"
的习惯,就像他们一直编写 "Give me back my \$5"
一样,因为他们需要一个字面 $
符号。
从 5.6.1 开始,当 Perl 现在在双引号字符串中看到一个 @
符号时,它始终尝试插值一个数组,无论该数组是否已被使用或声明。致命错误已降级为可选警告
Possible unintended interpolation of @example in string
这会警告你 "[email protected]"
将变成 fred.com
,如果你不反斜杠 @
。有关此处的历史记录的更多详细信息,请参阅 http://perl.plover.com/at-error.html。
AUTOLOAD 现在是 lvaluable,这意味着你可以将 :lvalue 属性添加到 AUTOLOAD 子例程,并且可以将值赋给 AUTOLOAD 的返回值。
如果 sizeof(long) 为 4,但 sizeof(IV) 为 8,则 $Config{byteorder}(以及 config.h 中的相应 BYTEORDER)在平台中以前是错误的。字节序只有 sizeof(long) 字节长(1234 或 4321),但现在它正确地是 sizeof(IV) 字节长(12345678 或 87654321)。(此问题不会影响 Windows 平台。)
此外,$Config{byteorder} 现在是动态计算的——这在“胖二进制文件”中更健壮,其中可执行映像包含针对多个二进制平台的二进制文件,以及在交叉编译时。
perl -d:Module=arg,arg,arg
现在可以工作(以前无法传递多个参数。)
do
后面跟着一个裸字现在确保这个裸字不是关键字(为了避免一个 bug,其中 do q(foo.pl)
试图调用一个名为 q
的子例程)。这意味着,例如,你必须编写 do &format()
而不是 do format()
。
内置的 dump() 现在会发出一个可选警告 dump() better written as CORE::dump()
,这意味着默认情况下 dump(...)
被解析为内置的 dump(),它会转储核心并中止,而不是(可能)用户定义的 sub dump
。要调用后者,请将调用限定为 &dump(...)
。(整个 dump() 功能被认为已弃用,并且可能会在将来的版本中删除/更改。)
chomp() 和 chop() 现在可以被覆盖。但是请注意,它们的原型(如 prototype("CORE::chomp")
所示)是未定义的,因为无法表达,因此无法真正编写替换来覆盖这些内置函数。
即使在 BEGIN 块中退出/死亡,END 块现在也会运行。在内部,END 块的执行现在由 PL_exit_flags & PERL_EXIT_DESTRUCT_END 控制。这为 Perl 嵌入器启用了新的行为。这将在 5.10 中默认。请参阅 perlembed。
格式现在支持零填充的十进制字段。
虽然“你不应该这样做”,但可以编写依赖于 Perl 散列键顺序的代码(Data::Dumper 就是这样做的)。新的算法“一次一个”会产生不同的散列键顺序。更多详细信息请参阅 “性能增强”。
lstat(FILEHANDLE) 现在会发出警告,因为该操作没有意义。在未来的版本中,这可能会变成致命错误。
在某些情况下,当 glob() 首次导致 File::Glob 加载时,生成的虚假语法错误已修复。[561]
左值子程序现在可以在列表上下文中返回 undef
。但是,左值子程序功能仍然处于实验阶段。[561+]
已恢复丢失的警告“无法在 my 中声明 ... 解引用”(Perl 之前有它,但在后面的版本中丢失了)。
引入了新的特殊正则表达式变量:$^N
,它包含最近关闭的组(子匹配)。
即使 Module 没有 unimport() 方法,no Module;
也不会产生错误。这与 use
相对于 import
的行为一致。[561]
如果任一操作数为 NaN,则数值比较运算符将返回 undef
。之前行为未定义。
our
现在可以有一个实验性的可选属性 unique
,它会影响全局变量在多个解释器之间如何共享,请参阅 “our” 在 perlfunc 中。
以下内置函数现在可以被覆盖:each()、keys()、pop()、push()、shift()、splice()、unshift()。[561]
pack() / unpack()
现在可以使用 ()
对模板字母进行分组,然后对组应用重复/计数修饰符。
pack() / unpack()
现在可以处理 Perl 内部数值类型:IV、UV、NV——以及长双精度,如果平台支持。模板字母为 j
、J
、F
和 D
。
pack('U0a*', ...)
现在可以用来强制字符串转换为 UTF-8。
my __PACKAGE__ $obj 现在可以工作了。[561]
POSIX::sleep() 现在返回的是未休眠的秒数(如 POSIX 标准所述),而 CORE::sleep() 返回的是已休眠的秒数。
printf() 和 sprintf() 现在支持使用 %\d+\$
和 *\d+\$
语法重新排序参数。例如
printf "%2\$s %1\$s\n", "foo", "bar";
将打印 "bar foo\n"。此功能有助于编写国际化软件,以及在参数顺序可能变化的情况下。
(\&) 原型现在可以正常工作。[561]
prototype(\[$@%&]) 现在可用于隐式创建引用(例如,如果您想模拟 tie() 接口,这很有用)。
提供了一个新的命令行选项 -t
。它是 -T
的小兄弟:它不会在污染违规时退出,而是给出词法警告。这仅作为一种临时调试辅助工具,用于保护旧版应用程序的代码。这不是 -T 的替代品。
在其他污染新闻中,exec LIST
和 system LIST
现在被认为过于危险(想想 exec @ARGV
:它可以使用任何参数启动任何程序),现在这些形式在词法警告下会导致警告。您应该仔细清洗参数以保证其有效性。在未来的 Perl 版本中,这些形式将成为致命错误,因此请考虑现在开始清洗。
绑定哈希接口现在需要具有 EXISTS 和 DELETE 方法(无论是自己的还是继承的)。
如果 tr/// 只是在计数字符,它不会尝试修改其目标。
untie() 现在将在存在的情况下调用 UNTIE() 钩子。有关详细信息,请参阅 perltie。[561]
"perlfunc 中的 utime" 现在支持 utime undef, undef, @files
来将文件时间戳更改为当前时间。
允许在数字常量中使用下划线(下划线)的规则已放宽并简化:现在您可以在数字之间简单地使用下划线。
现在,$^X 不是依赖于 C 的 argv[0](它可能不包含完整路径名),而是通过询问操作系统来设置的(例如,在 Linux 上读取 /proc/self/exe,在 FreeBSD 上读取 /proc/curproc/file)。
一个新的变量 ${^TAINT}
指示是否启用了污染模式。
您现在可以覆盖 readline() 内置函数,这也会覆盖 <FILEHANDLE> 尖括号运算符。
命令行选项 -s 和 -F 现在在 shebang(#!)行中被识别。
在没有伴随的 /g
修饰符的情况下使用 /c
匹配修饰符会引发新的警告:Use of /c modifier is meaningless without /g
。
在替换中使用 /c
,即使使用 /g
,也会引发 Use of /c modifier is meaningless in s///
。
在 split 中使用 /g
会引发 Use of /g modifier is meaningless in split
。
已添加对 CLONE
特殊子例程的支持。使用 ithreads,当创建一个新线程时,所有 Perl 数据都会被克隆,但是非 Perl 数据不能自动克隆。在 CLONE
中,您可以执行任何需要执行的操作,例如,如果需要,处理非 Perl 数据的克隆。CLONE
将为每个定义或继承了它的包执行一次。它将在新线程的上下文中调用,因此所有修改都在新区域中进行。
参见 perlmod
Attribute::Handlers
,最初由 Damian Conway 编写,现在由 Arthur Bergman 维护,允许类定义属性处理程序。
package MyPack;
use Attribute::Handlers;
sub Wolf :ATTR(SCALAR) { print "howl!\n" }
# later, in some package using or inheriting from MyPack...
my MyPack $Fluffy : Wolf; # the attribute handler Wolf will be called
变量和例程都可以有属性处理程序。处理程序可以特定于类型(SCALAR、ARRAY、HASH 或 CODE),也可以特定于确切的编译阶段(BEGIN、CHECK、INIT 或 END)。参见 Attribute::Handlers。
B::Concise
,由 Stephen McCamant 编写,是一个新的编译器后端,用于遍历 Perl 语法树,打印关于操作的简洁信息。输出高度可定制。参见 B::Concise。[561+]
新的 bignum、bigint 和 bigrat 语义,由 Tels 编写,实现了透明的大数支持(使用 Math::BigInt、Math::BigFloat 和 Math::BigRat 后端)。
Class::ISA
,由 Sean Burke 编写,是一个模块,用于报告类 ISA 树的搜索路径。参见 Class::ISA。
Cwd
现在具有双重身份:如果可能,将使用 XS 扩展(这将有望更快、更安全、更健壮),但如果不可能,则使用熟悉的 Perl 实现。
Devel::PPPort
,最初由 Kenneth Albanowski 编写,现在由 Paul Marquess 维护,已添加。它主要由 h2xs
用于增强 Perl 不同版本之间 XS 模块的可移植性。参见 Devel::PPPort。
Digest
,用于计算摘要(校验和)的前端模块,由 Gisle Aas 编写,已添加。参见 Digest。
Digest::MD5
,用于计算 RFC 1321 中定义的 MD5 摘要(校验和),由 Gisle Aas 编写,已添加。参见 Digest::MD5。
use Digest::MD5 'md5_hex';
$digest = md5_hex("Thirsty Camel");
print $digest, "\n"; # 01d19d9d2045e005c3f1b80e8b164de1
注意:MD5
向后兼容模块故意不包含在内,因为它不鼓励进一步使用。
另请参见 PerlIO::via::QuotedPrint。
Encode
,最初由 Nick Ing-Simmons 编写,现在由 Dan Kogai 维护,提供了一种在不同字符编码之间转换的机制。对 Unicode、ISO-8859-1 和 ASCII 的支持已编译到模块中。其他几种编码(如 ISO-8859 的其余部分、CP*/Win*、Mac、KOI8-R、三种变体 EBCDIC、中文、日文和韩文编码)已包含在内,可以在运行时加载。(出于空间考虑,最大的中文编码已分离到自己的 CPAN 模块 Encode::HanExtra 中,如果可用,Encode 将使用它)。参见 Encode。
Encode 模块支持的任何编码也适用于 PerlIO 使用的 ":encoding()" 层。
Hash::Util
是新受限哈希功能的接口。(由 Jeffrey Friedl、Nick Ing-Simmons 和 Michael Schwern 实现)。参见 Hash::Util。
I18N::Langinfo
可用于查询区域设置信息。参见 I18N::Langinfo。
I18N::LangTags
,由 Sean Burke 编写,具有处理 RFC3066 风格语言标签的功能。参见 I18N::LangTags。
ExtUtils::Constant
,由 Nicholas Clark 编写,是一个新的工具,用于扩展编写者生成 XS 代码以导入 C 头文件常量。参见 ExtUtils::Constant。
Filter::Simple
,由 Damian Conway 编写,是 Filter::Util::Call 的易于使用的前端。参见 Filter::Simple。
# in MyFilter.pm:
package MyFilter;
use Filter::Simple sub {
while (my ($from, $to) = splice @_, 0, 2) {
s/$from/$to/g;
}
};
1;
# in user's code:
use MyFilter qr/red/ => 'green';
print "red\n"; # this code is filtered, will print "green\n"
print "bored\n"; # this code is filtered, will print "bogreen\n"
no MyFilter;
print "red\n"; # this code is not filtered, will print "red\n"
File::Temp
,由 Tim Jenness 开发,允许您以简单、可移植和安全的方式创建临时文件和目录。参见 File::Temp。[561+]
Filter::Util::Call
,由 Paul Marquess 开发,为您提供了在 Perl 中编写源代码过滤器的框架。对于大多数用途,建议使用前端 Filter::Simple。参见 Filter::Util::Call。
if
,由 Ilya Zakharevich 开发,是一个用于条件包含模块的新 pragma。
libnet,由 Graham Barr 开发,是一组与网络编程相关的 perl5 模块。参见 Net::FTP、Net::NNTP、Net::Ping(不属于 libnet,但相关)、Net::POP3、Net::SMTP 和 Net::Time。
Perl 安装会将 libnet 设为未配置状态;使用 libnetcfg 配置它。
List::Util
,由 Graham Barr 开发,是一组通用的列表子例程,例如 sum()、min()、first() 和 shuffle()。参见 List::Util。
Locale::Constants
、Locale::Country
、Locale::Currency
Locale::Language
和 Locale::Script,由 Neil Bowers 开发,提供了各种区域设置标准的代码,例如 "fr" 代表法国,"usd" 代表美元,"ja" 代表日语。
use Locale::Country;
$country = code2country('jp'); # $country gets 'Japan'
$code = country2code('Norway'); # $code gets 'no'
参见 Locale::Constants、Locale::Country、Locale::Currency 和 Locale::Language。
Locale::Maketext
,由 Sean Burke 开发,是一个本地化框架。参见 Locale::Maketext 和 Locale::Maketext::TPJ13。后者是一篇关于软件本地化的文章,最初发表在 The Perl Journal #13 上,并经授权在此重新发布。
Math::BigRat
用于大有理数,与 Math::BigInt 和 Math::BigFloat 伴随使用,由 Tels 开发。参见 Math::BigRat。
Memoize
可以通过用空间换取时间来使您的函数更快,由 Mark-Jason Dominus 开发。参见 Memoize。
MIME::Base64
,由 Gisle Aas 开发,允许您使用 base64 编码数据,如 RFC 2045 - MIME(多用途互联网邮件扩展) 中所定义。
use MIME::Base64;
$encoded = encode_base64('Aladdin:open sesame');
$decoded = decode_base64($encoded);
print $encoded, "\n"; # "QWxhZGRpbjpvcGVuIHNlc2FtZQ=="
参见 MIME::Base64。
MIME::QuotedPrint
,由 Gisle Aas 开发,允许您使用可打印引号编码数据,如 RFC 2045 - MIME(多用途互联网邮件扩展) 中所定义。
use MIME::QuotedPrint;
$encoded = encode_qp("\xDE\xAD\xBE\xEF");
$decoded = decode_qp($encoded);
print $encoded, "\n"; # "=DE=AD=BE=EF\n"
print $decoded, "\n"; # "\xDE\xAD\xBE\xEF\n"
另请参见 PerlIO::via::QuotedPrint。
NEXT
,由 Damian Conway 开发,是一个用于方法重新分派的伪类。参见 NEXT。
open
是一个用于设置 open() 的默认 I/O 层的新 pragma。
PerlIO::scalar
由 Nick Ing-Simmons 提供,实现了如上所述的“内存中”Perl 标量的 IO。它也作为可加载 PerlIO 层的示例。其他未来的可能性包括 PerlIO::Array 和 PerlIO::Code。参见 PerlIO::scalar。
PerlIO::via
由 Nick Ing-Simmons 提供,充当 PerlIO 层,并包装由类提供的 PerlIO 层功能(通常在 Perl 代码中实现)。
PerlIO::via::QuotedPrint
由 Elizabeth Mattijsen 提供,是 PerlIO::via
类的示例。
use PerlIO::via::QuotedPrint;
open($fh,">:via(QuotedPrint)",$path);
这将自动将输出到 $fh
的所有内容转换为 Quoted-Printable。参见 PerlIO::via 和 PerlIO::via::QuotedPrint。
Pod::ParseLink
由 Russ Allbery 提供,已添加,用于解析 pod 中的 L<> 链接,如新的 perlpodspec 中所述。
Pod::Text::Overstrike
由 Joe Smith 提供,已添加。它将 POD 数据转换为格式化的覆盖文本。参见 Pod::Text::Overstrike。[561+]
Scalar::Util
是一个通用实用程序标量子例程的集合,例如 blessed()、reftype() 和 tainted()。参见 Scalar::Util。
sort
是一个新的 pragma,用于控制 sort() 的行为。
Storable
通过允许将 Perl 数据存储和检索到快速紧凑的二进制格式的文件中,为 Perl 数据结构提供持久性。因为 Storable 实际上对 Perl 数据结构进行了序列化,所以可以使用它来克隆深层、分层的数据结构。Storable 最初由 Raphael Manfredi 创建,但现在由 Abhijit Menon-Sen 维护。Storable 已增强以理解两个新的哈希特性:Unicode 键和受限哈希。参见 Storable。
Switch
由 Damian Conway 提供,已添加。只需说
use Switch;
您就在 Perl 中拥有了 switch
和 case
。
use Switch;
switch ($val) {
case 1 { print "number 1" }
case "a" { print "string a" }
case [1..10,42] { print "number in list" }
case (@array) { print "number in list" }
case /\w+/ { print "pattern" }
case qr/\w+/ { print "pattern" }
case (%hash) { print "entry in hash" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
参见 Switch。
Test::More
由 Michael Schwern 提供,是另一个用于编写测试脚本的框架,比 Test::Simple 更全面。参见 Test::More。
Test::Simple
由 Michael Schwern 提供,具有用于编写测试的基本实用程序。参见 Test::Simple。
Text::Balanced
由 Damian Conway 提供,已添加,用于从字符串中提取分隔的文本序列。
use Text::Balanced 'extract_delimited';
($a, $b) = extract_delimited("'never say never', he never said", "'", '');
$a 将是 "'never say never'",$b 将是 ', he never said'。
除了 extract_delimited() 之外,还有 extract_bracketed()、extract_quotelike()、extract_codeblock()、extract_variable()、extract_tagged()、extract_multiple()、gen_delimited_pat() 和 gen_extract_tagged()。使用这些,您可以实现相当高级的解析算法。参见 Text::Balanced。
threads
由 Arthur Bergman 提供,是解释器线程的接口。解释器线程 (ithreads) 是 Perl 5.6 中引入的新线程模型,但仅作为扩展编写器(以及 Win32 Perl 的 fork()
模拟)的内部接口可用。参见 threads、threads::shared 和 perlthrtut。
threads::shared
由 Arthur Bergman 提供,允许解释器线程共享数据。参见 threads::shared。
Tie::File
由 Mark-Jason Dominus 提供,将 Perl 数组与文件的行相关联。参见 Tie::File。
Tie::Memoize
由 Ilya Zakharevich 提供,提供按需加载的哈希。参见 Tie::Memoize。
Tie::RefHash::Nestable
由 Edward Avis 提供,允许存储哈希引用(与标准 Tie::RefHash 不同)。该模块包含在 Tie::RefHash 中。参见 Tie::RefHash。
Time::HiRes
,由 Douglas E. Wegscheid 提供,提供高分辨率计时(ualarm、usleep 和 gettimeofday)。参见 Time::HiRes。
Unicode::UCD
提供了对 Unicode 字符数据库的查询接口。参见 Unicode::UCD。
Unicode::Collate
,由 SADAHIRO Tomoyuki 开发,实现了 UCA(Unicode 排序算法)用于对 Unicode 字符串进行排序。参见 Unicode::Collate。
Unicode::Normalize
,由 SADAHIRO Tomoyuki 开发,实现了各种 Unicode 规范化形式。参见 Unicode::Normalize。
XS::APItest
,由 Tim Jenness 开发,是一个测试扩展,用于测试 XS API。目前只测试了 printf()
:如何从 XS 输出各种基本数据类型。
XS::Typemap
,由 Tim Jenness 开发,是一个测试扩展,用于测试 XS 类型映射。没有安装任何内容,但代码值得扩展编写者学习。
以下独立支持的模块已更新到 CPAN 上的最新版本:CGI、CPAN、DB_File、File::Spec、File::Temp、Getopt::Long、Math::BigFloat、Math::BigInt、podlators 包(Pod::Man、Pod::Text)、Pod::LaTeX [561+]、Pod::Parser、Storable、Term::ANSIColor、Test、Text-Tabs+Wrap。
attributes::reftype() 现在可以作用于绑定参数。
AutoLoader 现在可以使用 no AutoLoader;
禁用。
B::Deparse 已由 Robin Houston 大幅增强。它现在可以解析几乎所有标准测试套件(以便测试仍然成功)。有一个 make 目标“test.deparse”用于尝试此操作。
Carp 现在有更好的接口文档,并且添加了 @CARP_NOT 接口,以独立于 @ISA 获取对错误报告位置的可选控制,由 Ben Tilly 提供。
Class::Struct 现在可以在编译时定义类。
Class::Struct 现在在访问器被调用时,如果数组/哈希元素作为唯一参数,则会分配数组/哈希元素。
Cwd::fastcwd() 的返回值现在被污染了。
Data::Dumper 现在有一个选项可以对哈希进行排序。
Data::Dumper 现在有一个选项可以使用 B::Deparse 导出代码引用。
DB_File 现在支持更新的 Berkeley DB 版本,以及其他改进。
Devel::Peek 现在有一个用于 Perl 内存统计的接口(这仅在您使用 perl 的 malloc 并且在编译时启用了调试的情况下才有效)。
English 模块现在可以使用,而不会出现臭名昭著的性能下降,方法是说
use English '-no_match_vars';
(当然,假设您不需要麻烦的变量 $`
、$&
或 $'
。)此外,引入了 @LAST_MATCH_START
和 @LAST_MATCH_END
作为 @-
和 @+
的 English 别名。
ExtUtils::MakeMaker 已被大幅清理和修复。增强版也已移植到早期版本的 Perl 并提交到 CPAN,以便早期版本可以享受这些修复。
在 Makefile.PL 中,WriteMakefile() 的参数现在比以前更严格地检查其合理性。这可能会在安装模块时导致新的警告。有关更多详细信息,请参阅 ExtUtils::MakeMaker。
ExtUtils::MakeMaker 现在在内部使用 File::Spec,这有望提高可移植性。
Fcntl、Socket 和 Sys::Syslog 已由 Nicholas Clark 重写,以使用新的常量分派部分(请参阅 ExtUtils::Constant)。这意味着它们将更加健壮,并且有望更快。
File::Find 现在在跟踪符号链接时可以正确地执行 chdir()。[561]
File::Find 现在具有预处理和后处理回调。它还在跟踪符号链接时正确地更改目录。现在,以“next;”而不是“return;”退出的回调(调皮地)可以正常工作。
File::Find 现在(再次)是可重入的。它也变得更加便携。
File::Find 发出的警告现在属于它们自己的类别。您可以使用 use/no warnings 'File::Find';
来启用/禁用它们。
File::Glob::glob() 已重命名为 File::Glob::bsd_glob(),因为该名称与内置的 glob() 冲突。为了兼容性,旧名称仍然可用,但已弃用。[561]
File::Glob 现在支持 GLOB_LIMIT
常量来限制返回的文件名列表的大小。
IPC::Open3 现在允许使用数字文件描述符。
IO::Socket 现在有一个 atmark() 方法,如果套接字位于带外标记处,则返回 true。该方法也可以导出为 sockatmark() 函数。
如果服务名称未知,IO::Socket::INET 无法打开指定的端口。现在,它会正确地使用提供的端口号。[561]
IO::Socket::INET 支持 ReusePort 选项(如果您的平台支持)。Reuse 选项现在有一个别名 ReuseAddr。为了清晰起见,您可能希望优先使用 ReuseAddr。
IO::Socket::INET 现在支持 LocalPort
的值为零(通常意味着操作系统将生成一个)。
'use lib' 现在与 @INC 的工作方式相同。使用 'no lib' 删除目录现在可以正常工作。
Math::BigFloat 和 Math::BigInt 已由 Tels 进行了全面重写。它们现在速度快得多,并且支持各种大数库,例如 GMP 和 PARI 作为其后端。
Math::Complex 更好地处理 inf、NaN 等。
Net::Ping 已由 Rob Brown 大幅增强:现在支持多宿主,Win32 功能更好,现在有时间测量功能(可选地使用 Time::HiRes 进行高分辨率),并且现在有“外部”协议,它使用 Net::Ping::External 模块运行您的外部 ping 实用程序并解析输出。CPAN 中提供了一个 Net::Ping::External 版本。
请注意,在 Perl 发行版下运行时,一些 Net::Ping 测试被禁用了,因为无法假设以下一项或多项:本地主机上的回显端口已启用、完全的互联网连接或友好的防火墙。您可以在运行 Perl 测试套件之前将环境变量 PERL_TEST_Net_Ping 设置为“1”(一)以启用所有 Net::Ping 测试。
POSIX::sigaction() 现在更加灵活和健壮。您现在可以安装代码引用处理程序、“DEFAULT”和“IGNORE”处理程序,安装新处理程序不再是原子的。
在 Safe 中,%INC
现在在 Safe 隔室中被本地化,以便 use/require 工作。
在 DOSish 平台上的 SDBM_File 中,由于缺乏对带“空洞”文件的支持,一些键丢失了。已添加一个解决此问题的变通方法。
在 Search::Dict 中,现在可以为要搜索的行设置预处理钩子。
Shell 模块现在具有面向对象的接口。
在 Sys::Syslog 中,现在有一个故障转移机制,它将遍历备用连接机制,直到消息成功记录。
Test 模块已得到显著增强。
Time::Local::timelocal() 不再处理小数秒。其理由是,localtime() 也不处理小数秒,而 timelocal() 和 localtime() 应该互为逆运算。
vars 编译指示现在支持声明完全限定的变量。(our()
不支持也不打算支持。)
utf8::
命名空间(如编译指示中)提供各种 Perl 可调用函数,以提供对 Perl 内部 Unicode 表示的低级访问。目前只实现了 length()。
Emacs perl 模式 (emacs/cperl-mode.el) 已更新至 4.31 版。
emacs/e2ctags.pl 现在速度更快。
enc2xs
是一个工具,供人们将自己的编码添加到 Encode 模块中。
h2ph
现在支持 C 三元组。
h2xs
现在生成一个模板 README。
h2xs
现在使用 Devel::PPPort
以提高不同 Perl 版本之间的可移植性。
h2xs
使用新的 ExtUtils::Constant 模块,这将影响新创建的定义常量的扩展。由于新代码更正确(如果您有两个常量,其中第一个常量是第二个常量的前缀,则第一个常量永远不会被定义),损失更少(它对整数常量使用整数,而旧代码即使对整数常量也使用浮点数),并且速度略快,您可能需要考虑重新生成扩展代码(新方案使重新生成变得容易)。h2xs 现在也支持 C 三元组。
libnetcfg
已添加到 configure libnet 中。
perlbug
现在更加健壮。它还会将错误报告发送到 perl.org,而不是 perl.com。
perlcc
已被重写,其用户界面(即命令行)更类似于 Unix C 编译器 cc。(perlbc 工具已被删除。请改用 perlcc -B
。)请注意,perlcc 仍然被认为是实验性的,不受支持。 [561]
perlivp
是一个新的安装验证程序实用程序,可以在安装 Perl 后随时运行。
piconv
是字符转换实用程序 iconv
的实现,展示了新的 Encode 模块。
pod2html
现在允许指定缓存目录。
pod2html
现在生成 XHTML 1.0。
pod2html
现在理解使用不同行结尾符编写的 POD(PC 式 CRLF 与 Unix 式 LF 与 MacClassic 式 CR)。
s2p
已用 Perl 完全重写。(实际上,它是 Perl 中 sed 的完整实现:可以使用 psed
实用程序使用 sed 功能。)
xsubpp
现在理解嵌入在 *.xs 文件中的 POD 文档。[561]
xsubpp
现在支持 OUT 关键字。
perl56delta 详细说明了 5.005 版本和 5.6.0 版本之间的更改。
perlclib 文档记录了标准 C 库函数的内部替换。(仅对扩展编写者和 Perl 核心黑客感兴趣。)[561+]
perldebtut 是一个 Perl 调试教程。[561+]
perlebcdic 包含在 EBCDIC 平台上运行 Perl 的注意事项。[561+]
perlintro 是一个简要的 Perl 入门介绍。
perliol 文档记录了 PerlIO 的内部结构,包括层级结构。
perlmodstyle 是一个编写模块的风格指南。
perlnewmod 介绍了编写和提交新模块的方法。[561+]
perlpacktut 是一个 pack() 教程。
perlpod 已被重写,以使其更清晰,并记录多年来积累的最佳实践。
perlpodspec 是 pod 格式的更正式规范,主要针对 pod 应用程序的编写者,而不是使用 pod 编写的人员。
perlretut 是一个正则表达式教程。[561+]
perlrequick 是一个正则表达式快速入门指南。是的,比 perlretut 快得多。[561]
perltodo 已更新。
perltootc 已重命名为 perltooc(为了避免与受限于“8.3”名称的文件系统中的 perltoot 冲突)。
perluniintro 是一个在 Perl 中使用 Unicode 的入门介绍。(perlunicode 更像是一个详细的参考和背景信息)
perlutil 解释了 Perl 发行版中打包的命令行实用程序。[561+]
以下平台特定文档在安装之前可用,名为 README.platform,安装后可用,名为 perlplatform
perlaix perlamiga perlapollo perlbeos perlbs2000
perlce perlcygwin perldgux perldos perlepoc perlfreebsd perlhpux
perlhurd perlirix perlmachten perlmacos perlmint perlmpeix
perlnetware perlos2 perlos390 perlplan9 perlqnx perlsolaris
perltru64 perluts perlvmesa perlvms perlvos perlwin32
这些文档通常详细说明以下主题之一:在所述平台上配置、构建、测试、安装,有时还包括使用 Perl。
东亚 Perl 用户现在可以使用自己的语言进行欢迎:README.jp(日语)、README.ko(韩语)、README.cn(简体中文)和 README.tw(繁体中文),这些文档是用普通 pod 编写,但使用 EUC-JP、EUC-KR、EUC-CN 和 Big5 编码。这些文档将安装为
perljp perlko perlcn perltw
POSIX-BC 平台的文档称为“BS2000”,以避免与 Perl POSIX 模块混淆。
WinCE 平台的文档称为 perlce(源代码包中的 README.ce),以避免与受限于 8.3 的文件系统上的 perlwin32 文档混淆。
当 map() 生成的结果列表大于源列表时,它可能会变得非常慢。对于常见场景,性能已得到改进。[561]
sort() 也是完全可重入的,这意味着 sort 函数本身可以调用 sort()。这在之前的版本中无法可靠地工作。[561]
sort() 已更改为主要使用内部归并排序,而不是之前的快速排序。对于非常小的列表,这可能会导致排序时间略微变慢,但总的来说,速度应该至少提高 20%。额外的优势是 sort() 的最坏情况行为现在更好(在计算机科学术语中,它现在在时间 O(N log N) 内运行,而不是快速排序的 Theta(N**2) 最坏情况运行时间行为),并且 sort() 现在是稳定的(意味着具有相同键的元素将在排序之前保持排序)。有关信息,请参阅 sort
编译指示。
更详细的故事:假设你想给自己切一小块派。
@digits = ( 3,1,4,1,5,9 );
对数字进行数字排序将产生 (1,1,3,4,5,9),正如预期的那样。哪个 1
首先出现很难知道,因为一个 1
看起来很像任何其他 1
。你可以认为这完全是微不足道的,或者有点深刻。但是,如果你只想将偶数数字排在奇数数字之前,那么会产生什么?
sort { ($a % 2) <=> ($b % 2) } @digits;
唯一一个偶数数字 4
将排在最前面。但是奇数数字呢,它们都比较相等?使用用于实现 Perl 5.6 及更早版本的快速排序算法,平局的顺序取决于排序。因此,随着你添加越来越多的 Pi 数字,排序的偶数和奇数数字出现的顺序将发生变化。并且,对于足够大的 Pi 切片,Perl 5.8 中的快速排序算法即使在使用相同的输入重新调用时也不会返回相同的结果。对此的理由在于快速排序的最坏情况行为。如果你运行
sort { $a <=> $b } ( 1 .. $N , 1 .. $N );
(如果你想使用 sort 合并两个排序的数组,你可能会近似于此),将 $N 翻倍不仅会使快速排序时间翻倍,还会使它四倍。快速排序的最坏情况运行时间可以像 N**2 一样增长,即所谓的二次行为,并且它可能发生在正常使用中可能出现的模式上。对于小型数组,你不会注意到这一点,但对于大型数组,你会注意到这一点,并且你可能没有足够的时间让排序在包含一百万个元素的数组上完成。因此,5.8 快速排序在排序大型数组之前会对其进行混排,作为对二次行为的统计防御。但这意味着如果你对同一个大型数组排序两次,平局可能会以不同的方式打破。
由于排序规则不可预测,以及二次方最坏情况行为,快速排序几乎完全被稳定的归并排序取代。稳定意味着在保持输入数组中原始出现顺序的情况下解决平局。所以
sort { ($a % 2) <=> ($b % 2) } (3,1,4,1,5,9);
将产生 (4,3,1,1,5,9),保证。偶数和奇数在输出中出现的顺序与它们在输入中出现的顺序相同。归并排序的最坏情况为 O(N log N) 行为,这是可以达到的最佳值。具有讽刺意味的是,这种归并排序在快速排序变为二次方的地方表现得特别好:归并排序在 O(N) 时间内对 (1..$N, 1..$N) 进行排序。但快速排序在最后一刻被拯救,因为它在某些输入和平台上比归并排序更快。例如,如果你真的不关心偶数和奇数的顺序,快速排序将在 O(N) 时间内运行;它非常擅长对少量不同元素的多次重复进行排序。快速排序的“分而治之”策略在具有相对较小、非常快缓存的平台上效果很好。最终,问题会缩减到一个适合缓存的问题,从那时起它将受益于更高的内存速度。
快速排序通过实现一个排序 pragma 来控制排序的各个方面而得以拯救。stable 子 pragma 强制稳定行为,无论算法如何。_quicksort 和 _mergesort 子 pragma 是选择底层实现的笨拙方法。开头的 _
是一个提醒,这些子 pragma 可能无法在 5.8 之后继续存在。选择实现的更合适机制存在,但它们来不及拯救快速排序。
哈希现在使用 Bob Jenkins 的“一次一个”哈希键算法 (http://burtleburtle.net/bob/hash/doobs.html)。该算法速度相当快,同时产生的值分布比旧的哈希算法 (最初由 Chris Torek 创建,后来由 Ilya Zakharevich 调整) 好得多。在对所有 3 个字符的可打印 ASCII 键进行哈希时,该算法输出的哈希值更接近于通过 DIEHARD 随机数生成测试。根据 perlbench,此更改并未影响 Perl 的整体速度。
unshift() 现在应该明显更快。
INSTALL 现在解释了如何在非 64 位平台上配置 Perl 以使用 64 位整数。
Policy.sh 策略更改:如果您正在重用 Policy.sh 文件 (参见 INSTALL),并且您使用 Configure -Dprefix=/foo/bar,并且在旧的 Policy 中 $prefix eq $siteprefix 和 $prefix eq $vendorprefix,现在它们都将更改为新的前缀 /foo/bar。(以前只有 $prefix 更改。)如果您不喜欢这种新行为,请明确指定 prefix、siteprefix 和 vendorprefix。
提供了一个新的可选 Perl 库位置 otherlibdirs。它可以用于例如供应商附加组件,而不会干扰 Perl 自己的库目录。
在许多平台上,供应商提供的“cc”过于简化,无法构建 Perl(基本上,“cc”不支持 ANSI C)。如果似乎是这种情况,并且“cc”似乎不是 GNU C 编译器“gcc”,则会自动尝试查找并使用“gcc”。
gcc 需要紧密跟踪操作系统版本,以避免构建问题。如果 Configure 发现 gcc 是为与正在运行的操作系统版本不同的版本构建的,它现在会发出一个清晰可见的警告,表明可能存在问题。
由于 Perl 5.8 与之前的 Perl 版本不兼容,Configure 不再建议将 5.005 模块包含在 @INC 中。
Configure -S
现在可以非交互式运行。[561]
由于过时,已删除对 pdp11 风格内存模型的 Configure 支持。[561]
configure.gnu 现在可以处理包含空格的选项。
installperl 现在将所有内容输出到 STDERR。
由于 PerlIO 现在是大多数平台上的默认设置,因此“-perlio”不再附加到 $Config{archname}(也称为 $^O)。相反,如果您明确选择不使用 perlio(Configure 命令行选项 -Uuseperlio),您将获得“-stdio”附加。
与体系结构名称相关的另一个更改是,仅当您的指针为 64 位宽时,才会附加“-64all”(-Duse64bitall 或“最大 64 位”)。(确切地说,use64bitall 被忽略。)
在 AFS 安装中,可以使用 Configure 参数 -Dafsroot=/some/where/else
将 AFS 的根目录配置为除默认的 /afs 之外的其他位置。
APPLLIB_EXP 是一种鲜为人知的配置时定义,现已记录在案。它可以用于将特定于站点的目录预先添加到 Perl 的默认搜索路径 (@INC);有关信息,请参见 INSTALL。
构建 Perl(以及据推测,DB_File 扩展)时使用的 Berkeley DB 版本现在可以通过 Perl 中的 @Config{qw(db_version_major db_version_minor db_version_patch)}
和 C 中的 DB_VERSION_MAJOR_CFG DB_VERSION_MINOR_CFG DB_VERSION_PATCH_CFG
获得。
在 INSTALL 中记录了为 DB、NDBM 和 ODBM 的兼容模式构建 Berkeley DB3。
如果您有 CPAN 访问权限(网络或本地副本,例如 CD-ROM),您可以在 Configure 期间指定要使用 -Dextras=... 选项与 Perl 一起构建和安装的额外模块。有关更多详细信息,请参见 INSTALL。
除了 config.over 之外,还有一个新的覆盖文件 config.arch 可用。此文件应该由提示文件编写者用于体系结构范围的更改(与用于站点范围更改的 config.over 相反)。
如果您的文件系统支持符号链接,您可以通过以下方式在源目录之外构建 Perl:
mkdir perl/build/directory
cd perl/build/directory
sh /path/to/perl/source/Configure -Dmksymlinks ...
这将在 perl/build/directory 中创建一个符号链接树,指向 /path/to/perl/source 中的文件。原始文件保持不变。Configure 完成后,您只需说
make all test
Perl 就会在 perl/build/directory 中构建和测试。[561]
对于 Perl 开发人员,添加了一些用于分析和调试的新 make 目标;请参阅 perlhack。
INSTALL 中添加了有关如何构建最小 Perl 安装的指南。
线程扩展现在在 ithreads (Configure -Duseithreads
) 下根本不构建,因为它无论如何都无法工作(线程扩展需要使用 -Duse5005threads
进行配置)。
请注意,5.005 线程不受支持且已弃用:如果您有为旧线程编写的代码,则应将其迁移到新的 ithreads 模型。
perl 用于将浮点数转换为字符串的 Gconvert 宏 ($Config{d_Gconvert}) 现在对使用 sprintf %.*g 规则进行转换更加挑剔。一些以前使用 gcvt 的平台现在可能采用速度较慢的 sprintf。
通过以下方式创建特殊(例如,调试)版本的 perl 的过时方法
make LIBPERL=libperld.a
已被删除。请改用 -DDEBUGGING。
有关已知支持 Perl 的平台列表,请参阅 "perlport 中的受支持平台"。
AIX 动态加载现在应该得到更好的支持。
AIX 现在应该更好地支持 gcc、线程和 64 位。此外,AIX 中的长双精度支持现在应该更好。请参阅 perlaix。
AtheOS ( http://www.atheos.cx/ ) 是一个新平台。
BeOS 已被收回。
DG/UX 平台现在支持 5.005 样式的线程。请参阅 perldgux。
DYNIX/ptx 平台(也称为 dynixptx)在 osvers 4.5.2 或附近得到支持。
EBCDIC 平台(z/OS(也称为 OS/390)、POSIX-BC 和 VM/ESA)已恢复。许多测试套件测试仍然失败,Unicode 和 EBCDIC 的共存尚未完全解决,但情况比 Perl 5.6 好得多。请参阅 perlos390、perlbs2000(用于 POSIX-BC)和 perlvmesa 以获取更多信息。(注意:对 VM/ESA 的支持已在 Perl v5.18.0 中删除。相关信息位于 README.vmesa 中)
在 HP-UX 10.20 上,使用 -Duseithreads 或 -Duse5005threads 构建 Perl 现在可以正常工作(之前仅在 10.30 或更高版本上工作)。您需要安装线程库包。请参阅 README.hpux。[561]
Mac OS Classic 现在在主流源代码包中得到支持(MacPerl 自 Perl 5.004 以来一直可用,但现在标准 Perl 和 MacPerl 的源代码库已同步)[561]
Mac OS X(或 Darwin)现在应该能够在 HFS+ 文件系统上构建 Perl。(以前的大小写不敏感会混淆 Perl 构建过程。)
NCR MP-RAS 现在得到支持。[561]
所有特定于 NetBSD 的补丁(除了安装特定的补丁之外)都已合并回主发行版。
Novell 的 NetWare 现在得到支持。请参阅 perlnetware。
NonStop-UX 现在得到支持。[561]
NEC SUPER-UX 现在得到支持。
所有特定于 OpenBSD 的补丁(除了安装特定的补丁之外)都已合并回主发行版。
Perl 已使用 GNU pth 用户级线程包(http://www.gnu.org/software/pth/pth.html)进行了测试。Perl 的所有线程测试现在都可以正常工作,但需要在测试中添加一些 yield(),因此虽然 pth(和其他用户级线程实现)可以被认为是“与 Perl ithreads 一起工作”,但请记住底层线程实现可能无法抢占。
Stratus VOS 现在使用 Perl 的原生构建方法(Configure)得到支持。这是在 VOS 上构建 Perl 的推荐方法。旧方法(构建 miniperl)仍然可用。请参阅 perlvos。[561+]
Amdahl UTS Unix 大型机平台现在得到支持。[561]
WinCE 现在得到支持。请参阅 perlce。
z/OS(以前称为 OS/390,以前称为 MVS OE)现在支持动态加载。但是,默认情况下不会选择此选项,您必须在 Configure 的参数中指定 -Dusedl。[561]
已追踪到许多内存泄漏和未初始化的内存访问。最重要的是,匿名子例程过去会泄漏很多。[561]
autouse pragma 不适用于 Multi::Part::Function::Names。
caller() 在某些情况下会导致核心转储。Carp 有时会受到此问题的影响。特别是,caller() 现在为已从符号表中删除的子例程返回 (unknown)
的子例程名称。
列表上下文中 chop(@list) 以相反的顺序返回被截断的字符。这已反转为正确的顺序。[561]
Configure 在构建 Perl 二进制文件时不再包含 DBM 库(dbm、gdbm、db、ndbm)。唯一的例外是 SunOS 4.x,它需要它们。[561]
非十进制但为数字字符串常量(例如“0x23”)的行为在不同平台上有所不同:在某些平台上,它被视为 35,在某些平台上被视为 0,在某些平台上被视为浮点数(别问)。这是因为 Perl 在字符串到数字转换结果未定义的情况下使用了操作系统库:现在 Perl 在数字上下文中始终将此类字符串视为零。
几个调试器修复:退出代码现在反映脚本退出代码,条件“0”现在被正确处理,d 命令现在检查行号,$. 不再被破坏,并且所有调试器输出现在如果设置了 RemotePort,则会正确发送到套接字。[561]
调试器 (perl5db.pl) 已被修改为通过 (CommandSet=580) 提供更一致的命令界面。perl5db.t 也被添加来测试这些更改,并作为进一步测试的占位符。
参见 perldebug.
调试器有一个新的 dumpDepth 选项来控制嵌套结构被转储的最大深度。x 命令已扩展,因此 x N EXPR 将以最多 N 级深度转储 EXPR 的值。
如果安装了 CPAN 模块 PadWalker,调试器现在可以显示词法变量。
DESTROY 的顺序变得更加可预测。
Perl 5.6.0 在将扩展静态构建到 perl 中时,可能会发出有关 dl_error() 重定义的虚假警告。此问题已得到修复。[561]
dprofpp -R 不起作用。
*foo{FORMAT} 现在可以工作。
无穷大现在被识别为一个数字。
UNIVERSAL::isa 不再错误地缓存方法。(这在 5.6.0 中破坏了 Tk 扩展。)[561]
词法 I:如果词法变量在 eval "" 中的子例程定义中尚未被引用,则在 eval "" 外部的词法变量在 eval "" 中的子例程定义中无法正确解析。
词法 II:词法变量在文件范围内泄漏到在词法变量之前声明的子例程中。
词法警告现在在作用域之间以及进入 eval "..." 中正确传播。
use warnings qw(FATAL all) 没有按预期工作。此问题已得到修复。[561]
warnings::enabled() 现在如果调用者未使用词法警告,则会正确报告 $^W 的状态。[561]
使用 eval 和 #line 进行的行重新编号现在可以工作。[561]
修复了大量内存泄漏,尤其是在 eval "" 中。
本地化的绑定变量不再泄漏内存
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Used to leak memory every time local() was called;
# in a loop, this added up.
local($tied_hash{Foo}) = 1;
如果本地化的哈希元素(和 %ENV)在本地化之前不存在,则它们将被正确地取消本地化以使其不存在。
use Tie::Hash;
tie my %tied_hash => 'Tie::StdHash';
...
# Nothing has set the FOO element so far
{ local $tied_hash{FOO} = 'Bar' }
# This used to print, but not now.
print "exists!\n" if exists $tied_hash{FOO};
作为此修复的副作用,绑定哈希接口**必须**定义 EXISTS 和 DELETE 方法。
mkdir() 现在忽略目录名称中的尾部斜杠,如 POSIX 规定。
某些版本的 glibc 存在 modfl() 问题。这会影响使用 -Duselongdouble
构建的程序。此版本的 Perl 检测到此问题并提供了解决方案。glibc 版本 2.2.2 已知修复了 modfl() 错误。
无符号数的模运算现在可以正常工作(4063328477 % 65535 以前返回 27406,而不是 27047)。[561]
在 5.6.0 中引入的一些“非数字”警告已消除,以提高与 5.005 的兼容性。无穷大现在被识别为数字。[561]
在某些情况下,数值转换无法正确识别字符串值的更改。[561]
属性(如:shared)无法与 our() 一起使用。
our() 变量不会导致虚假的“变量不会保持共享”警告。[561]
在两个兄弟块中声明的同名“our”变量会导致关于变量“重新声明”的虚假警告。问题已得到解决。[561]
pack "Z" 现在使用 "\0" 正确终止字符串。
修复了密码例程,这些例程在某些影子密码平台(例如 HP-UX)上会导致 getpwent() 返回每隔一个条目。
PERL5OPT 环境变量(用于将命令行参数传递给 Perl)无法处理多个选项组。[561]
包含空格的 PERL5OPT 无法正常工作。
printf() 不再将数字区域设置重置为“C”。
qw(a\\b)
现在解析为 'a\\b'
:即三个字符,而不是四个。[561]
在早期版本中,pos() 在 s///ge 中没有返回正确的值。现在已正确处理。[561]
使用 printf/sprintf 打印四字节整数(64 位整数)现在可以正常工作,无需 q L ll 前缀(假设您使用的是支持四字节整数的平台)。
对引用和重载标量的正则表达式现在可以正常工作。[561+]
右侧魔法 (GMAGIC) 在许多情况下(例如字符串连接)可能会被调用太多次。
scalar() 现在即使在空上下文环境中使用也会强制使用标量上下文。
SOCKS 支持现在更加健壮。
sort() 参数现在在正确的 wantarray 上下文中编译(它们意外地使用了 sort() 本身的上下文)。比较块现在在标量上下文中运行,要排序的参数始终提供列表上下文。[561]
将 POSIX 字符类 `[[:space:]]` 更改为包含(很少使用的)垂直制表符。添加了一个新的 POSIX 风格字符类 `[[:blank:]]`,表示水平空白(目前是空格和制表符)。
已对 `sprintf()` 的污染行为进行了合理化。它不再污染浮点格式的结果,使其行为与字符串插值一致。[561]
已修复一些不一致的污染传播情况(例如在哈希值中)。
Perl 5.6.0 中的 RE 引擎意外地对某些类型的简单模式匹配进行了悲观处理。现在对这些情况的处理有所改善。[561]
正则表达式调试输出(无论是通过 `use re 'debug'` 还是通过 `-Dr`)现在看起来更好。[561]
多行匹配,如 `"a\nxb\n" =~ /(?!\A)x/m` 有缺陷。该错误已修复。[561]
在某些情况下,使用 `$&` 会触发核心转储。现在已避免这种情况。[561]
如果匹配失败,正则表达式捕获的子匹配项(`$1`、`$2` 等)现在更一致地被取消设置,而不是在其中留下错误的数据。[561]
在某些情况下,以 "slurp" 模式打开的文件上的 `readline()` 在末尾可能会返回一个额外的 ""(空行)。此问题已得到纠正。[561]
意外地禁用了对 perlvar 中描述的特殊变量的符号引用的自动创建(如 `${$num}`)。现在它再次有效。[561]
Sys::Syslog 忽略了 `LOG_AUTH` 常量。
现在,`$AUTOLOAD`、`sort()`、`lock()` 以及在多个线程中同时生成子进程都是线程安全的。
Tie::Array 的 SPLICE 方法已损坏。
允许在非修改 `tr///` 的左侧使用只读字符串。
如果 `STDERR` 被绑定,由 `warn` 和 `die` 引起的警告现在会正确地传递给它。
一些 Unicode 修复。
现在应该透明地跳过 Perl 文件(脚本、模块)开头的 BOM(字节顺序标记)。现在应该可以正确读取 UTF-16 和 UCS-2 编码的 Perl 文件。
字符表已更新至 Unicode 3.2.0。
与 utf8 数据进行比较不会神奇地将非 utf8 数据升级为 utf8。(例如,如果您混合了来自 I/O 和 Unicode 的数据,则您的输出可能会被神奇地编码为 UTF-8。)
生成非法 Unicode 代码点(如 U+FFFE 或 UTF-16 代理)现在也会生成可选警告。
`IsAlnum`、`IsAlpha` 和 `IsWord` 现在匹配标题大小写。
使用 `.` 运算符或通过变量插值、`eq`、`substr`、`reverse`、`quotemeta`、`x` 运算符、使用 `s///` 进行替换、单引号 UTF-8 进行的连接现在应该可以正常工作。
现在 `tr///` 运算符可以正常工作。请注意,`tr///CU` 功能已被删除(但请参见 `pack('U0', ...)`)。
eval "v200"
现在可以正常工作了。
Perl 5.6.0 在解析 m/\x{ab}/ 时出现错误,导致出现错误警告。此问题已修复。[561]
Unicode 类别(如 IsDigit
)中缺少零条目。
大型无符号数(大于 2**31 的数)有时会失去其无符号性,导致算术运算出现错误结果。[561]
Perl 解析器已使用随机输入和马尔可夫链输入进行压力测试,并修复了发现的少量崩溃和死锁问题。
BSDI 4.*
Perl 现在可以在 4.0 之后的 BSD/OS 上运行。
所有 BSD
设置 $0
现在可以正常工作(尽可能地;有关详细信息,请参阅 perlvar)。
Cygwin
进行了大量更新;目前与 Cygwin 1.3.10 同步。
以前,DYNIX/ptx 在其 Configure 探测非阻塞 I/O 时存在问题。
EPOC
EPOC 现在得到更好的支持。请参阅 README.epoc。[561]
FreeBSD 3.*
Perl 现在可以在 3.0 之后的 FreeBSD 上运行。
HP-UX
README.hpux 已更新;Configure -Duse64bitall
现在可以正常工作;现在使用 HP-UX malloc 而不是 Perl malloc。
IRIX
进行了大量编译标志和提示增强;意外混合 32 位和 64 位库(一个注定失败的尝试)变得更加困难。
Linux
长双精度数现在应该可以正常工作(请参阅 INSTALL)。[561]
Linux 以前在使用 accept()、recvfrom()(在 Perl 中:recv())、getpeername() 和 getsockname() 时存在与 sockaddrlen 相关的问题。
Mac OS Classic
如果您拥有 Metrowerks 开发环境和缺少的 Mac 特定工具包位,则现在可以在 Mac OS Classic 中编译标准 Perl 发行版。有关详细信息,请联系 macperl 邮件列表。
MPE/iX
Perl 5.6.0 之后的 MPE/iX 更新。请参阅 README.mpeix。[561]
NetBSD/threads:尝试安装 GNU pth(应该在软件包集合中,或 http://www.gnu.org/software/pth/),并使用 -Duseithreads 配置。
NetBSD/sparc
Perl 现在可以在 NetBSD/sparc 上运行。
OS/2
现在可以与 usethreads 一起使用(请参阅 INSTALL)。[561]
Solaris
使用 Sun Workshop 编译器实现的 64 位功能现在可以正常工作。
Stratus VOS
本机构建方法需要至少 VOS 版本 14.5.0 和 GNU C++/GNU 工具 2.0.1 或更高版本。Perl pack 函数现在将溢出值映射为 +infinity,将下溢值映射为 -infinity。
Tru64(也称为 Digital UNIX,也称为 DEC OSF/1)
操作系统版本字母现在记录在 $Config{osvers} 中。允许使用 gcc 编译(以前明确禁止)。不建议使用 gcc 编译,因为即使使用 gcc 2.95.2,也会导致代码错误。
Unicos
修复了各种导致在构建过程中或之后出现核心转储的对齐问题;不再在运行时因数学错误而崩溃;现在使用完整的四字整数(64 位),之前为了速度只使用 46 位整数。
VMS
有关未在此处列出的重要更改,请参阅 "VMS 中的套接字扩展动态" 和 "OpenVMS Alpha 上的 IEEE 格式浮点数默认值"。
尽管存在 CRT 错误,chdir() 现在工作得更好;现在可以与 MULTIPLICITY 一起使用(请参阅 INSTALL);现在可以与 Perl 的 malloc 一起使用。
以前,通过 keys 或 values 对 %ENV 元素进行污染是未实现的。现在它按文档说明工作。
waitpid 模拟已得到改进。最严重的错误(现已修复)是 pid 为 -1 会导致对系统上所有进程的通配符搜索。
在 7.0 之前的 VMS 版本上,POSIX 样式的信号现在得到了更好的模拟。
system 函数和反引号运算符的功能得到改进,错误处理也得到改进。[561]
文件访问测试现在使用当前进程权限,而不是用户的默认权限,这有时会导致报告的访问权限与实际访问权限不匹配。此改进仅在 VMS v6.0 及更高版本上可用。
有一个新的 kill 实现基于 sys$sigprc,它允许较旧的 VMS 系统(7.0 之前)使用 kill 发送信号,而不是简单地强制退出。此实现还允许更高版本的系统在信号处理程序中调用 kill。
迭代逻辑名称转换现在限制为 10 次迭代,以模仿 SHOW LOGICAL 和其他 OpenVMS 功能。
Windows
信号处理现在比以前工作得更好。它现在使用 Windows 消息循环实现,因此不太容易发生随机崩溃。
fork() 模拟现在更加健壮,但仍然存在一些深奥的错误和注意事项。有关详细信息,请参阅 perlfork。[561+]
失败的(伪)fork 现在返回 undef 并将 errno 设置为 EAGAIN。[561]
以下模块现在可以在 Windows 上工作
ExtUtils::Embed [561]
IO::Pipe
IO::Poll
Net::Ping
IO::File::new_tmpfile() 不再限于每个进程 32767 次调用。
对于不存在的目录,更好的 chdir() 返回值。
现在支持使用 64 位平台 SDK 工具编译 perl。
Win32::SetChildShowWindow() 内置函数可用于控制子进程创建的窗口的可见性。有关详细信息,请参阅 Win32。
通过 waitpid($pid, &POSIX::WNOHANG)
支持对子进程(或伪进程)的非阻塞等待。
对 `system()` 函数在使用多个参数时的行为进行了理顺。每个未加引号的参数将自动加上引号以保护空格,并且参数中现有的空格将被保留。这通过避免在 Perl 程序中需要 Windows `cmd` shell 特定的引号,从而提高了 `system(@args)` 的可移植性。
请注意,这意味着某些可能依赖于早期错误行为的脚本可能不再正常工作。例如,`system("nmake /nologo", @args)` 现在将尝试运行文件 `nmake /nologo`,并且在找不到此文件时将失败。另一方面,Perl 现在将正确执行诸如 `system("c:/Program Files/MyApp/foo.exe", @args)` 之类的代码。
Perl 头文件不再抑制 Microsoft Visual C++ 编译器中的常见警告。这意味着在编译 XS 代码时现在可能会出现额外的警告。
Borland C++ v5.5 现在是支持的编译器,可以构建 Perl。但是,生成的二进制文件仍然与其他支持的编译器(GCC 和 Visual C++)生成的二进制文件不兼容。[561]
使用 `open(F, ">&MYSOCK")` 复制套接字句柄现在可以在 Windows 9x 下工作。[561]
%ENV 中的当前目录条目现在会正确传播到子进程。[561]
新的 %ENV 条目现在会传播到子进程。[561]
Win32::GetCwd() 在驱动器根目录时会正确返回 C:\ 而不是 C:。chdir() 和 Cwd::cwd() 中的其他错误也已修复。[561]
makefile 现在默认使用 ActiveState ActivePerl(一个流行的 Win32 二进制发行版)中启用的功能。[561]
HTML 文件现在将安装在 c:\perl\html 中,而不是 c:\perl\lib\pod\html
Perl 使用的注册表设置中现在允许使用 REG_EXPAND_SZ 键。[561]
现在可以从所有线程(而不仅仅是第一个线程)发送()。[561]
ExtUtils::MakeMaker 现在使用 $ENV{LIB} 来搜索库。[561]
每个线程保留的堆栈更少,因此可以同时运行更多线程。(每个线程仍然是 16M。)[561]
File::Spec->tmpdir()
现在优先使用 C:/temp 而不是 /tmp(在 Perl 作为服务运行时效果更好)。
在 ithreads 下更好地处理 UNC 路径。[561]
wait()、waitpid() 和反引号现在在 Windows 9x 下返回正确的退出状态。[561]
已修复 accept() 中的套接字句柄泄漏。[561]
有关更多详细信息,请参阅 perldiag。
转录运算符中的歧义范围(如 a-z-9)现在会发出警告。
chdir("") 和 chdir(undef) 现在会发出弃用警告,因为它们会导致可能无意中将目录更改为主目录。如果您确实想要这样做,请说 chdir()。
添加了两个新的调试选项:如果您使用调试功能编译了 Perl,则可以使用 -DT [561] 和 -DR 选项分别跟踪标记化并将引用计数添加到变量显示中。
词法警告类别“已弃用”不再是“语法”类别的子类别。它现在是一个独立的顶级类别。
未修饰的 dump() 现在会发出警告,建议使用显式的 CORE::dump(),如果这就是真正的意图。
“无法识别的转义”警告已扩展为包括 \8
、\9
和 \_
。无需转义任何 \w
字符。
现在所有正则表达式编译错误消息都希望更容易理解,因为错误消息现在出现在失败的正则表达式之前,并且失败点现在由 <-- HERE
标记清楚地标记。
各种 I/O(和套接字)函数,如 binmode()、close() 等,现在如果在未打开的文件句柄(或套接字)或已关闭的文件句柄(或套接字)上非逻辑地使用,则会更一致地发出警告。
在文件句柄上使用 lstat() 现在会发出警告。(这样做毫无意义。)
-M
和 -m
选项现在会在您没有提供模块名称时发出警告。
如果您在 use
中指定了所需的最低版本,则匹配名称但未定义 $VERSION 的模块将导致致命错误。
在左值上下文中为 vec() 使用负偏移量现在是一种可警告的违规行为。
overload::constant 的参数数量奇数现在会发出警告。
匿名哈希中的元素数量奇数现在会发出警告。
各种“仅为...打开”、“在...关闭”、“从未打开”警告会为 main
包中的文件句柄删除 main::
前缀,例如 STDIN
而不是 main::STDIN
。
子例程原型现在经过更仔细的检查,例如,如果您使用了非原型字符,您可能会收到警告。
如果尝试将(未祝福的)引用用作数组索引,则会发出警告。
push @a;
和 unshift @a;
(没有要推入或移位的元素)现在会发出警告。这可能是生成和评估代码的问题。
如果您尝试使用 "pack" in perlfunc 使用 "C"
格式将小于 0 或大于 255 的数字打包,您将收到可选的警告。类似地,对于 "c"
格式和一个小于 -128 或大于 127 的数字。
pack P
格式现在需要显式大小。
unpack w
现在会警告未终止的压缩整数。
已添加与 PerlIO 使用相关的警告。
某些正则表达式修饰符,例如(?o)
,只有应用于整个正则表达式才有意义。如果您尝试以其他方式使用,则会收到可选警告。
可变长度后顾尚未实现,尝试使用它会提示您。
使用数组或哈希作为引用(例如%foo->{bar}
)已被弃用一段时间。现在您将收到可选警告。
添加了与使用新的受限哈希功能相关的警告。
不支持数组和哈希的自绑定,即使尝试这样做也会导致致命错误。
在标量上下文中使用sort
现在会发出可选警告。这没有做任何有用的事情,因为排序没有执行。
在split()
中使用/g
修饰符毫无意义,会导致警告。
在数组末尾使用splice()
现在会导致警告。
格式错误的 Unicode 编码(UTF-8 和 UTF-16)会导致大量警告,尝试使用 UTF-16 代理(未实现)也会导致警告。
尝试在 I/O 流上使用 Unicode 字符而没有标记流的编码(使用open()
或binmode()
)会导致“宽字符”警告。
在use/require
中使用 v 字符串会导致(向后)可移植性警告。
添加了与使用解释器线程及其共享数据相关的警告。
PerlIO 现在是默认值。
perlapi.pod(perlguts 的配套文档)现在尝试记录内部 API。
您现在可以构建一个名为 microperl 的真正最小的 perl。构建 microperl 甚至不需要运行 Configure;make -f Makefile.micro
就足够了。注意:microperl 做出了许多假设,其中一些可能过于大胆;生成的执行文件可能会以奇妙的方式崩溃或出现其他故障。仅供谨慎的黑客使用。
添加了 rsignal()、whichsig()、do_join()、op_clear、op_null、ptr_table_clear()、ptr_table_free()、sv_setref_uv() 以及几个 UTF-8 接口到公开的 API。有关可用 API 的完整列表,请参阅 perlapi。
使通过 croak() 传播自定义异常成为可能。
现在 xsubs 可以像 subs 一样具有属性。(好吧,至少是内置属性。)
dTHR 和 djSP 已被弃用;前者已删除(因为它是一个无操作),后者已替换为 dSP。
PERL_OBJECT 已完全删除。
MAGIC 常量(例如'P'
)已宏化(例如PERL_MAGIC_TIED
),以提高源代码的可读性和可维护性。
正则表达式编译器现在维护一个结构,该结构使用原始正则表达式表达式的相应语法特征来标识编译字节码中的节点。该信息附加到struct regexp
的新offsets
成员。有关更完整的信息,请参阅 perldebguts。
C 代码已经变得更加gcc -Wall
清洁。一些平台上仍然存在一些警告信息,因此如果您使用 gcc 编译,您可能会看到一些关于可疑实践的警告。这些警告正在解决中。
perly.c、sv.c 和 sv.h 现在已经进行了大量的注释。
关于如何使用 Perl 源代码库的文档已添加到 Porting/repository.pod 中。
现在有几个用于分析的 make 目标。
(此更改已在 5.7.0 中完成,但在此处重复说明。)(5.7.0 比 5.6.1 早发布:开发分支 5.7 比维护分支 5.6 早发布)
2000 年 8 月,在 Perl 的可选 suidperl 组件中发现了一个潜在的安全漏洞。suidperl 默认情况下不会被构建或安装。截至 2001 年 11 月,唯一已知的受影响平台是 Linux,很可能是所有 Linux 发行版。CERT 和各种供应商和发行商已收到有关此漏洞的警报。有关更多信息,请访问 http://www.cpan.org/src/5.0/sperl-2000-08-05/sperl-2000-08-05.txt。
问题是由 Perl 尝试使用外部程序 /bin/mail 报告疑似安全漏洞攻击造成的。在 Linux 平台上,/bin/mail 程序有一个未公开的功能,当与 suidperl 结合使用时,可以访问 root shell,从而导致严重的安全漏洞,而不是报告漏洞攻击。如果您没有 /bin/mail,或者您有“安全 setuid 脚本”,或者 suidperl 未安装,那么您是安全的。
漏洞攻击报告功能已从 Perl 5.8.0(以及维护版本 5.6.1)中完全删除,并且也已从所有 Perl 5.7 版本中删除,因此该特定漏洞不再存在。但是,不幸的是,仍然可能存在其他安全漏洞。suidperl 功能很可能将在 Perl 5.10 中删除。无论如何,suidperl 只能由了解其操作方式和使用 suidperl 而不是其他解决方案(例如 sudo)的原因的安全专家使用(请参阅 http://www.courtesan.com/sudo/)。
新增了几个测试,特别是针对 lib 和 ext 子部分。回归测试套件中现在大约有 69 000 个独立测试(分布在约 700 个测试脚本中)(5.6.1 有大约 11 700 个测试,分布在 258 个测试脚本中)。确切的数字取决于使用的平台和 Perl 配置。当然,许多新测试是由新模块引入的,但总的来说,Perl 现在得到了更彻底的测试。
由于测试数量众多,运行回归测试套件将比以前花费更长的时间:预计该套件的运行时间将是 perl 5.6 的 4-5 倍。在非常快的机器上,您希望在约 6-8 分钟内完成该套件(挂钟时间)。
测试现在以与早期 Perl 不同的顺序报告。(这是因为 t/lib 下的测试脚本已移动到更接近它们正在测试的库/扩展的位置。)
编译器套件正在慢慢改进,但它仍然处于高度实验阶段。不建议在生产环境中使用。
local %tied_array;
无法按预期工作:旧值被错误地恢复。这将在未来版本中更改,但我们尚不清楚新的语义将是什么。无论如何,更改将破坏依赖于当前(定义不明确)语义的现有代码,因此一般情况下请避免这样做。
一些扩展(如 mod_perl)已知在 `largefiles` 中存在问题,这是 Perl 5.6.0 带来的更改,其中文件偏移量默认为 64 位宽(在支持的情况下)。模块可能根本无法编译,或者它们可能编译并运行不正常。目前,这个问题没有好的解决方案,但 Configure 现在在 %Config 哈希中提供了适当的非 largefile ccflags、ldflags、libswanted 和 libs(例如,$Config{ccflags_nolargefiles}),因此遇到问题的扩展可以尝试在没有 largefileness 的情况下配置自身。这无疑不是一个干净的解决方案,而且该解决方案甚至可能根本不起作用。一个潜在的失败是是否可以(或者,如果可以,是否应该)将具有不同文件偏移量概念的二进制文件链接在一起;所有这些都是平台相关的。
for (1..5) { $_++ }
毫无怨言地工作。它不应该。(你应该只能修改循环中的左值元素。)你可以通过将 1..5 替换为 1、2、3、4、5 来查看正确的行为。
使用 mod_perl 1.27 或更高版本。
不要惊慌。请改阅 INSTALL 的“make test”部分。
使用 libwww-perl 5.65 或更高版本。
使用 PDL 2.3.4 或更高版本。
您可能会遇到类似“Undefined symbol "Perl_get_sv"”或“can't resolve symbol 'Perl_get_sv'”的错误,或者符号可能是“Perl_sv_2pv”。这可能意味着您正在尝试将旧的共享 Perl 库(或与之链接的扩展)与 Perl 5.8.0 可执行文件一起使用。Perl 曾经有这样的子例程,但现在不再是这种情况。检查您的共享库路径,以及这些目录中的任何共享 Perl 库。
有时,此问题也可能表明 Perl 5.8.0 安装不完整,请参阅 "Mac OS X dyld undefined symbols" 以了解示例以及如何处理它。
数组和哈希的自绑定在相当深层且难以修复的方式中被破坏。作为一种权宜之计,为了避免人们对神秘的结果(最常见的是核心转储)感到沮丧,它现在被禁止(即使尝试也会导致致命错误)。
对全局变量自绑定的更改导致它们被递归引用(请参阅:"perlobj 中的两阶段垃圾回收")。现在,您需要显式解绑才能销毁自绑定的全局变量。此行为可能会在以后的日期修复。
标量和 IO 对象的自绑定有效。
如果此测试失败,则表明您的 libc(C 库)不是线程安全的。此特定测试对 localtime() 调用进行压力测试,以确定它是否线程安全。有关更多信息,请参阅 perlthrtut。
请注意,对 5.005 风格线程的支持已弃用,是实验性的,实际上不受支持。在 5.10 中,预计它将被删除。您应该将代码迁移到 ithreads。
以下测试已知会由于 5.005 线程实现中的基本问题而失败。这些不是新的失败 - Perl 5.005_0x 具有相同的错误,但没有这些测试。
../ext/B/t/xref.t 255 65280 14 12 85.71% 3-14
../ext/List/Util/t/first.t 255 65280 7 4 57.14% 2 5-7
../lib/English.t 2 512 54 2 3.70% 2-3
../lib/FileCache.t 5 1 20.00% 5
../lib/Filter/Simple/t/data.t 6 3 50.00% 1-3
../lib/Filter/Simple/t/filter_only. 9 3 33.33% 1-2 5
../lib/Math/BigInt/t/bare_mbf.t 1627 4 0.25% 8 11 1626-1627
../lib/Math/BigInt/t/bigfltpm.t 1629 4 0.25% 10 13 1628-
1629
../lib/Math/BigInt/t/sub_mbf.t 1633 4 0.24% 8 11 1632-1633
../lib/Math/BigInt/t/with_sub.t 1628 4 0.25% 9 12 1627-1628
../lib/Tie/File/t/31_autodefer.t 255 65280 65 32 49.23% 34-65
../lib/autouse.t 10 1 10.00% 4
op/flip.t 15 1 6.67% 15
这些失败不太可能得到修复,因为 5.005 风格的线程被认为从根本上是错误的。(基本上发生的事情是,竞争线程可能会破坏共享的全局状态,一个很好的例子是正则表达式引擎的状态。)
以下测试可能会由于计时问题而间歇性地失败,例如,如果系统负载过重。
t/op/alarm.t
ext/Time/HiRes/HiRes.t
lib/Benchmark.t
lib/Memoize/t/expmod_t.t
lib/Memoize/t/speed.t
如果失败,请尝试手动运行它们,例如
./perl -Ilib ext/Time/HiRes/HiRes.t
对于普通数组,$foo = \$bar[1]
将为 $bar[1]
分配 undef
(假设它之前不存在),但对于绑定/魔法数组和哈希,这种自动生成不会发生,因为目前没有办法捕获引用创建。同样的问题也影响到对绑定/魔法数组/哈希中不存在的索引/键进行切片。
标识符名称中可以使用 Unicode,但包/类或子程序名称中不能使用。虽然从 Perl 5.8.0 开始,这方面的一些有限功能确实存在,但这更多是偶然的,而不是设计的;对于上述目的使用 Unicode 是不受支持的。
这种未完成的原因之一是它(目前)固有的不可移植性:由于包名称和子程序名称可能需要映射到文件和目录名称,因此文件系统的 Unicode 功能变得很重要——不幸的是,没有可移植的答案。
如果使用 AIX 原生 make 命令,而不是仅仅使用 "make",请使用 "make all"。在某些设置中,前者已知会错误地尝试运行 "make install"。或者,您可能想使用 GNU make。
在 AIX 4.2 中,使用 C++ 函数(使用静态变量)的 Perl 扩展可能存在问题,因为静态变量没有被初始化。在较新的 AIX 版本中,这个问题通过将 Perl 与 libC_r 库链接来解决,但不幸的是,在 AIX 4.2 中,该库存在一个模糊的错误,导致与时间相关的各种函数(如 time() 和 gettimeofday())返回错误的值,因此在 AIX 4.2 中,Perl 没有与 libC_r 链接。
vac 5.0.0.0 可能为 Perl 生成有问题的代码
AIX C 编译器 vac 版本 5.0.0.0 可能生成有问题的代码,导致一些随机测试在作为 "make test" 的一部分运行时失败,但当手动运行失败的测试时,它们会成功。我们建议升级到至少 vac 版本 5.0.1.0,该版本已知可以正确编译 Perl。"lslpp -L|grep vac.C" 将告诉您 vac 版本。请参阅 README.aix。
如果构建线程化的 Perl,您可能会从 pp_sys.c 中收到编译警告
"pp_sys.c", line 4651.39: 1506-280 (W) Function argument assignment between types "unsigned char*" and "const void*" is not allowed.
这是无害的;这是由 getnetbyaddr() 和 getnetbyaddr_r() 对其第一个参数的类型略有不同造成的。
如果您在 Linux/alpha 或 *BSD/Alpha 上看到 op/pack、op/pat、op/regexp 或 ext/Storable 测试失败,可能是时候升级您的 gcc 了。2.95.3 之前的 gcc 肯定不够好,gcc 3.1 甚至可能更好。(RedHat Linux/alpha 使用 gcc 3.1 报告没有问题,Linux 2.4.18 使用 gcc 2.95.4 也是如此。)(在 Tru64 中,最好使用捆绑的 C 编译器。)
Perl 5.8.0 无法在 AmigaOS 上构建。它在 ithreads 工作期间的某个时间点崩溃了,我们找不到 Amiga 专家来解决这些问题。Perl 5.6.1 仍然适用于 AmigaOS(5.7.2 开发版本也是如此)。
以下测试在 BeOS Personal 5.03 中的 5.8.0 Perl 上失败
t/op/lfs............................FAILED at test 17
t/op/magic..........................FAILED at test 24
ext/Fcntl/t/syslfs..................FAILED at test 17
ext/File/Glob/t/basic...............FAILED at test 3
ext/POSIX/t/sigaction...............FAILED at test 13
ext/POSIX/t/waitpid.................FAILED at test 1
(注意:更多信息在 README.beos 中可用,直到 Perl v5.18.0 中删除对 BeOS 的支持)
例如,在为 Cygwin 构建 Tk 扩展时,您可能会收到一条错误消息,提示“无法重新映射”。这是 Cygwin 的一个已知问题,解决方法详见:http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html
可以在 FAT 文件系统上构建但不能安装(或测试构建)NDBM_File。在 NTFS 上安装(或构建)工作正常。如果尝试在 FAT 安装(或构建)上进行测试,则会发生以下失败
../ext/NDBM_File/ndbm.t 13 3328 71 59 83.10% 1-2 4 16-71
../ext/ODBM_File/odbm.t 255 65280 ?? ?? % ??
../lib/AnyDBM_File.t 2 512 12 2 16.67% 1 4
../lib/Memoize/t/errors.t 0 139 11 5 45.45% 7-11
../lib/Memoize/t/tie_ndbm.t 13 3328 4 4 100.00% 1-4
run/fresh_perl.t 97 1 1.03% 91
NDBM_File 失败,ODBM_File 只是核心转储。
如果您打算只在 FAT 上运行(或在 FAT 上使用 AnyDBM_File),请使用 -Ui_ndbm 和 -Ui_dbm 选项运行 Configure,以防止构建 NDBM_File 和 ODBM_File。
t/op/stat............................FAILED at test 29
lib/File/Find/t/find.................FAILED at test 1
lib/File/Find/t/taint................FAILED at test 1
lib/h2xs.............................FAILED at test 15
lib/Pod/t/eol........................FAILED at test 1
lib/Test/Harness/t/strap-analyze.....FAILED at test 8
lib/Test/Harness/t/test-harness......FAILED at test 23
lib/Test/Simple/t/exit...............FAILED at test 1
以上故障在 5.8.0 中已知,使用长文件名进行本地构建,但如果在 dosemu 下运行,由于 dosemu 的限制(以及可能的错误),还有一些其他故障
t/comp/cpp...........................FAILED at test 3
t/op/inccode.........................(crash)
以及一些 lib/ExtUtils 测试,以及数百个 Encode/t/Aliases.t 失败,这些失败在长文件名下工作正常。因此,您可能真的更喜欢本地构建和长文件名。
这是 FreeBSD 4.5 的 readdir_r() 中已知的错误,已在 FreeBSD 4.6 中修复(参见 perlfreebsd (README.freebsd))。
在 FreeBSD 中,ISO 8859-15 本地化环境可能会无法通过本地化测试 117。这是由于字符 \xFF(带分音符的 y)和 \xBE(带分音符的 Y)在不区分大小写匹配时行为不正常导致的。据了解,这个问题已在最新的 FreeBSD 版本中修复。(http://www.freebsd.org/cgi/query-pr.cgi?pr=34308)
使用 MIPSpro 7.3.1.2m 或 7.3.1.3m 编译器的 IRIX 可能会在运行 List::Util 测试 ext/List/Util/t/shuffle.t 时出现核心转储错误。这似乎是编译器错误,因为如果使用 gcc 编译,则不会出现核心转储,并且在其他平台上该测试也没有出现任何失败。
类似地,构建 Digest::MD5 扩展已知会失败,并显示“*** Termination code 139 (bu21)”。
解决方法是降低优化级别(Configure -Doptimize=-O2)。
如果 perl 使用 -Duse64bitall 配置,lib/posix 子测试 10 的成功结果可能会在子测试 9 的成功结果之前到达,这会导致测试工具混淆,从而认为子测试 9 失败。
这是 glibc 2.2.5 中使用 long long 整型时已知的错误。(http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612)
没有已知的修复方法。
在运行“make test”之前,请记住将环境变量 LC_ALL 设置为“C”(setenv LC_ALL C),以避免出现大量关于 Mac OS X 中损坏的本地化的警告。
以下测试已知在 Mac OS X 10.1.5 中由于 Mac OS X 中包含的 Berkeley DB 实现存在错误(旧)而无法通过
Failed Test Stat Wstat Total Fail Failed List of Failed
-------------------------------------------------------------------------
../ext/DB_File/t/db-btree.t 0 11 ?? ?? % ??
../ext/DB_File/t/db-recno.t 149 3 2.01% 61 63 65
如果您在 UFS 分区上构建,您也可能会看到 t/op/stat.t 子测试 #9 失败。这是由于 Darwin 的 UFS 不支持 inode 修改时间导致的。
此外,ext/POSIX/t/posix.t 子测试 #10 也会失败,但目前已跳过,因为失败是 Apple 的问题,而不是 Perl 的问题(阻塞信号丢失)。
如果您使用ithreads配置,ext/threads/t/libc.t将失败。再次强调,这不是Perl的错误——Mac OS X的libc不是线程安全的(在这个特定的测试中,发现localtime()调用不是线程安全的)。
如果您在安装Perl 5.8.0后收到有关缺少符号的警告,例如
dyld: perl Undefined symbols
_perl_sv_2pv
_perl_get_sv
您可能在/Library/Perl中有一个旧的Perl 5.8.0之前的安装(或部分安装)(未定义的符号在5.8.0之前的Perl中存在)。似乎由于某种原因,“make install”并不总是完全覆盖/Library/Perl中的文件。您可以将旧的Perl共享库移出此位置
cd /Library/Perl/darwin/CORE
mv libperl.dylib libperlold.dylib
然后重新执行“make install”。请注意,以上操作对于使用/usr/local/bin/perl的任何内容来说都是非常具有破坏性的。如果这没有帮助,您可能需要尝试从/Library/Perl下的所有.bundle文件中删除所有文件,然后再次执行“make install”。
以下测试已知在OS/2上失败(为了清晰起见,只显示失败,不显示完整的错误消息)
../lib/ExtUtils/t/Mkbootstrap.t 1 256 18 1 5.56% 8
../lib/ExtUtils/t/Packlist.t 1 256 34 1 2.94% 17
../lib/ExtUtils/t/basic.t 1 256 17 1 5.88% 14
lib/os2_process.t 2 512 227 2 0.88% 174 209
lib/os2_process_kid.t 227 2 0.88% 174 209
lib/rx_cmprt.t 255 65280 18 3 16.67% 16-18
op/sprintf 测试 91、129 和 130 已知在某些平台上失败。例如,使用sfio的任何平台,以及Compaq/Tandem的NonStop-UX。
测试 91 已知在 QNX6 (nto) 上失败,因为sprintf '%e',0
错误地生成0.000000e+0
而不是0.000000e+00
。
对于测试 129 和 130,失败的平台不符合 ANSI C 标准:确切地说,ANSI X3.159 1989 第 134 页第 19ff 行。(它们在使用 printf 格式“%.0f”格式化 0.6 和 -0.6 时,生成“1”和“-1”以外的内容;最常见的是,它们生成“0”和“-0”。)
socketpair 测试已知在 SCO 3.2v5.0.4 中不正常
ext/Socket/socketpair.t...............FAILED tests 15-45
如果您仍在使用 Solaris 2.5(又名 SunOS 5.5),您可能会在 lib/locale.t 中遇到失败(测试核心转储)。建议的解决方法是升级您的 Solaris。
以下测试已知在使用 Perl 配置为使用 64 位整数的 Solaris x86 中失败
ext/Data/Dumper/t/dumper.............FAILED at test 268
ext/Devel/Peek/Peek..................FAILED at test 7
以下测试已知在 SUPER-UX 上失败
op/64bitint...........................FAILED tests 29-30, 32-33, 35-36
op/arith..............................FAILED tests 128-130
op/pack...............................FAILED tests 25-5625
op/pow................................
op/taint..............................# msgsnd failed
../ext/IO/lib/IO/t/io_poll............FAILED tests 3-4
../ext/IPC/SysV/ipcsysv...............FAILED tests 2, 5-6
../ext/IPC/SysV/t/msg.................FAILED tests 2, 4-6
../ext/Socket/socketpair..............FAILED tests 12
../lib/IPC/SysV.......................FAILED tests 2, 5-6
../lib/warnings.......................FAILED tests 115-116, 118-119
op/pack 失败(“无法压缩 op/pack.t 第 126 行的负数”)很严重,但目前尚未解决。它表明 C 编译器的符号处理存在一些问题,64bitint、arith 和 pow 失败也表明了这一点。大多数其他问题表明 SysV IPC 存在问题。
使用 Term::ReadKey 2.20 或更高版本。
在配置期间,测试
Guessing which symbols your C compiler and preprocessor define...
可能会失败,并出现类似的错误消息
CC-20 cc: ERROR File = try.c, Line = 3
The identifier "bad" is undefined.
bad switch yylook 79bad switch yylook 79bad switch yylook 79bad switch yylook 79#ifdef A29K
^
CC-65 cc: ERROR File = try.c, Line = 3
A semicolon is expected at this point.
这是由 UNICOS/mk 中 awk 实用程序的错误引起的。您可以忽略此错误,但它会导致一个小问题:您无法完全利用 h2ph 实用程序(参见 h2ph),该实用程序可用于将 C 头文件转换为 Perl 库,主要用于从 Perl 访问使用 C 预处理器 cpp 定义的常量。由于上述错误,转换后的头文件的部分内容将不可见。幸运的是,如今对 h2ph 的需求很少。
如果使用解释器线程(ithreads)构建 Perl,则 getgrent()、getgrnam() 和 getgrgid() 函数由于 UNICOS/mk 的多线程支持中的错误而无法返回组成员列表。这意味着在列表上下文中,这些函数将只返回三个值,而不是四个。
有一些已知的测试失败。(注意:相关信息在 README.uts 中可用,直到 Perl v5.18.0 中删除对 UTS 的支持。)
当 Perl 在 VOS Release 14.5.0 上使用原生构建过程和 GNU C++/GNU Tools 2.0.1 构建时,所有尝试的测试要么通过,要么导致 TODO(忽略)失败。
使用默认配置,不应该出现任何报告的测试失败,尽管有一些标记为 TODO 的测试,这些测试指出了需要进一步调试和/或移植工作的领域。
在多 CPU 盒子里,I/O 缓冲存在一些问题:一些输出可能会出现两次。
使用 XML::Parser 2.31 或更高版本。
z/OS 有相当多的测试失败,但情况实际上比 5.6.0 中好得多;只是添加了太多新的模块和测试。
Failed Test Stat Wstat Total Fail Failed List of Failed
---------------------------------------------------------------------------
../ext/Data/Dumper/t/dumper.t 357 8 2.24% 311 314 325 327
331 333 337 339
../ext/IO/lib/IO/t/io_unix.t 5 4 80.00% 2-5
../ext/Storable/t/downgrade.t 12 3072 169 12 7.10% 14-15 46-47 78-79
110-111 150 161
../lib/ExtUtils/t/Constant.t 121 30976 48 48 100.00% 1-48
../lib/ExtUtils/t/Embed.t 9 9 100.00% 1-9
op/pat.t 922 7 0.76% 665 776 785 832-
834 845
op/sprintf.t 224 3 1.34% 98 100 136
op/tr.t 97 5 5.15% 63 71-74
uni/fold.t 780 6 0.77% 61 169 196 661
710-711
dumper.t 和 downgrade.t 中的失败是测试中的问题,io_unix 和 sprintf 中的失败是 USS(UDP 套接字和 printf 格式)中的问题。pat、tr 和 fold 失败是 EBCDIC 引起的真正 Perl 问题(在 pat 和 fold 的情况下,将 EBCDIC 与 Unicode 结合在一起)。Constant 和 Embed 可能是在测试中出现的问题(因为它们测试了 Perl 构建扩展的能力,而这似乎运行得相当好。)
尽管大部分功能正常,但在 EBCDIC 平台上,Unicode 支持仍然存在问题。一个已知问题是针对小于 256 的代码点的 `\p{}` 和 `\P{}` 正则表达式结构:`pP` 用于测试 Unicode 代码点,而不知道 EBCDIC。
Time::Piece
(以前称为 Time::Object
)已被移除,因为人们认为它没有足够的价值成为核心模块。不过,它仍然是一个有用的模块,可以在 CPAN 上获得。
不幸的是,Perl 5.8 无法在 AmigaOS 上构建;这在某个时候意外地发生了。由于没有那么多 Amiga 开发人员可用,我们无法及时修复和测试它以用于 5.8.0。Perl 5.6.1 仍然适用于 AmigaOS(5.7.2 开发版本也是如此)。
PerlIO::Scalar
和 PerlIO::Via
(大写)在 5.8.0 之前被重命名为 PerlIO::scalar
和 PerlIO::via
(全部小写)。主要原因是让所有核心 PerlIO 层都具有全小写名称。“插件”的命名方式与往常一样,例如 PerlIO::via::QuotedPrint
。
threads::shared::queue
和 threads::shared::semaphore
在 5.8.0 之前被重命名为 Thread::Queue
和 Thread::Semaphore
。主要原因是让线程模块遵循正常的命名方式,即 Thread::
(threads
和 threads::shared
本身更像是 pragma,它们影响编译时,因此保持小写)。
如果您发现您认为是错误,您可以查看最近发布到 comp.lang.perl.misc 新闻组的文章和 Perl 错误数据库 http://bugs.perl.org/。您也可以在 Perl 主页 https://perldotcom.perl5.cn/ 上找到信息。
如果您认为您遇到了未报告的错误,请运行随您的发行版提供的 perlbug 程序。请务必将您的错误缩减到一个微小但足够的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],由 Perl 移植团队进行分析。
有关更改的详细信息,请参阅 Changes 文件。
有关如何构建 Perl 的信息,请参阅 INSTALL 文件。
有关一般信息,请参阅 README 文件。
有关版权信息,请参阅 Artistic 和 Copying 文件。
作者:Jarkko Hietaniemi <[email protected]>。