perl581delta - perl v5.8.1 的新增内容
本文档介绍了 5.8.0 版本和 5.8.1 版本之间的差异。
如果您要从 5.6.1 等早期版本进行升级,请首先阅读 perl58delta,其中介绍了 5.6.0 和 5.8.0 之间的差异。
如果您对 5.6.1 感到好奇,那么它在修复错误方面与开发版本 5.7.1 相当。感到困惑?此时间表希望能提供一些帮助:它列出了新的主要版本、其维护版本和开发版本。
New Maintenance Development
5.6.0 2000-Mar-22
5.7.0 2000-Sep-02
5.6.1 2001-Apr-08
5.7.1 2001-Apr-09
5.7.2 2001-Jul-13
5.7.3 2002-Mar-05
5.8.0 2002-Jul-18
5.8.1 2003-Sep-25
主要出于安全原因,“哈希的随机排序”变得更加随机。以前,虽然 keys()、values() 和 each() 中哈希元素的顺序基本上是随机的,但仍然是可重复的。但是,现在,顺序在 Perl 的不同运行之间有所不同。
Perl 从未保证哈希键的任何顺序,并且在 Perl 5 的生命周期中,顺序已经更改了多次。此外,哈希键的顺序一直受到插入顺序的影响,并且现在仍然受到影响。
添加的随机性可能会影响应用程序。
一种可能的情况是应用程序的输出包含哈希数据。例如,如果您使用 Data::Dumper 模块将数据转储到不同的文件中,然后比较这些文件以查看数据是否已更改,那么现在您将得到误报,因为转储哈希的顺序会有所不同。通常,解决方法是对键(或值)进行排序;特别是对于 Data::Dumper,使用 Sortkeys
选项。如果某些特定顺序非常重要,请使用绑定的哈希:例如,Tie::IxHash 模块默认保留添加哈希元素时的顺序。
更微妙的问题是依赖于“全局销毁”的顺序。这就是在执行结束时发生的情况:Perl 销毁所有数据结构,包括用户数据。如果您的析构函数(DESTROY 子例程)对全局销毁有任何特定顺序的假设,那么可能会出现问题。例如,在某个对象的析构函数中,您不能假设任何其他类的对象仍然可用,除非您持有对它们的引用。如果环境变量 PERL_DESTRUCT_LEVEL 设置为非零值,或者如果 Perl 正在退出已生成的线程,它还将销毁不再使用的普通引用和符号表。您无法对已通过这种方式收集的类的类方法或普通函数进行调用。
哈希随机化肯定会揭示对哈希元素的某些特定顺序的隐藏假设以及明显的错误:它揭示了 Perl 核心和核心模块中的几个错误。
要在运行时禁用哈希随机化,请在运行 Perl 之前将环境变量 PERL_HASH_SEED 设置为 0(零)(有关详细信息,请参阅 perlrun 中的“PERL_HASH_SEED”),或者在编译时完全禁用该功能,请使用 -DNO_HASH_SEED
进行编译(请参阅 INSTALL)。
有关此更改背后的原始原理,请参阅 perlsec 中的“算法复杂度攻击”。
在 Perl 5.8.0 中,如果区域设置指示使用 UTF-8,则所有文件句柄(包括标准文件句柄)都隐式设置为 Unicode UTF-8。此功能导致了太多问题,因此该功能已关闭并重新设计:请参阅 “核心增强功能”。
Perl 5.6.0 中引入的版本字符串或 v 字符串(请参阅 perldata 中的“版本字符串”)功能一直是造成一些困惑的根源——尤其是在用户不想使用它,但 Perl 认为它知道得更多的时候。特别麻烦的功能是,在“=>”之前,版本字符串(“v”后跟数字)被解释为 v 字符串,而不是字符串文字。换句话说
%h = ( v65 => 42 );
自 Perl 5.6.0 以来意味着
%h = ( 'A' => 42 );
(至少在 ASCII 后代的平台上)Perl 5.8.1 恢复了更自然的解释
%h = ( 'v65' => 42 );
v65.66 和 65.66.67 等多数字 v 字符串在 Perl 5.8 中仍然是 v 字符串。
-C 开关已经以不兼容的方式更改。此开关的旧语义仅在 Win32 中有意义,并且仅在 5.6.x 版本中的“use utf8”环境中才有意义,并且对于 5.8.0 中的 Unicode 实现没有意义。由于此开关不可能被任何人使用,因此它已被重新利用。此开关在 5.6.x 版本中启用的行为可能会在未来的版本中以透明、数据依赖的方式得到支持。
有关此开关的新用途,请参阅 “UTF-8 不再是 UTF-8 区域设置下的默认值” 和 perlrun 中的“-C”。
Perl 5.8.1 在内部运行 cmd.exe shell 以用于 system()、反引号以及向外部程序打开管道时使用 /d 开关。此额外开关禁用从注册表执行自动运行命令,这在运行外部程序时通常被认为是不需要的。如果您希望保留与旧行为的兼容性,请将环境中的 PERL5SHELL 设置为 cmd /x/c
。
在 Perl 5.8.0 中引入了许多 Unicode 功能。其中一个被发现弊大于利:如果用户的语言环境设置指示使用 UTF-8,则会自动(且静默)将文件句柄(包括标准文件句柄)“UTF-8 化”。
例如,如果您将 en_US.UTF-8
作为您的语言环境,则您的 STDIN 和 STDOUT 将自动成为“UTF-8”,换句话说,会隐式执行 binmode(..., ":utf8")。这意味着尝试打印,例如 chr(0xff),最终会打印字节 0xc3 0xbf。除非您了解 Perl 5.8.0 的此功能,否则这绝不是您的本意。问题在于绝大多数人并不知道:例如,在 RedHat 版本 8 和 9 中,默认语言环境设置为 UTF-8,因此所有 RedHat 用户都获得了 UTF-8 文件句柄,无论他们是否需要。Perl 5.8.0 的 Unicode 实现(仍然)存在讨厌的错误,尤其与 s/// 和 tr/// 的使用有关,这加剧了痛苦。(这些错误已在 5.8.1 中修复)
因此,决定回溯该功能,并将其从隐式静默默认值更改为显式明确选项。现在可以使用新的 Perl 命令行选项 -C
及其对应的环境变量 PERL_UNICODE 来控制 Perl 和 Unicode 如何在 I/O 等接口以及例如命令行参数中进行交互。有关更多信息,请参阅 perlrun 中的“-C” 和 perlrun 中的“PERL_UNICODE”。
在 Perl 5.8.0 中引入了所谓的“安全信号”。这意味着 Perl 不再立即处理信号,而是在“操作码之间”处理信号,这是安全的时候。早期立即处理很容易破坏 Perl 的内部状态,导致神秘的崩溃。
但是,新的更安全的模型也存在问题。因为现在一个操作码(Perl 执行的基本单元)永远不会被中断,而是让它运行到完成,某些可能需要很长时间的操作现在确实需要很长时间。例如,某些网络操作有自己的阻塞和超时机制,能够立即中断它们会很好。
因此,perl 5.8.1 引入了“后门”以恢复 5.8.0 之前的(实际上是 5.7.3 之前的)信号行为。只需将环境变量 PERL_SIGNALS 设置为 unsafe
,旧的立即(且不安全)信号处理行为就会返回。请参阅 perlrun 中的“PERL_SIGNALS” 和 perlipc 中的“延迟信号(安全信号)”。
在完全无关的新闻中,你现在可以使用 POSIX::SigAction 使用安全信号。请参阅 POSIX 中的“POSIX::SigAction”。
以前,传递给关联数组类中的 FETCH
、STORE
、EXISTS
和 DELETE
方法的索引始终是非负的。如果实际参数为负数,Perl 将隐式调用 FETCHSIZE,并将结果添加到索引,然后再将结果传递给关联数组方法。此行为现在是可选的。如果关联数组类包含一个名为 $NEGATIVE_INDICES
的包变量,并且该变量被设置为 true 值,则负值将按原样传递给 FETCH
、STORE
、EXISTS
和 DELETE
。
语法
local ${$x}
local @{$x}
local %{$x}
现在对变量进行本地化,前提是 $x 是一个有效的变量名。
Perl 5.8 中包含的 Unicode 字符数据库副本已从 3.2.0 更新到 4.0.0。这意味着例如 Unicode 字符属性与 Unicode 4.0.0 中的属性相同。
有一个新的功能弃用。Perl 5.8.0 忘记添加一些弃用警告,现在已添加这些警告。最后,提醒即将移除一项功能。
伪哈希在 Perl 5.8.0 中已弃用,将在 Perl 5.10.0 中移除,有关详细信息,请参阅 perl58delta。每次尝试访问伪哈希都会触发警告 伪哈希已弃用
。如果你真的想继续使用伪哈希,但不想看到弃用警告,请使用
no warnings 'deprecated';
或者你可以继续使用 fields pragma,但请不要再期望数据结构是伪哈希了。
5.005 样式线程(通过 use Thread;
激活)已在 Perl 5.8.0 中弃用,并且将在 Perl 5.8 之后移除,有关详细信息,请参阅 perl58delta。每个 5.005 样式线程的创建都会触发警告 5.005 threads are deprecated
。如果您确实想继续使用 5.005 线程,但不想看到弃用警告,请使用
no warnings 'deprecated';
控制多行匹配的 $*
变量已弃用,并且将在 5.8 之后移除。该变量已弃用很长时间,并且给出了弃用警告 Use of $* is deprecated
,现在该变量将最终被移除。该功能已被模式匹配中的 /s
和 /m
修饰符取代。如果您确实想继续使用 $*
变量,但不想看到弃用警告,请使用
no warnings 'deprecated';
在空上下文中,map
不再昂贵。map
现在是上下文感知的,并且在空上下文中调用时不会构造列表。
如果在打印到套接字时服务器关闭了套接字,则客户端现在会收到 SIGPIPE。虽然此新特性并非计划中的,但它是 PerlIO 更改的自然结果,并且应被视为意外特性。
PerlIO::get_layers(FH) 返回在文件句柄上活动的 PerlIO 层的名称。
PerlIO::via 层现在可以具有一个可选的 UTF8 方法,以指示该层是否希望对流“自动:utf8”。
已添加 utf8::is_utf8() 作为快速测试标量是否在 UTF-8(Unicode)中内部编码的方法。
自 Perl 5.8.0 以来,已更新以下模块和用语
比以前好多了。还远未完美,但也许值得一试。
一个可选特性 :hireswallclock
,现在允许高分辨率挂钟时间(使用 Time::HiRes)。
请参阅 B::Bytecode。
现在有 bytes::substr。
现在可以有自定义字符名称别名。
现在有一个 CPAN.pm 模块的简单命令行前端,称为cpan。
一个新选项 Pair 允许选择哈希键和值之间的分隔符。
对编码编译指示功能(tr/// 和 DATA 文件句柄、格式)进行了重大更新。
如果文件句柄已标记为具有编码,则在输入时已检测到不可映射字符,而不是在稍后(使用损坏数据时)。
ISO 8859-6 转换表已更正(0x30..0x39 错误地映射到 U+0660..U+0669,而不是 U+0030..U+0039)。GSM 03.38 转换未正确处理转义序列。已添加 UTF-7 编码(使 Encode 具有 Unicode::String 的完整功能)。
自 v1.60(Perl v5.8.0 中包含的版本)以来,已修复了许多错误。特别值得注意的是 Calc 中导致 div 和 mod 对某些大值失败的错误,以及对错误输入处理的修复。
添加了一些新功能,例如 broot() 方法,您现在可以将参数传递给 config() 以在运行时更改一些设置,现在可以捕获 NaN 和无穷大的创建。
与往常一样,进行了一些优化,总体上使数学运算速度提高了一点点。在某些情况下,实际上快了很多。特别是 Math::BigInt::GMP 等备用库受益于此。此外,许多相当笨重的例程(如 fsqrt() 和 flog())现在快了很多。
菱形继承现在有效。
现在可以从非字符串标量(如特殊变量,请参阅 perlvar)中读取。
完全重写。作为一个副作用,不再拒绝在 root 运行时启动。
新实用工具:refaddr、isvstring、looks_like_number、set_prototype。
现在可以存储代码引用(通过 B::Deparse,因此并非万无一失)。
早期版本的 strict pragma 不会检查隐式传递给其“import”(use)和“unimport”(no)例程的参数。这导致了诸如以下的错误惯用语
use strict qw(@ISA);
@ISA = qw(Foo);
然而,这(可能)引发了错误的期望,即正在强制执行 strict refs、vars 和 subs(并且 @ISA 以某种方式“声明”)。但是,在使用此错误惯用语时,不会强制执行 strict refs、vars 和 subs。
从 Perl 5.8.1 开始,上述情况将导致引发错误。这可能会导致以前在没有警告和错误的情况下看似正确执行的程序在 5.8.1 下运行时失败。这是因为
use strict qw(@ISA);
现在会因错误而失败
Unknown 'strict' tag(s) '@ISA'
解决此问题的办法是用正确的惯用语替换此代码
use strict;
use vars qw(@ISA);
@ISA = qw(Foo);
现在对测试脚本的额外或丢失输出更加挑剔。
如果可用,使用 nanosleep() 允许将亚秒睡眠与警报混合使用。
进行了多项修复,例如针对 join() 问题和内存泄漏的修复。在使用 glibc 的某些平台(如 Linux)中,一个 ithread 的最小内存占用已减少了几百千字节。
已修复许多内存泄漏。
现在返回额外信息。
h2xs
实用程序现在生成更现代的布局:Foo-Bar/lib/Foo/Bar.pm 而不是 Foo/Bar/Bar.pm。此外,样板测试现在称为 t/Foo-Bar.t 而不是 t/1.t。
Perl 调试器 (lib/perl5db.pl) 现在已得到广泛记录,并且在记录时发现的错误已得到修复。
perldoc
已从头开始重写,以使其更强大且功能更丰富。
perlcc -B
现在至少可以工作得更好一些,而 perlcc -c
则更可能损坏。(Perl 编译器套件作为一个整体仍然处于实验阶段。)
已添加 perl573delta 来列出(现在已经相当过时的)开发版本 5.7.2 和 5.7.3 之间的差异。
已添加 perl58delta:它是 5.8.0 的 perldelta,详细说明了 5.6.0 和 5.8.0 之间的差异。
已添加 perlartistic:它是 pod 格式的 Artistic License,使模块更容易引用它。
已添加 perlcheat:它是一个 Perl 速查表。
已添加 perlgpl:它是 pod 格式的 GNU 通用公共许可证,使模块更容易引用它。
已添加 perlmacosx 来讲述在 Mac OS X 中安装和使用 Perl 的信息。
已添加 perlos400 来讲述在 OS/400 PASE 中安装和使用 Perl 的信息。
已添加 perlreref:它是一个正则表达式快速参考。
如果 Unix 标准 Perl 位置 /usr/bin/perl 存在,则不再默认覆盖它。此更改非常谨慎,因为许多 Unix 供应商已经提供了 /usr/bin/perl,但同时许多系统实用程序可能依赖于 Perl 的确切版本,因此最好不要覆盖它。
现在可以为站点和供应商 man 和 HTML 页面以及站点和供应商脚本指定安装目录。请参阅INSTALL。
现在可以通过为 make install
指定 DESTDIR 变量来指定 Perl 安装的目标目录。(此功能与之前的 Configure -Dinstallprefix=...
稍有不同。)请参阅INSTALL。
gcc 版本 3.x 引入了一个新警告,在 Perl 编译期间造成了很多噪音:gcc -Ialreadyknowndirectory (warning: changing search order)
。现在,Configure 在编译之前剔除了此类目录,从而避免了此警告。
现在可以通过使用 Configure 标志 -Dnoextensions=...
和 -Donlyextensions=...
来构建 Perl 核心模块的子集,请参阅INSTALL。
在 Cygwin 中,现在可以使用线程构建 Perl(Configure -Duseithreads
)。这适用于 Cygwin 1.3.22 和 Cygwin 1.5.3。
在较新的 FreeBSD 版本中,Perl 5.8.0 编译失败,原因是尝试使用 malloc.h,而在 FreeBSD 中,malloc.h 只是一个虚拟文件,甚至尝试使用它都会导致致命错误。现在不使用 malloc.h。
现在已知 Perl 也可以在 Hitachi HI-UXMPP 中构建。
现在已知 Perl 可以再次在 LynxOS 中构建。
Mac OS X 现在使用嵌入在安装目录名称中的 Perl 版本号进行安装,以便更轻松地升级用户编译的 Perl,并且安装目录通常更加标准。换句话说,默认安装不再破坏 Apple 提供的 Perl。另一方面,使用 Configure -Dprefix=/usr
,你现在可以真正替换 Apple 提供的 Perl(请小心)。
Mac OS X 现在默认以静态方式构建 Perl。此更改主要是为了加快启动时间。Apple 提供的 Perl 仍然是动态链接和共享的,你可以通过 Configure -Duseshrplib
为你自己的 Perl 构建启用共享。
Perl 已移植到 IBM 的 OS/400 PASE 环境。构建适用于 PASE 的 Perl 的最佳方法是使用 AIX 主机作为交叉编译环境。请参阅 README.os400。
又添加了一个交叉编译选项:现在 Perl 可以构建在 OpenZaurus 上,OpenZaurus 是基于 Mandrake + Embedix 的 Linux 发行版,适用于 Sharp Zaurus PDA。请参阅 Cross/README 文件。
Tru64 在使用 gcc 3 时,由于默认的 -O3
导致内存使用量过大,因此将 toke.c 的优化降级为 -O2
。
Tru64 现在可以使用较新的 Berkeley DB 构建 Perl。
在 WinCE 上构建 Perl 已得到极大增强,请参阅 README.ce 和 README.perlce。
匿名子例程、词法变量和闭包领域已得到许多修复。虽然这意味着 Perl 现在更加“正确”,但某些依赖于错误行为的现有代码可能会中断。实际上,除非您的代码包含匿名子例程、eval 和词法变量的非常复杂的嵌套,否则不太可能发生这种情况。
如果输入文件句柄标记为 :utf8
,并且 Perl 在执行 <FH>
时发现非法的 UTF-8,如果启用了警告,则会立即发出警告 - 而不是对此保持沉默,并且 Perl 稍后会对损坏的数据感到不满意。(:encoding(utf8)
层也以相同的方式工作。)
binmode(SOCKET, ":utf8") 仅适用于输入端,不适用于套接字的输出端。现在它可以双向工作。
对于多线程 Perl,某些系统数据库函数(如 getpwent() 和 getgrent())现在会动态增加其结果缓冲区,而不是失败。这意味着在拥有大量用户和组的站点,这些函数不再会因仅返回部分结果而失败。
Perl 5.8.0 意外中断了用户定义自己的大写<->小写 Unicode 映射(如 Camel 所宣传)的功能。此功能已得到修复,并且也有更好的文档记录。
在 5.8.0 中,此
$some_unicode .= <FH>;
没有正确工作,而是破坏了数据。此问题现已得到修复。
FETCH 等关联方法现在可以安全地访问关联值,即导致对 FETCH 等的递归调用。不过,请记住要中断递归。
在启动时,Perl 会阻止 SIGFPE 信号,因为 Perl 对此无能为力。以前,此阻止也适用于从 Perl 内部执行的程序。现在,Perl 会在运行外部程序之前恢复原始的 SIGFPE 处理例程(无论它是什么)。
Perl 脚本中的行号现在可以大于 65536 或 2**16。(Perl 脚本始终可以大于此值,只是报告的错误和警告的行号已“环绕”。)虽然如此大的脚本通常表示需要重新考虑您的代码,但此类 Perl 脚本确实存在,例如作为生成代码的结果。现在,行号可以一直到 4294967296 或 2**32。
Linux
设置 $0 再次起作用(有一些限制,Perl 无法解决:请参阅 perlvar 中的“$0”)
HP-UX
设置 $0 现在起作用。
VMS
配置现在测试 poll()
的存在,并且如果检测到,IO::Poll 现在使用供应商提供的函数。
如果 Perl 映像以特权安装,或者如果进程的权限列表中设置了子系统属性的标识符,则在 Perl 启动时可能会发生罕见的访问冲突。这两种情况都会触发包含指针错误的污染代码。错误的指针算法已修复。
%ENV 哈希中值的长度限制(不是键)已从 255 字节提高到 32640 字节(除非 PERL_ENV_TABLES 设置覆盖了 %ENV 的逻辑名称的默认使用)。如果需要从 Perl 外部访问这些长值,请注意它们是使用搜索列表逻辑名称实现的,这些逻辑名称将值存储为各个部分,每个 255 字节部分(最多 128 个部分)都是搜索列表中的一个元素。在 Perl 中对 %ENV 进行查找时,这些元素将组合成一个值。通过 $ENV{'foo;N'} 语法(其中 N 是搜索列表索引)访问搜索列表逻辑名称的各个元素的现有 VMS 特定功能不受影响。
管道实现现在使用本地 DCL 符号而不是全局 DCL 符号进行进程间通信。
当导航到与逻辑名称冲突的相对目录时,File::Find 可能会变得混乱。通过向相对路径名添加目录语法来解决此问题,从而防止逻辑名称转换。
Win32
fork() 仿真中的内存泄漏已修复。
ioctl() 内置函数的返回值在 5.8.0 中意外中断。此问题已得到纠正。
Perl 在阻塞操作期间执行的内部消息循环有时会干扰 Perl 外部消息。当 Perl 在可以生成 Windows 消息的环境下执行时,这通常会导致阻塞操作过早终止或返回不正确的结果。此问题已得到纠正。
管道和套接字现在自动处于二进制模式。
当底层调用中出现错误时,select() 的四参数形式无法正确保留 $! (errno)。此问题现已解决。
“CR CR LF”问题已修复,binmode(FH, ":crlf") 现在实际上是一个空操作。
所有与 pack() 和 unpack() 相关的警告都变得更具信息性和一致性。
旧版本
A thread exited while %d other threads were still running
具有误导性,因为“其他”还包括发出警告的线程。
清除受限制的哈希并非非法,因此已移除该警告。
您必须为 sub
指定代码块。
旧版本
Invalid [] range "%s" in transliteration operator
是错误的,因为 tr/// 中没有“[] 范围”。
不言自明。
填充空格会出现在换行符之后,这可能不是您想要的。
如果您认为这
$x & $y == 0
测试了 $x 和 $y 的按位 AND 是否为零,您会喜欢这个警告。
此警告本应已在 5.8.0 中,因为它们是。
您无法从已关闭或未打开的文件句柄中读取()(或 sysread())。
此警告本应已在 5.8.0 中,因为它们是。
某些东西拔掉了活动关联变量的插头,Perl 通过退出保证安全。
指定了非法的用户定义 Unicode 大小写映射。
某些东西修改了正在迭代的值。这不好。
这些新闻对你来说只有在编写 XS 代码或喜欢了解或破解 Perl 内部(使用 Devel::Peek 或任何 B::
模块计数)或喜欢使用 -D
选项运行 Perl 时才重要。
已审查 perlembed 的嵌入示例,以使其保持最新并一致:例如,正确使用 PERL_SYS_INIT3() 和 PERL_SYS_TERM()。
Dave Mitchell 对 pad 代码(负责词法变量的代码)进行了广泛的重新设计。
John Peacock 对 v 字符串进行了大量的工作。
UTF-8 长度和位置缓存:为了加快处理 Unicode (UTF-8) 标量的速度,引入了缓存。如果扩展绕过官方 API 并直接修改 SV 的 PV,则可能会出现问题:UTF-8 缓存不会像应该的那样被清除。
Perl 5.8.0 中已弃用的 API,如 sv_2pv、sv_catpvn、sv_catsv、sv_setsv,现在又可以使用了。
某些 Perl 核心 C API(如 cxinc 和 regatom)不再可用于 Perl 核心扩展的 Perl 核心外部的代码。这是故意的。它们永远不应该使用较短的名称,并且如果你的应用程序依赖于它们,你应该(感到羞耻并)联系 perl5-porters 来讨论适当的 API 是什么。
某些 Perl 核心 C API,如 Perl_list
,现在如果没有其 Perl_
前缀就不可用了。如果你的 XS 模块停止工作,因为某些函数找不到,在许多情况下,一个简单的修复方法是向函数添加 Perl_
前缀,并将线程上下文 aTHX_
作为函数调用的第一个参数。这也是它一直应该完成的方式:让 Perl_-less 形式从核心泄漏是一个意外。为了更干净的嵌入,你还可以通过在编译时定义 cpp 定义 PERL_NO_SHORT_NAMES 来强制所有 API 使用此方法。
已添加 Perl_save_bool()。
正则表达式对象(那些用 qr
创建的对象)现在具有 S-magic 而不是 R-magic。这修复了形式为 /...(??{...;$x})/ 的正则表达式,不再忽略对 $x 所做的更改。S-magic 避免了放弃缓存优化,并且使 (??{...}) 构造变得非常慢(因此变得无用)。另请参阅 perlguts 中的 "Magic Variables"。Regexp::Copy 受此更改影响。
Perl 内部调试宏 DEBUG() 和 DEB() 已重命名为 PERL_DEBUG() 和 PERL_DEB(),以避免命名空间冲突。
-DL
已删除(泄漏测试多年来一直损坏且不受支持,请使用替代调试 malloc 或 valgrind 和 Purify 等工具)。
为 -DXv
和 -Dsv
添加了详细说明符 v
,请参阅 perlrun。
在 Perl 5.8.0 中,大约有 700 个测试文件中约有 69000 个单独的测试,在 Perl 5.8.1 中,大约有 780 个测试文件中约有 77000 个单独的测试。确切数字取决于 Perl 配置和操作系统平台。
"不兼容的更改" 中提到的哈希随机化肯定是有问题的:它将唤醒休眠的错误并消除错误的假设。
如果你想将 mod_perl 2.x 与 Perl 5.8.1 一起使用,则需要 mod_perl-1.99_10 或更高版本。早期版本的 mod_perl 2.x 不适用于随机哈希。(mod_perl 1.x 运行良好。)你还需要 Apache::Test 1.04 或更高版本。
许多在 perl 5.8.0 中运行 100% 或非常接近 100% 的较罕见平台最近由于其维护者一直很忙而被搁置,因此这些平台上会出现更多故障。此类平台包括 Mac OS Classic、IBM z/OS(和其他 EBCDIC 平台)以及 NetWare。最常见的 Perl 平台(Unix 和类似 Unix 的平台、Microsoft 平台和 VMS)具有足够大的测试和专家群体,因此它们运行良好。
已绑定的哈希目前在标量上下文中不会返回任何有用的内容,例如用作布尔测试时
if (%tied_hash) { ... }
当前无意义的行为总是返回 false,无论哈希是否为空或有元素。
根本原因是已绑定的哈希的实现者没有接口来实现标量上下文中哈希的行为。
如果您有不同寻常的网络设置,lib/Net/Ping/t/450_service.t 的子测试 9 和 18,以及 lib/Net/Ping/t/510_ping_udp.t 的子测试 2 可能会失败。例如,在后一种情况下,测试尝试向 IP 地址 127.0.0.1 发送 UDP ping。
C 生成编译器后端 B::C(前端是 perlcc -c
)比以前更加混乱,因为词法变量发生了广泛的更改。(好消息是 B::Bytecode 和 ByteLoader 比以前更好。)
IBM z/OS 和其他 EBCDIC 平台在 Unicode 支持方面仍然存在问题。许多 Unicode 测试在本来应该修复时被跳过。
在 Cygwin 1.5 中,io/tell 和 op/sysio 测试由于一些尚未知的原因而失败。在 1.5.5 中,线程测试 stress_cv、stress_re 和 stress_string 会失败,除非环境变量 PERLIO 设置为“perlio”(这也使得 io/tell 失败消失)。
Perl 5.8.1 可以很好地与 Cygwin 1.3 构建和配合使用:使用 (uname -a) CYGWIN_NT-5.0 ... 1.3.22(0.78/3/2) 2003-03-18 09:20 i686 ...
使用 Configure -des -Duseithreads
可以实现 100% 的“make test”。
对于某些 HP C 编译器版本(例如 B.11.11.02),您会收到许多这样的警告(换行以方便阅读)
cc: "/usr/include/sys/socket.h", line 504: warning 562:
Redeclaration of "sendfile" with a different storage class specifier:
"sendfile" will have internal linkage.
cc: "/usr/include/sys/socket.h", line 505: warning 562:
Redeclaration of "sendpath" with a different storage class specifier:
"sendpath" will have internal linkage.
在 Perl 构建期间和调用 C 编译器的某些 lib/ExtUtils 测试期间,都会出现警告。但是,该警告并不严重,可以忽略。
已知测试 t/uni/tr_7jis.t 在某些 IRIX 版本(至少为 IRIX 6.5 和 MIPSpro Compilers 版本 7.3.1.1m)的“make test”或测试工具下报告错误,但如果手动运行,则测试完全通过。
Perl malloc (-Dusemymalloc
) 在 Mac OS X 中根本不起作用。不过,这并不严重,因为本机 malloc 运行良好。
在最新的 Tru64 版本(例如 v5.1B 或更高版本)中,无法使用 gcc 编译带线程的 Perl (-Duseithreads),因为系统 <pthread.h>
文件不了解 gcc。
从 5.8.0 版本开始,sysopen()/sysread()/syswrite() 在“文本”模式下的行为与 5.6.1 及更早版本不同。这些内置函数现在始终以“二进制”模式运行(即使 sysopen() 传递了 O_TEXT 标志,或者在文件句柄上使用了 binmode())。请注意,此问题应该只对磁盘文件产生影响,因为套接字和管道在 Windows 端口中始终处于“二进制”模式。由于此行为目前被认为是一个错误,因此在未来版本中可能会重新引入兼容行为。在此之前,不支持使用 sysopen()、sysread() 和 syswrite() 进行“文本”模式操作。
以下情况可能发生在未来。具有这些特性的第一个公开发布版本将是 Perl 5.9.x 开发者版本,最终版本为 Perl 5.10.0。这是我们目前最好的猜测:我们保留重新考虑的权利。
PerlIO 将成为默认选项。目前(在 Perl 5.8.x 中),如果 Perl 认为可以使用某些技巧让 stdio 运行非常快,则仍会使用 stdio 库。对于未来版本,我们的目标是让 PerlIO 运行得更快。
将提供一项名为断言的新功能。这意味着可以在代码中插入称为断言的代码:通常会对它们进行优化,但可以使用 -A
选项启用它们。
将提供一个新运算符 //
(定义或)。这意味着将能够说
$a // $b
而不是
defined $a ? $a : $b
和
$c //= $d;
而不是
$c = $d unless defined $c;
该运算符将具有与 ||
相同的优先级和结合性。针对 Perl 5.8.1 源代码的源代码补丁将以 authors/id/H/HM/HMBRAND/dor-5.8.1.diff 的形式在 CPAN 中提供。
unpack()
将默认解包 $_
。
将研究各种写时复制技术,希望能够加快 Perl 的速度。
CPANPLUS、Inline 和 Module::Build 将成为核心模块。
将引入编写真正的词法作用域语法的功能。
将继续对字节编译器和字节加载器进行开发。
当前存在的 v 字符串计划被弃用。当与 use
、require
和 $VERSION
一起使用时,无 v 形式 (1.2.3) 将变为“版本对象”。$^V 也将成为“版本对象”,因此不再需要 printf("%vd",...) 构造。带 v 的版本 (v1.2.3) 将变为过时。字符串和 v 字符串的等价性(例如,当前 5.8.0 等于 "\5\8\0")将消失。v 字符串可能不会有任何弃用警告,因为很难检测到何时安全地使用 v 字符串,以及何时不安全地使用 v 字符串。
5.005 线程将被移除
$*
变量将被移除(它在很久以前就被弃用了)
伪哈希将被移除
如果您发现您认为是错误的内容,您可以查看最近发布到 comp.lang.perl.misc 新闻组和 http://bugs.perl.org/ 上的 perl 错误数据库中的文章。https://perldotcom.perl5.cn/(Perl 主页)上也可能有相关信息。
如果您认为自己遇到了未报告的错误,请运行发行版中包含的 perlbug 程序。务必将您的错误精简为一个微小但充分的测试用例。您的错误报告以及 perl -V
的输出将被发送到 [email protected],供 Perl 移植团队分析。您可以在 http://bugs.perl.org/ 浏览和搜索 Perl 5 错误
Changes 文件,详细说明了更改的内容。
INSTALL 文件,说明如何构建 Perl。
README 文件,提供一般信息。
Artistic 和 Copying 文件,提供版权信息。