内容

名称

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 版本)。

5.8.0 中的亮点

不兼容的更改

二进制不兼容

Perl 5.8 与早期版本的 Perl 不兼容。

您需要重新编译您的 XS 模块。

(纯 Perl 模块应该继续工作。)

不兼容的主要原因是新的 IO 架构,称为 PerlIO。PerlIO 是默认配置,因为没有它,Perl 5.8 的许多新功能无法使用。换句话说:您只需要重新编译包含 XS 代码的模块,对此表示歉意。

在未来的 Perl 版本中,不支持 PerlIO 的 XS 模块可能会完全不支持。然而,这对模块作者来说不应该太难:PerlIO 被设计为 stdio 接口的直接替换(在源代码级别)。

根据您的平台,我们决定打破二进制兼容性的原因还有其他原因,请继续阅读。

64 位平台和 malloc

如果您的指针宽度为 64 位,则不再使用 Perl malloc,因为它不适用于 8 字节指针。此外,通常这些平台上的系统 malloc 针对这种大型内存模型进行了更好的优化,而不是 Perl malloc。一些内存密集型 Perl 应用程序(如 PDL)无法与 Perl 的 malloc 良好配合。最后,除了 Perl 之外的其他应用程序(如 mod_perl)倾向于使用系统 malloc。这些平台包括 Alpha 和 64 位 HPPA、MIPS、PPC 和 Sparc。

AIX 动态加载

AIX 动态加载现在在 AIX 版本 4.3 及更高版本中使用 AIX 的原生 dlopen 接口,而不是旧的模拟接口。此更改可能会破坏与已编译模块的向后兼容性。进行此更改是为了使 Perl 更加符合其他应用程序(如 mod_perl),这些应用程序使用 AIX 原生接口。

my 变量的属性现在在运行时处理

my EXPR : ATTRS 语法现在在运行时应用变量属性。(子例程和 our 变量仍然在编译时应用属性。)有关更多详细信息,请参阅 attributes。但是,这尤其允许变量属性对 tie 接口有用,这是早期版本的一个缺陷。请注意,新语义不适用于 Attribute::Handlers 模块(截至版本 0.76)。

VMS 中的 Socket 扩展动态加载

Socket 扩展现在是动态加载的,而不是静态构建的。这可能是也可能不是 VMS 的古老 TCP/IP 堆栈的问题:我们不知道,因为我们无法在这些配置中测试 Perl。

OpenVMS Alpha 上的 IEEE 格式浮点数默认值

Perl 现在在 OpenVMS Alpha 上使用 IEEE 格式 (T_FLOAT) 作为默认的内部浮点格式,这可能会破坏与外部库或现有数据的二进制兼容性。G_FLOAT 仍然可以作为配置选项使用。VAX 上的默认值 (D_FLOAT) 没有改变。

新的 Unicode 语义 (几乎不再使用 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 。脚本和块之间的区别在于,脚本是语言或语言组使用的字形,而块是基于 Unicode 编号的(主要是)256 个字符的人为分组。

一般来说,脚本更具包容性,但并非普遍如此。例如,虽然 Latin 脚本包含所有拉丁字符及其各种带重音符号的版本,但它不包含各种标点符号或数字(因为它们不完全是 Latin)。

现在支持许多其他属性,包括 \p{L&}\p{Any} \p{Assigned}\p{Unassigned}\p{Blank} [561] 和 \p{SpacePerl} [561](当然还有它们的 \P{...} 版本)。有关详细信息和更多新增内容,请参阅 perlunicode

在使用 \p{...}\P{...} 时,名称前缀 InIs 现在几乎总是可选的。唯一的例外是,当块名称与脚本名称冲突时,需要使用 In 前缀来表示 Unicode 块。例如,\p{Tibetan} 指的是脚本,而 \p{InTibetan} 指的是块。当没有名称冲突时,您可以省略块名称中的 In(例如 \p{BraillePatterns}),但为了安全起见,最好始终使用 In)。

REF(...) 替代 SCALAR(...)

对引用的引用现在会字符串化为 "REF(0x81485ec)" 而不是 "SCALAR(0x81485ec)",以便与 ref() 的返回值保持一致。

pack/unpack D/F 重用

未记录的 pack/unpack 模板字母 D/F 已被重用以获得更好的使用:现在它们代表长双精度(如果平台支持)和 NV(Perl 内部浮点类型)。(它们曾经是 d/f 的别名,但你永远不会知道。)

glob() 现在按字母顺序返回文件名

来自 glob()(或 <...>)的文件名列表现在默认按字母顺序排序,以符合 csh 规范(这在大多数 Unix 平台上之前就是这样)。(bsd_glob() 仍然按平台原生排序,ASCII 或 EBCDIC,除非指定了 GLOB_ALPHASORT。)[561]

弃用

核心增强功能

Unicode 大修

现在,Unicode 的总体可用性应该比 Perl 5.6.0(甚至 5.6.1)要高得多。Unicode 可用于哈希键,正则表达式中的 Unicode 现在应该可以工作,tr/// 中的 Unicode 现在应该可以工作,I/O 中的 Unicode 现在应该可以工作。有关介绍,请参见 perluniintro,有关详细信息,请参见 perlunicode

PerlIO 现为默认值

ithreads

Arthur Bergman 实现的新解释器线程(简称“ithreads”)多线程实现取代了旧的“5.005 线程”实现。在 ithreads 模型中,线程之间任何数据共享必须是显式的,这与数据共享隐式的模型相反。参见 threadsthreads::shared,以及 perlthrtut

作为 ithreads 实现的一部分,Perl 还将使用任何必要的和可检测的重入 libc 接口。

受限哈希

受限哈希被限制为一组特定的键,不能添加该组之外的任何键。此外,可以限制单个键,以便不能删除该键,也不能更改其值。没有涉及新的语法:Hash::Util 模块是接口。

安全信号

Perl 过去很脆弱,因为在不合适的时间到达的信号可能会破坏 Perl 的内部状态。现在 Perl 将信号处理推迟到安全的时候(在操作码之间)。

此更改可能会产生意想不到的副作用,因为信号不再立即中断 Perl。Perl 现在将首先完成正在执行的操作,例如完成内部操作(如 sort())或外部操作(如 I/O 操作),然后才查看任何到达的信号(并在开始下一个操作之前)。由于当前操作始终先完成,因此不再存在损坏的内部状态,但信号可能需要更多时间才能被听到。请注意,从可能阻塞的操作中退出仍然应该有效。

对数字的理解

总的来说,在 Perl 对数字(整数和浮点数)的理解方面,已经进行了大量的修复。由于在许多系统中,标准数字解析函数(如 strtoul()atof())似乎存在错误,因此 Perl 试图绕过这些缺陷。这有望导致更准确的数字。

Perl 现在尝试在内部使用整数在数字转换和基本算术运算(+ - * /)中使用整数,并尝试将结果存储为整数。此更改导致算术运算通常更快,并且始终损失更少。(以前 Perl 在其数学运算中始终偏好浮点数。)

数组现在始终插值到双引号字符串中 [561]

在双引号字符串中,数组现在始终插值,无论如何。在早期版本的 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。

其他更改

模块和语义

新的模块和语义

更新和改进的模块和语义

实用程序更改

新文档

以下平台特定文档在安装之前可用,名为 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

性能增强

安装和配置改进

通用改进

新平台或改进的平台

有关已知支持 Perl 的平台列表,请参阅 "perlport 中的受支持平台"

选定的错误修复

已追踪到许多内存泄漏和未初始化的内存访问。最重要的是,匿名子例程过去会泄漏很多。[561]

平台特定更改和修复

新的或更改的诊断

有关更多详细信息,请参阅 perldiag

更改的内部结构

安全漏洞已修复 [561]

(此更改已在 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/)。

新增测试

新增了几个测试,特别是针对 libext 子部分。回归测试套件中现在大约有 69 000 个独立测试(分布在约 700 个测试脚本中)(5.6.1 有大约 11 700 个测试,分布在 258 个测试脚本中)。确切的数字取决于使用的平台和 Perl 配置。当然,许多新测试是由新模块引入的,但总的来说,Perl 现在得到了更彻底的测试。

由于测试数量众多,运行回归测试套件将比以前花费更长的时间:预计该套件的运行时间将是 perl 5.6 的 4-5 倍。在非常快的机器上,您希望在约 6-8 分钟内完成该套件(挂钟时间)。

测试现在以与早期 Perl 不同的顺序报告。(这是因为 t/lib 下的测试脚本已移动到更接近它们正在测试的库/扩展的位置。)

已知问题

编译器套件仍处于实验阶段

编译器套件正在慢慢改进,但它仍然处于高度实验阶段。不建议在生产环境中使用。

本地化绑定数组和哈希已损坏

local %tied_array;

无法按预期工作:旧值被错误地恢复。这将在未来版本中更改,但我们尚不清楚新的语义将是什么。无论如何,更改将破坏依赖于当前(定义不明确)语义的现有代码,因此一般情况下请避免这样做。

构建扩展可能会因 largefiles 而失败

一些扩展(如 mod_perl)已知在 `largefiles` 中存在问题,这是 Perl 5.6.0 带来的更改,其中文件偏移量默认为 64 位宽(在支持的情况下)。模块可能根本无法编译,或者它们可能编译并运行不正常。目前,这个问题没有好的解决方案,但 Configure 现在在 %Config 哈希中提供了适当的非 largefile ccflags、ldflags、libswanted 和 libs(例如,$Config{ccflags_nolargefiles}),因此遇到问题的扩展可以尝试在没有 largefileness 的情况下配置自身。这无疑不是一个干净的解决方案,而且该解决方案甚至可能根本不起作用。一个潜在的失败是是否可以(或者,如果可以,是否应该)将具有不同文件偏移量概念的二进制文件链接在一起;所有这些都是平台相关的。

在 for(..) 中修改 $_

for (1..5) { $_++ }

毫无怨言地工作。它不应该。(你应该只能修改循环中的左值元素。)你可以通过将 1..5 替换为 1、2、3、4、5 来查看正确的行为。

mod_perl 1.26 无法使用多线程 Perl 构建

使用 mod_perl 1.27 或更高版本。

lib/ftmp-security 测试警告“系统可能不安全”

不要惊慌。请改阅 INSTALL 的“make test”部分。

libwww-perl (LWP) 无法通过 base/date #51

使用 libwww-perl 5.65 或更高版本。

PDL 无法通过一些测试

使用 PDL 2.3.4 或更高版本。

Perl_get_sv

您可能会遇到类似“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 对象的自绑定有效。

ext/threads/t/libc

如果此测试失败,则表明您的 libc(C 库)不是线程安全的。此特定测试对 localtime() 调用进行压力测试,以确定它是否线程安全。有关更多信息,请参阅 perlthrtut

线程(5.005 风格)测试失败

请注意,对 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 不起作用

标识符名称中可以使用 Unicode,但包/类或子程序名称中不能使用。虽然从 Perl 5.8.0 开始,这方面的一些有限功能确实存在,但这更多是偶然的,而不是设计的;对于上述目的使用 Unicode 是不受支持的。

这种未完成的原因之一是它(目前)固有的不可移植性:由于包名称和子程序名称可能需要映射到文件和目录名称,因此文件系统的 Unicode 功能变得很重要——不幸的是,没有可移植的答案。

平台特定问题

AIX

使用旧版 gccs 的 Alpha 系统会使多个测试失败

如果您在 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 编译器。)

AmigaOS

Perl 5.8.0 无法在 AmigaOS 上构建。它在 ithreads 工作期间的某个时间点崩溃了,我们找不到 Amiga 专家来解决这些问题。Perl 5.6.1 仍然适用于 AmigaOS(5.7.2 开发版本也是如此)。

BeOS

以下测试在 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 “无法重新映射”

例如,在为 Cygwin 构建 Tk 扩展时,您可能会收到一条错误消息,提示“无法重新映射”。这是 Cygwin 的一个已知问题,解决方法详见:http://sources.redhat.com/ml/cygwin/2001-12/msg00894.html

Cygwin ndbm 测试在 FAT 上失败

可以在 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。

DJGPP 故障

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 失败,这些失败在长文件名下工作正常。因此,您可能真的更喜欢本地构建和长文件名。

使用 ithreads 构建的 FreeBSD 在读取大型目录时会发生核心转储

这是 FreeBSD 4.5 的 readdir_r() 中已知的错误,已在 FreeBSD 4.6 中修复(参见 perlfreebsd (README.freebsd))。

FreeBSD 在 ISO 8859-15 本地化环境下无法通过本地化测试 117

在 FreeBSD 中,ISO 8859-15 本地化环境可能会无法通过本地化测试 117。这是由于字符 \xFF(带分音符的 y)和 \xBE(带分音符的 Y)在不区分大小写匹配时行为不正常导致的。据了解,这个问题已在最新的 FreeBSD 版本中修复。(http://www.freebsd.org/cgi/query-pr.cgi?pr=34308)

IRIX 无法通过 ext/List/Util/t/shuffle.t 或 Digest::MD5 测试

使用 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)。

HP-UX lib/posix 子测试 9 在 LP64 配置下无法通过

如果 perl 使用 -Duse64bitall 配置,lib/posix 子测试 10 的成功结果可能会在子测试 9 的成功结果之前到达,这会导致测试工具混淆,从而认为子测试 9 失败。

使用 glibc 2.2.5 的 Linux 在使用 -Duse64bitint 时无法通过 t/op/int 子测试 #6

这是 glibc 2.2.5 中使用 long long 整型时已知的错误。(http://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=65612)

使用 Sfio 的 Linux 无法通过 op/misc 测试 48

没有已知的修复方法。

Mac OS X

在运行“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()调用不是线程安全的)。

Mac OS X dyld 未定义符号

如果您在安装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 测试失败

以下测试已知在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

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”。)

SCO

socketpair 测试已知在 SCO 3.2v5.0.4 中不正常

ext/Socket/socketpair.t...............FAILED tests 15-45

Solaris 2.5

如果您仍在使用 Solaris 2.5(又名 SunOS 5.5),您可能会在 lib/locale.t 中遇到失败(测试核心转储)。建议的解决方法是升级您的 Solaris。

Solaris x86 在使用 -Duse64bitint 配置 Perl 时测试失败

以下测试已知在使用 Perl 配置为使用 64 位整数的 Solaris x86 中失败

ext/Data/Dumper/t/dumper.............FAILED at test 268
ext/Devel/Peek/Peek..................FAILED at test 7

SUPER-UX (NEC SX)

以下测试已知在 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 在 Win32 上无法正常工作

使用 Term::ReadKey 2.20 或更高版本。

UNICOS/mk

UTS

有一些已知的测试失败。(注意:相关信息在 README.uts 中可用,直到 Perl v5.18.0 中删除对 UTS 的支持。)

VOS(Stratus)

当 Perl 在 VOS Release 14.5.0 上使用原生构建过程和 GNU C++/GNU Tools 2.0.1 构建时,所有尝试的测试要么通过,要么导致 TODO(忽略)失败。

VMS

使用默认配置,不应该出现任何报告的测试失败,尽管有一些标记为 TODO 的测试,这些测试指出了需要进一步调试和/或移植工作的领域。

Win32

在多 CPU 盒子里,I/O 缓冲存在一些问题:一些输出可能会出现两次。

XML::Parser 不工作

使用 XML::Parser 2.31 或更高版本。

z/OS(OS/390)

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 支持仍然不稳定

尽管大部分功能正常,但在 EBCDIC 平台上,Unicode 支持仍然存在问题。一个已知问题是针对小于 256 的代码点的 `\p{}` 和 `\P{}` 正则表达式结构:`pP` 用于测试 Unicode 代码点,而不知道 EBCDIC。

Perl 5.7 中出现,现已移除

Time::Piece(以前称为 Time::Object)已被移除,因为人们认为它没有足够的价值成为核心模块。不过,它仍然是一个有用的模块,可以在 CPAN 上获得。

不幸的是,Perl 5.8 无法在 AmigaOS 上构建;这在某个时候意外地发生了。由于没有那么多 Amiga 开发人员可用,我们无法及时修复和测试它以用于 5.8.0。Perl 5.6.1 仍然适用于 AmigaOS(5.7.2 开发版本也是如此)。

PerlIO::ScalarPerlIO::Via(大写)在 5.8.0 之前被重命名为 PerlIO::scalarPerlIO::via(全部小写)。主要原因是让所有核心 PerlIO 层都具有全小写名称。“插件”的命名方式与往常一样,例如 PerlIO::via::QuotedPrint

threads::shared::queuethreads::shared::semaphore 在 5.8.0 之前被重命名为 Thread::QueueThread::Semaphore。主要原因是让线程模块遵循正常的命名方式,即 Thread::threadsthreads::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 文件。

有关版权信息,请参阅 ArtisticCopying 文件。

历史

作者:Jarkko Hietaniemi <[email protected]>。