内容

名称

perl5005delta - perl5.005 的新增内容

描述

本文档描述了 5.004 版本与本版本之间的差异。

关于新的版本控制系统

Perl 现在在两个轨道上开发:一个维护轨道,对已发布的生产版本进行小的、安全的更新,重点是兼容性;另一个是开发轨道,追求更积极的演进。维护版本(应视为生产质量)的次版本号从 1 运行到 49,而开发版本(应视为“alpha”质量)从 50 运行到 99

Perl 5.005 是新的双轨道开发方案的综合产物。

不兼容的更改

警告:此版本与 Perl 5.004 不兼容。

从 Perl 5.004_50 开始,对语言内部进行了许多深刻而广泛的更改。如果您有在 perl 5.003 或 5.004 下构建的动态加载扩展,您可以继续在 5.004 中使用它们,但您需要重新构建和重新安装这些扩展才能在 5.005 中使用它们。有关如何升级的详细说明,请参阅 INSTALL

默认安装结构已更改

新的 Configure 默认值旨在允许从 5.004 平滑升级到 5.005,但您应该阅读 INSTALL 以详细了解更改,以便将其适应您的系统。

Perl 源代码兼容性

当没有启用任何实验性功能时,应该很少有用户可见的 Perl 源代码兼容性问题。

如果启用了线程,则会有一些注意事项。@_$_ 成为词法变量。这对于用户来说应该是透明的,但有一些边界条件,用户需要了解这些问题。例如,local(@_) 会导致“无法本地化词法变量 @_ ...”消息。这可能在将来的版本中启用。

引入了几个新的关键字。这些关键字通常预计对兼容性影响很小。请参阅 "新的 INIT 关键字""新的 lock 关键字""新的 qr// 运算符"

某些裸词现在被保留。如果您使用 -w 开关请求了这些裸词,则使用它们会引发警告。请参阅 "our 现在是一个保留字"

C 源代码兼容性

内部进行了大量更改以支持此版本中的新功能。

二进制兼容性

此版本与旧版本 兼容。所有扩展都需要重新编译。此外,使用启用线程功能构建的二进制文件与未启用线程功能构建的二进制文件不兼容。这对于用户来说应该是透明的,因为所有二进制不兼容的配置都有其自己的唯一架构名称,并且扩展二进制文件安装在唯一的位置。这允许在同一目录层次结构中共存多个配置。请参阅 INSTALL

安全修复可能影响兼容性

修复了一些污染泄漏和污染遗漏问题。这可能会导致以前在旧版本中有效的脚本“失败”。使用 -DINCOMPLETE_TAINTS 编译可以提供一个对污染行为更改最少的 perl。但请注意,生成的 perl 将存在已知的安全漏洞。

使用 -e 开关的单行命令不再创建临时文件。

5.004 中引入的新的强制警告已放宽

在 5.004 中引入的许多新警告已变为可选。其中一些警告仍然存在,但 perl 的新功能使它们不再那么容易出现问题。请参阅 "新诊断"

许可

Perl 针对贡献者制定了新的社会契约。请参阅 Porting/Contract

Perl 大部分文档中包含的许可证已更改。以前,大部分 Perl 文档都在隐含的 GNU 通用公共许可证或 Artistic 许可证(由用户选择)下。现在,大部分文档明确说明了其分发的条款。这些条款总体上比 GNU GPL 限制性更小。请参阅 perl 以及其中列出的各个 perl 手册页。

核心更改

线程

警告:线程被认为是实验性功能。实现细节可能会在未经通知的情况下更改。存在已知的限制和一些错误。这些错误预计将在未来的版本中修复。

请参阅 README.threads

编译器

警告:编译器和相关工具被认为是实验性的。功能可能会在未经通知的情况下更改,并且存在已知的限制和错误。由于编译器完全独立于 perl,因此默认配置将构建并安装它。

编译器会对 perl 程序进行三种不同类型的转换。C 后端会生成 C 代码,该代码会捕获 perl 在执行开始之前的状态。它消除了常规 perl 解释器的编译时开销,但运行时性能保持相对相同。CC 后端会生成优化的 C 代码,等效于运行时的代码路径。CC 后端具有更大的优化潜力,但目前只实现了一些优化。字节码后端会生成解释器在执行之前的状态的平台无关字节码表示。因此,字节码后端也消除了大部分解释器的编译开销。

编译器附带了一些有价值的实用程序。

B::Lint 是一个实验性模块,用于检测和警告可疑代码,尤其是 -w 开关无法检测到的情况。

B::Deparse 可用于解析 Perl 代码,并了解 Perl 如何优化某些结构。

B::Xref 生成程序中所有变量、子例程和格式的定义和使用交叉引用报告。

B::Showlex 显示子例程或文件使用的词法变量。

perlcc 是一个简单的 Perl 编译器前端。

参见 ext/B/READMEB 和相应的编译器模块。

正则表达式

Perl 的正则表达式引擎已彻底改造,并支持许多新结构。已修复多个错误。

以下是逐项摘要

许多新的和改进的优化

RE 引擎中的更改

Unneeded nodes removed;
Substrings merged together;
New types of nodes to process (SUBEXPR)* and similar expressions
    quickly, used if the SUBEXPR has no side effects and matches
    strings of the same length;
Better optimizations by lookup for constant substrings;
Better search for constants substrings anchored by $ ;

使用 RE 引擎的 Perl 代码中的更改

More optimizations to s/longer/short/;
study() was not working;
/blah/ may be optimized to an analogue of index() if $& $` $' not seen;
Unneeded copying of matched-against string removed;
Only matched part of the string is copying if $` $' were not seen;
许多错误修复

请注意,此处仅列出了主要错误修复。有关其他修复,请参见 Changes

Backtracking might not restore start of $3.
No feedback if max count for * or + on "complex" subexpression
    was reached, similarly (but at compile time) for {3,34567}
Primitive restrictions on max count introduced to decrease a 
    possibility of a segfault;
(ZERO-LENGTH)* could segfault;
(ZERO-LENGTH)* was prohibited;
Long REs were not allowed;
/RE/g could skip matches at the same position after a 
  zero-length match;
新的正则表达式结构

支持以下新的语法元素

(?<=RE)
(?<!RE)
(?{ CODE })
(?i-x)
(?i:RE)
(?(COND)YES_RE|NO_RE)
(?>RE)
\z
用于预编译正则表达式的新的运算符

参见 "新的 qr// 运算符"

其他改进
	Better debugging output (possibly with colors),
            even from non-debugging Perl;
	RE engine code now looks like C, not like assembler;
	Behaviour of RE modifiable by `use re' directive;
	Improved documentation;
	Test suite significantly extended;
	Syntax [:^upper:] etc., reserved inside character classes;
不兼容的更改
(?i) localized inside enclosing group;
$( is not interpolated into RE any more;
/RE/g may match at the same position (with non-zero length)
    after a zero-length match (bug fix).

参见 perlreperlop

改进的 malloc()

有关详细信息,请参见 malloc.c 开头的横幅。

快速排序在内部实现

Perl 现在包含自己的高度优化的 qsort() 例程。新的 qsort() 能够抵抗不一致的比较函数,因此当给出编写不当的排序子例程时,Perl 的 sort() 将不再引发核心转储。(一些之前使用的 C 库 qsort() 曾经存在此问题。)在我们的测试中,新的 qsort() 在所有已知的 qsort() 实现中,平均需要最少的成对比较次数。

参见 perlfunc/sort

可靠的信号

Perl 的信号处理容易出现随机崩溃,因为信号是异步到达的,而 Perl 运行时在任意时间点都不是可重入的。

但是,当启用线程时,可以使用一种可靠信号的实验性实现。参见 Thread::Signal。另请参见 INSTALL,了解如何构建支持线程的 Perl。

可靠的堆栈指针

内部机制现在仅在可预测的时间重新分配 Perl 堆栈。特别是,魔法调用永远不会触发堆栈的重新分配,因为运行时的所有可重入性都是使用“堆栈的堆栈”来处理的。这应该提高内部机制和 XSUB 中缓存的堆栈指针的可靠性。

更宽松的回车符处理

Perl 以前会在脚本中遇到字面回车符时报错。现在,它们在程序文本中大多被视为空格。在字符串文字和 here 文档中,如果字面回车符与换行符配对出现,则会被忽略;如果它们单独出现,则会被解释为空格。这种行为意味着应避免在文件中使用字面回车符。通过在构建 perl 时定义预处理器符号 PERL_STRICT_CR,可以获得更旧、更兼容(但更严格)的行为。当然,所有这些与字符串中如何处理 \r 等转义符无关。

请注意,这并不能神奇地让你能够将所有文本文件保留为 DOS 格式。宽松的处理仅适用于 perl 本身解析的文件。如果你的 C 编译器不允许文件中有回车符,你可能仍然无法构建需要 C 编译器的模块。

内存泄漏

substrposvec 在左值上下文中使用时不再发生内存泄漏。许多影响嵌入多个解释器的应用程序的小型泄漏已被修复。

更好的多解释器支持

构建时选项 -DMULTIPLICITY 的许多细节已被重新设计。一些以前应该是每个解释器独有的全局变量现在已经变成了这样。小心使用,这允许解释器相互调用。参见 CPAN 上的 PerlInterp 扩展。

local() 在数组和哈希元素上的行为现在已明确定义

参见 "perlsub 中的 Temporary Values via local()"

%! 透明地绑定到 Errno 模块

参见 perlvarErrno

支持伪哈希

参见 perlref

EXPR foreach EXPR 受支持

参见 perlsyn

关键字可以全局覆盖

参见 perlsub

$^E 在 Win32 上有意义

参见 perlvar

foreach (1..1000000) 优化

foreach (1..1000000) 现在被优化为计数循环。它不再尝试分配大小为 1000000 的列表。

Foo:: 可用作隐式引用的包名

当与包同名的子程序恰好被定义时,裸词会导致不直观的行为。因此,new Foo @args 使用对 Foo() 的调用的结果,而不是将 Foo 视为字面量。在间接对象槽中编写裸词的推荐方法是 new Foo:: @args。请注意,当你这样做时,方法 new() 使用 Foo 而不是 Foo:: 作为第一个参数。

exists $Foo::{Bar::} 测试包的存在

在实际创建包之前,无法测试包的存在。现在,exists $Foo::{Bar::} 可用于测试 Foo::Bar 命名空间是否已创建。

更好的区域设置支持

参见 perllocale

对 64 位平台的实验性支持

Perl5 一直在具有 64 位长整数的系统上支持 64 位。从 5.005 开始,添加了对具有 32 位长整数和 64 位 'long long' 整数的系统的实验性支持。如果你在 config.sh 中的 ccflags 中添加 -DUSE_LONG_LONG(或在 perl.h 中手动定义它),那么 perl 将使用 'long long' 支持构建。会有很多编译器警告,并且生成的 perl 可能无法在所有系统上运行。还有许多与第三方扩展和库相关的其他问题。此选项的存在是为了让人们能够解决这些问题。

prototype() 在内置函数上返回有用的结果

参见 "perlfunc 中的 prototype"

扩展异常处理支持

die() 现在接受引用值,并且 $@ 在异常陷阱中被设置为该值。这使得传播异常对象成为可能。这是一个未记录的实验性功能。

在 DESTROY() 中重新祝福以支持链接 DESTROY() 方法

参见 "perlobj 中的 Destructors"

所有 printf 格式转换都在内部处理

参见 "perlfunc 中的 printf"

新的 INIT 关键字

INIT 子例程类似于 BEGINEND,但它们在 Perl 运行时开始执行之前运行。例如,Perl 编译器利用 INIT 块来初始化和解析指向 XSUB 的指针。

新的 lock 关键字

lock 关键字是线程化 Perl 中的基本同步原语。当线程未启用时,它目前是无操作的。

为了最大程度地减少对源代码兼容性的影响,此关键字是“弱”的,即,任何具有相同名称的用户定义子例程都会覆盖它,除非已看到 use Thread

新的 qr// 运算符

qr// 运算符在语法上类似于其他类似引号的运算符,用于创建预编译的正则表达式。此编译形式现在可以显式地传递给变量,并在其他正则表达式中插值。参见 perlop

our 现在是保留字

使用 -w 开关时,调用名为 our 的子例程现在会引发警告。

绑定数组现在完全支持

参见 Tie::Array

绑定句柄支持更好

添加了一些缺少的钩子。还为 TIEARRAY 实现提供了一个新的基类。参见 Tie::Array

substr 的第 4 个参数

substr() 现在可以在一次操作中同时返回和替换。可选的第 4 个参数是替换字符串。参见 "perlfunc 中的 substr"

splice 的负 LENGTH 参数

当 LENGTH 参数为负数时,splice() 的行为类似于 substr() 中 LENGTH 的行为。之前,负数 LENGTH 被视为 0。参见 "perlfunc 中的 splice"

魔法左值现在更加神奇

当你使用类似 substr($x, 5) = "hi" 的语句时,substr() 返回的标量是特殊的,因为对其的任何修改都会影响 $x。(这被称为“魔法左值”,因为“左值”是指赋值左侧的东西。)通常,这正是你期望发生的事情,但 Perl 在你使用 substr()、pos() 或 vec() 在可能被修改的上下文中时,也会使用相同的魔法,例如使用 \ 获取引用,或者作为修改 @_ 的子程序的参数。在之前的版本中,这种“魔法”只单向生效,但现在对魔法引用的标量(上面示例中的 $x)的更改也会影响魔法左值。例如,这段代码现在有不同的行为

    $x = "hello";
    sub printit {
	$x = "g'bye";
	print $_[0], "\n";
    }
    printit(substr($x, 0, 5));

在之前的版本中,这将打印“hello”,但现在它打印“g'bye”。

<> 现在读取记录

如果 $/ 是对整数的引用,或包含整数的标量,<> 将读取记录而不是行。更多信息,参见 "perlvar 中的 $/"

支持的平台

Configure 进行了许多增量改进。现在可以通过 Policy.sh 来持久化构建 perl 的站点范围策略。Configure 还会在 config.sh 中记录使用的命令行参数。

新平台

现在支持 BeOS。参见 README.beos

现在在 DJGPP 工具下支持 DOS。参见 README.dos(在某些系统上安装为 perldos)。

现在支持 MiNT。参见 README.mint

现在支持 MPE/iX。参见 README.mpeix。

现在支持 MVS(又名 OS390,又名 Open Edition)。参见 README.os390(在某些系统上安装为 perlos390)。

现在支持 Stratus VOS。请参见 README.vos

现有支持的更改

Win32 支持已得到大幅增强。支持 Perl Object,它是 Perl 的 C++ 封装。GCC 和 EGCS 现在在 Win32 上受支持。请参见 README.win32,也称为 perlwin32

VMS 配置系统已重写。请参见 README.vms(在某些系统上安装为 README_vms)。

大多数 Unix 平台的提示文件都进行了增量改进。

模块和语义

新模块

B

Perl 编译器和工具。请参见 B

Data::Dumper

一个用于漂亮打印 Perl 数据的模块。请参见 Data::Dumper

Dumpvalue

一个用于将 perl 值转储到屏幕的模块。请参见 Dumpvalue

Errno

一个用于更方便地查找错误的模块。请参见 Errno

File::Spec

一个用于文件操作的可移植 API。

ExtUtils::Installed

查询和管理已安装的模块。

ExtUtils::Packlist

操作 .packlist 文件。

Fatal

使函数/内置函数成功或失败。

IPC::SysV

Perl 中 System V IPC 操作的常量和其他支持基础结构。

Test

一个用于编写测试套件的框架。

Tie::Array

绑定数组的基类。

Tie::Handle

绑定句柄的基类。

Thread

Perl 线程创建、操作和支持。

attrs

设置子程序属性。

fields

编译时类字段。

re

各种语义用于控制正则表达式的行为。

现有模块的更改

Benchmark

您现在可以运行测试 x 秒,而不是猜测要运行的测试数量。

保持更好的时间。

Carp

Carp 有一个新函数 cluck()。cluck() 警告,就像 carp() 一样,但也会在错误消息中添加堆栈回溯,就像 confess() 一样。

CGI

CGI 已更新至 2.42 版本。

Fcntl

添加了更多 Fcntl 常量:F_SETLK64、F_SETLKW64、O_LARGEFILE 用于访问大型(超过 4G)文件(尽管 64 位支持尚不可用,因此无需过度兴奋),Free/Net/OpenBSD 锁定行为标志 F_FLOCK、F_POSIX、Linux F_SHLCK 和 O_ACCMODE:O_RDONLY、O_WRONLY 和 O_RDWR 的掩码。

Math::Complex

访问器方法 Re、Im、arg、abs、rho、theta、方法现在也可以用作修改器($z->Re(3))。

Math::Trig

添加了一些径向三角学(圆柱形和球形),例如大圆距离。

POSIX

POSIX 现在有自己的平台特定提示文件。

DB_File

DB_File 支持 Berkeley DB 的 2.x 版本。请参阅 ext/DB_File/Changes

MakeMaker

MakeMaker 现在支持编写空 Makefile,提供了一种指定应遵守站点 umask() 策略的方法。它还更好地支持 .packlist 文件的操作以及获取有关已安装模块的信息。

同时具有体系结构相关文件和体系结构无关文件的扩展现在始终完全安装在体系结构相关的目录中。以前,可共享部分在体系结构之间和 perl 版本之间共享,因此可能被具有细微不兼容性的更新版本覆盖。

CPAN

请参阅 perlmodinstallCPAN

Cwd

Cwd::cwd 在大多数平台上更快。

实用程序更改

h2ph 及其相关实用程序已彻底改造。

perlcc 是一个新的实验性编译器前端,现已可用。

粗略的 GNU configure 模拟器现在称为 configure.gnu,以避免在不区分大小写的文件系统下与 Configure 冲突。

perldoc 以前速度很慢。现在,较慢的功能是可选的。特别是,不区分大小写的搜索需要 -i 开关,递归搜索需要 -r。您可以在 PERLDOC 环境变量中设置这些开关以获得旧的行为。

文档更改

Config.pm 现在有一个变量词汇表。

Porting/patching.pod 提供了有关如何创建和提交 perl 补丁的详细说明。

perlport 指定了有关如何编写可移植代码的指南。

perlmodinstall 描述了如何从 CPAN 网站获取和安装模块。

现在记录了一些 Perl 陷阱。请参阅 perltrap

perlopentut 提供了使用 open() 的教程。

perlreftut 提供了关于引用的教程。

perlthrtut 提供了关于线程的教程。

新诊断

模棱两可的调用解析为 CORE::%s(),请进行限定或使用 &

(W) 您声明的子程序与 Perl 关键字同名,并且您在调用其中一个时没有使用限定符。Perl 决定调用内置函数,因为子程序没有被导入。

要强制解释为子程序调用,请在子程序名称之前添加一个 & 符号,或使用其包限定名称。或者,您可以导入子程序(或使用 use subs 编译指示假装它被导入)。

要将其静默地解释为 Perl 运算符,请在运算符上使用 CORE:: 前缀(例如 CORE::log($x))或将子程序声明为对象方法(请参阅 "attrs")。

将数组强制转换为哈希时索引错误

(F) 在伪哈希的第 0 个元素中找到的哈希中查找的索引不合法。索引值必须为 1 或更大。请参阅 perlref

裸词 "%s" 指向不存在的包

(W) 您使用了 Foo:: 形式的限定裸词,但编译器在此之前没有看到该命名空间的其他使用。也许您需要预先声明一个包?

无法在未定义的值上调用方法 "%s"

(F) 您使用了方法调用的语法,但由对象引用或包名填充的槽包含一个未定义的值。类似这样的代码会重现错误

$BADREF = 42;
process $BADREF 1,2,3;
$BADREF->process(1,2,3);
无法检查脚本 "%s" 的文件系统以查找 nosuid

(P) 出于某种原因,您无法检查脚本的文件系统以查找 nosuid。

无法将数组强制转换为哈希

(F) 您在需要哈希的地方使用了数组,但该数组没有关于如何从键映射到数组索引的信息。您只能对在索引 0 处具有哈希引用的数组执行此操作。

无法从 eval 字符串跳转到子例程

(F) "goto 子例程" 调用不能用于跳出 eval "字符串"。(您可以使用它跳出 eval {BLOCK},但您可能不想这样做。)

无法本地化伪哈希元素

(F) 您使用了类似 local $ar->{'key'} 的语句,其中 $ar 是对伪哈希的引用。这尚未实现,但您可以通过直接本地化相应的数组元素来获得类似的效果:local $ar->[$ar->[0]{'key'}]

无法使用 %%! 因为 Errno.pm 不可用

(F) 第一次使用 %! 哈希时,perl 会自动加载 Errno.pm 模块。Errno 模块应该绑定 %! 哈希以提供 $! errno 值的符号名称。

找不到 "%s" 的操作码

(F) 将形式为 CORE::word 的字符串传递给 prototype(),但没有名为 word 的内置函数。

字符类语法 [. .] 为将来扩展保留

(W) 在正则表达式字符类 ([]) 中,以 "[." 开头并以 ".]" 结尾的语法为将来扩展保留。如果您需要在正则表达式字符类中表示这些字符序列,只需用反斜杠引用方括号:"\[." 和 ".\]"。

字符类语法 [: :] 为将来扩展保留

(W) 在正则表达式字符类 ([]) 中,以 "[:" 开头并以 ":]" 结尾的语法为将来扩展保留。如果您需要在正则表达式字符类中表示这些字符序列,只需用反斜杠引用方括号:"\[:" 和 ":\]"。

字符类语法 [= =] 为将来扩展保留

(W) 在正则表达式字符类 ([]) 中,以 "[=" 开头并以 "=]" 结尾的语法为将来扩展保留。如果您需要在正则表达式字符类中表示这些字符序列,只需用反斜杠引用方括号:"\[=" 和 "=\]"。

%s:不安全的正则表达式中的 eval 组

(F) Perl 在尝试编译包含 (?{ ... }) 零宽度断言的正则表达式时检测到污染数据,这是不安全的。请参阅 "(?{ code })" in perlreperlsec

%s:不允许使用 eval 组,请使用 re 'eval'

(F) 正则表达式包含 (?{ ... }) 零宽度断言,但该结构仅在 use re 'eval' 编译指示生效时才允许。请参阅 "(?{ code })" in perlre

%s: 运行时不允许使用 Eval-group

(F) Perl 尝试在运行时编译包含 (?{ ... }) 零宽度断言的正则表达式,就像在模式包含插值值时一样。由于这存在安全风险,因此不允许。如果您坚持,您仍然可以通过在运行时从插值字符串显式构建模式并在 eval() 中使用它来做到这一点。请参阅 "(?{ code })" in perlre.

显式祝福到 ''(假设包 main)

(W) 您正在祝福对零长度字符串的引用。这将使引用祝福到包 main 中。这通常不是您想要的。考虑提供一个默认目标包,例如 bless($ref, $p || 'MyPackage');

忽略非法十六进制数字

(W) 您可能尝试在十六进制数中使用除 0-9 或 A-F 之外的字符。十六进制数的解释在遇到非法字符之前停止。

没有这样的数组字段

(F) 您尝试将数组作为哈希访问,但使用的字段名称未定义。索引 0 处的哈希应该将所有有效字段名称映射到数组索引才能使其工作。

变量 %s 的类型 %s 中没有这样的字段 "%s"

(F) 您尝试访问类型化变量的字段,但该类型不知道字段名称。字段名称在编译时在类型包中的 %FIELDS 哈希中查找。%FIELDS 哈希通常使用 'fields' 编译指令设置。

在极大的请求期间内存不足

(F) 您无法分配超过 2^31+"少量" 字节。此错误最有可能由 Perl 程序中的拼写错误引起。例如,$arr[time] 而不是 $arr[$time]

范围迭代器超出整数范围

(F) 范围运算符 ".." 的一个(或两个)数字参数超出了内部可以表示的整数范围。一种可能的解决方法是在您的数字前面加上 "0" 来强制 Perl 使用神奇的字符串增量。

在查找方法 '%s' %s 时检测到递归继承

(F) 在调用方法时遇到了超过 100 层继承。这可能表明您的继承层次结构中存在意外循环。

在预期偶数大小列表的地方找到了引用

(W) 您提供了一个单一引用,而 Perl 期望一个包含偶数个元素的列表(用于分配给哈希)。这通常意味着您在使用匿名哈希构造函数时,本应使用括号。无论如何,哈希需要键值 **对**。

%hash = { one => 1, two => 2, };   # WRONG
%hash = [ qw/ an anon array / ];   # WRONG
%hash = ( one => 1, two => 2, );   # right
%hash = qw( one 1 two 2 );                 # also fine
将未定义的值分配给类型全局变量

(W) 将未定义的值分配给类型全局变量,例如 *foo = undef。这没有任何作用。您可能真正想要的是 undef *foo

使用保留字 "%s" 已过时

(D) 指示的裸字是保留字。Perl 的未来版本可能会将其用作关键字,因此您最好在使用上下文中以适合的方式显式引用该字,或者使用完全不同的名称。可以通过添加 & 前缀或使用包限定符(例如 &our()Foo::our())来抑制子程序名称的警告。

perl: 警告:设置区域设置失败。

(S) 整个警告消息将类似于

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LC_ALL = "En_US",
        LANG = (unset)
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").

失败的区域设置究竟是什么会有所不同。在上面的例子中,设置是 LC_ALL 为 "En_US" 且 LANG 没有值。此错误意味着 Perl 检测到您或您的系统管理员已设置了所谓的变量系统,但 Perl 无法使用这些设置。幸运的是,这不是什么大问题:Perl 可以使用名为 "C" 的“默认区域设置”,脚本将运行。但是,在您真正解决问题之前,每次运行 Perl 时都会收到相同的错误消息。有关如何真正解决问题的详细信息,请参阅 "perllocale 中的区域设置问题"

过时的诊断

无法执行 mktemp()

(F) 在尝试处理 -e 开关时,mktemp() 例程由于某种原因失败。可能是您的 /tmp 分区已满或已损坏。

已移除,因为-e不再使用临时文件。

无法为-e写入临时文件:%s

(F) 在尝试处理-e开关时,写入例程由于某种原因失败。可能是您的/tmp分区已满或损坏。

已移除,因为-e不再使用临时文件。

无法打开临时文件

(F) 在尝试处理-e开关时,创建例程由于某种原因失败。可能是您的/tmp分区已满或损坏。

已移除,因为-e不再使用临时文件。

正则表达式太大

(F) 当前的正则表达式实现使用短整型作为字符串内的地址偏移量。不幸的是,这意味着如果正则表达式编译后的长度超过 32767,它就会爆炸。通常,当您需要这么大的正则表达式时,可以使用多个语句来实现,这是一种更好的方法。请参阅perlre

配置更改

您可以使用“Configure -Uinstallusrbinperl”,这会导致 installperl 跳过将 perl 安装为 /usr/bin/perl。如果您出于某种原因不想修改 /usr/bin,这很有用,但有害,因为许多脚本假设在 /usr/bin/perl 中找到 Perl。

BUGS

如果您发现您认为是错误,您可能需要检查 comp.lang.perl.misc 新闻组中最近发布的文章的标题。您也可以在 https://perldotcom.perl5.cn/perl/,Perl 主页上找到信息。

如果您认为您遇到了未报告的错误,请运行随您的发行版提供的perlbug程序。确保将您的错误缩减为一个微小但足够的测试用例。您的错误报告以及perl -V的输出将被发送到<[email protected]>,由 Perl 移植团队进行分析。

另请参阅

Changes文件,其中包含有关更改的详尽信息。

INSTALL文件,其中包含有关如何构建 Perl 的信息。

README文件,其中包含一般信息。

有关版权信息的 ArtisticCopying 文件。

历史

由 Gurusamy Sarathy <[email protected]> 编写,并获得了 Perl 维护者的大量贡献。

请将遗漏或更正发送至 <[email protected]>。