perldiag - 各种 Perl 诊断
这些消息按以下分类(按绝望程度递增)
(W) A warning (optional).
(D) A deprecation (enabled by default).
(S) A severe warning (enabled by default).
(F) A fatal error (trappable).
(P) An internal error you should never see (trappable).
(X) A very fatal error (nontrappable).
(A) An alien error message (not generated by Perl).
上面前三种分类(W、D 和 S)中的大多数消息可以使用 warnings
编译指示进行控制。
如果消息可以通过 warnings
编译指示控制,则其警告类别将包含在下面描述中的分类字母中。例如,(W closed)
表示 closed
类别的警告。
可选警告通过使用 warnings
编译指示或 -w 和 -W 开关来启用。警告可以通过将 $SIG{__WARN__}
设置为对将在每个警告时调用的例程的引用来捕获,而不是打印它。参见 perlvar。
严重警告始终启用,除非它们使用 warnings
编译指示或 -X 开关显式禁用。
可捕获错误可以使用 eval 运算符捕获。参见 "eval" in perlfunc。在几乎所有情况下,警告都可以使用 warnings
编译指示选择性地禁用或提升为致命错误。参见 warnings。
这些消息按字母顺序排列,不区分大小写。其中一些消息是通用的。变化的部分用 %s 或其他 printf 风格的转义符表示。这些转义符在字母顺序中被忽略,就像所有非字母字符一样。要查找您的消息,只需忽略任何非字母字符即可。
(W closed) 您尝试在已关闭的套接字上执行 accept 操作。您是否忘记检查 socket() 调用的返回值?参见 "accept" in perlfunc。
(S experimental::class) 如果您使用 `use feature 'class'` 的 `ADJUST` 关键字,则会发出此警告。此关键字目前处于实验阶段,其行为可能会在未来版本的 Perl 中发生变化。
(S experimental::refaliasing) 如果您在赋值的左侧使用引用构造函数将一个变量别名到另一个变量,则会发出此警告。如果您想使用此功能,只需抑制警告,但请注意,这样做会冒使用实验性功能的风险,该功能可能会在未来的 Perl 版本中发生变化或被删除。
no warnings "experimental::refaliasing";
use feature "refaliasing";
\$x = \$y;
(F) 修饰符 '!', '<' 和 '>' 仅在某些类型之后在 pack() 或 unpack() 中允许。请参阅 "pack" in perlfunc。
(W numeric) alpha 版本无法在不丢失信息的情况下转换为数字。
(W ambiguous) 您声明的子例程与 Perl 关键字同名,并且您在没有限定的情况下使用该名称来调用其中一个。Perl 决定调用内置函数,因为子例程未导入。
要强制解释为子例程调用,请在子例程名称之前添加一个 ampersand,或使用其包限定名称。或者,您可以导入子例程(或假装它使用 `use subs` pragma 导入)。
要将其静默解释为 Perl 运算符,请在运算符上使用 `CORE::` 前缀(例如 `CORE::log($x)`)或将子例程声明为对象方法(请参阅 "Subroutine Attributes" in perlsub 或 attributes)。
(F) 您写了类似 `tr/a-z-0//` 的东西,这毫无意义。要在转录中包含 `-` 字符,请将其放在首位或末尾。(过去,`tr/a-z-0//` 与 `tr/a-y//` 同义,这可能不是您预期的。)
(S ambiguous) 您说了一些可能无法按您预期的方式解释的内容。通常,通过提供缺少的引号、运算符、括号对或声明来消除歧义非常容易。
(S ambiguous) 您写了类似 -foo
的内容,这可能是字符串 "-foo"
,也可能是对函数 foo
的调用并取反。如果您指的是字符串,请直接写 "-foo"
。如果您指的是函数调用,请写 -foo()
。
(S ambiguous) %
、&
和 *
既是中缀运算符(模运算、按位与运算和乘法),也是初始特殊字符(表示哈希、子程序和类型全局变量),而您写了类似 *foo * foo
的内容,这可能被解释为其中任何一种。我们假设您指的是中缀运算符,但请尽量使它更清晰——在给出的示例中,如果您确实想将一个全局变量乘以函数调用的结果,可以写 *foo * foo()
。
(W ambiguous) 您写了类似 @{foo}
的内容,这可能是指变量 @foo
,也可能是调用名为 foo 的函数,并将其作为数组引用进行解引用。如果您想要的是变量,可以直接写 @foo
。如果您想要调用函数,请写 @{foo()}
... 或者您可以避免使用相同名称的变量和函数,从而避免很多麻烦。
(W ambiguous) 您写了类似 ${foo[2]}
的内容(其中 foo 代表 Perl 关键字的名称),这可能是指查找名为 @foo
的数组的第 2 个元素,在这种情况下请写 $foo[2]
,或者您可能是想将一个匿名数组引用传递给名为 foo 的函数,然后对它返回的值进行标量解引用。如果您指的是后者,请写 ${foo([2])}
。
在正则表达式中,${foo[2]}
语法有时是必要的,以区分数组下标和字符类。例如,/$length[2345]/
将被解释为 $length
后跟字符类 [2345]
。如果需要数组下标,可以通过将 /${length[2345]}/
更改为难看的 /${\$length[2345]}/
、将数组重命名为不与内置关键字冲突的名称,或者简单地使用 no warnings 'ambiguous';
关闭警告来避免警告。
(F) VMS 特有的错误。Perl 执行自己的命令行重定向,发现 STDIN 是一个管道,并且您还尝试使用 '<' 重定向 STDIN。一个客户只能有一个 STDIN 流。
(F) VMS 特有的错误。Perl 执行自己的命令行重定向,认为您尝试将 stdout 重定向到文件和管道到另一个命令。您需要选择其中一个,但没有任何东西阻止您将管道连接到一个程序或 Perl 脚本,该程序或 Perl 脚本将输出拆分为两个流,例如
open(OUT,">$ARGV[0]") or die "Can't write to $ARGV[0]: $!";
while (<STDIN>) {
print;
print OUT;
}
close OUT;
(W misc) 模式匹配 (//
)、替换 (s///
) 和转录 (tr///
) 运算符作用于标量值。如果将它们应用于数组或哈希,它将把数组或哈希转换为标量值(数组的长度或哈希的总体信息),然后对该标量值进行操作。这可能不是您的本意。有关替代方案,请参见 "perlfunc 中的 grep" 和 "perlfunc 中的 map"。
(F) msgsnd() 需要一个至少与 sizeof(long) 一样长的字符串。
(W numeric) 指示的字符串被用作操作符的参数,而该操作符需要数值类型。如果幸运的话,消息会指出哪个操作符遇到了这个问题。
请注意,对于 Inf
和 NaN
(无穷大和非数字),"数值"的定义有点特殊:字符串本身(如 "Inf")被视为数值,而它们后面的任何内容都被视为非数值。
(W layer) 在将带有参数的层推入 Perl I/O 系统时,您忘记了关闭参数列表的“)”。(层负责在外部和内部表示之间转换数据。)Perl 在此停止解析层列表,并且没有尝试推送此层。如果您的程序没有明确请求失败的操作,则可能是环境变量 PERLIO 的值导致的。
(W numeric) 指示的字符串被用作 ++
操作符的参数,而该操作符需要数字或匹配 /^[a-zA-Z]*[0-9]*\z/
的字符串。有关详细信息,请参阅 "perlop 中的自动递增和自动递减"。
(W syntax) 您在数组上调用了 stat(),但该数组将被强制转换为标量 - 数组中的元素数量。
(F) 每个子程序签名参数声明必须以有效的符号开头;例如
sub foo ($a, $, $b = 1, @c) {}
(F) 只有标量子程序签名参数可以有默认值;例如
sub foo ($a = 1) {} # legal
sub foo (@a = (1)) {} # invalid
sub foo (%a = (a => b)) {} # invalid
(X) Perl 附带的 malloc 包出现内部错误。
(X) 通用断言失败。必须检查相关文件。
(F) 您尝试将非引用值分配给左值引用(例如,\$x = $y
)。如果您想将 $x 设为 $y 的别名,请使用 \$x = \$y
。
(F) 您尝试将引用分配给引用构造函数,但这两个引用类型不同。您不能将标量与数组或数组与哈希设为别名;两种类型必须匹配。
\$x = \@y; # error
\@x = \%y; # error
$y = [];
\$x = $y; # error; did you mean \$y?
(F) 当禁用 "array_base" 功能时(例如,在 use v5.16;
下,以及从 Perl 5.30 开始),已弃用的特殊变量 $[
现在是一个固定为零的值。
(F) 如果您将值分配给条件运算符,则第 2 个和第 3 个参数必须都是标量,或者都是列表。否则,Perl 将无法知道要为右侧提供哪种上下文。
(W regexp) 您有类似以下内容
[[:alnum]]
[[:digit:xyz]
它们看起来像是应该用作 POSIX 类 [:alnum:]
或 [:digit:]
。如果是这样,它们应该写成
[[:alnum:]]
[[:digit:]xyz]
由于这些不是合法的 POSIX 类规范,但却是合法的带括号的字符类,因此 Perl 将它们视为后者。在第一个示例中,它匹配字符 ":"
、"["
、"a"
、"l"
、"m"
、"n"
和 "u"
。
如果这些不是 POSIX 类,则此警告消息是错误的,可以通过重新排序内容来抑制,例如
[[al:num]]
或者
[[:munla]]
(F) 您写了 require <file>
,而应该写 require 'file'
。
(F) 失败的代码试图获取或设置一个不在受限哈希当前允许键集中的键。
(F) 你在以某种方式导致当前包被释放后,用一个参数写了 bless $foo
。Perl 无法弄清楚该怎么做,所以它束手无策。
(F) 你试图用一个新的 class
类型的包名调用 bless
。这是不必要的,因为由构造函数创建的实例已经位于正确的类中。实例不能通过其他方式创建,例如 bless
。
(F) bless()
运算符的 CLASSNAME 参数应该是一个包名,用于将结果对象祝福到该包中。你提供了一个引用,可能是你写了
bless $self, $proto;
而你本意是
bless $self, ref($proto) || $proto;
如果你真的想将祝福到提供的引用的字符串化版本中,你需要自己进行字符串化,例如通过
bless $self, "$proto";
(S 调试) 当一个数组被释放时,它被分配了。释放的值不应该对 Perl 代码可见。如果 XS 代码从数组上的自定义魔法回调中调用 av_clear
,也会发生这种情况。
(F) 失败的代码试图从受限哈希中删除一个不在其键集中的键。
(F) 失败的代码试图从受限哈希中删除一个其值已被声明为只读的键。
(S 内部) 所有 SV 对象都应该从竞技场分配,这些竞技场将在退出时被垃圾回收。发现一个 SV 位于所有这些竞技场之外。
(S 内部) Perl 维护一个引用计数的内部字符串表,以优化哈希键和其他字符串的存储和访问。这表明有人试图减少一个在表中找不到的字符串的引用计数。
(S 调试) 应该由 free_tmps() 例程释放临时值。这表明其他东西在 free_tmps() 例程有机会之前释放了 SV,这意味着 free_tmps() 例程在尝试释放它时将释放一个未引用的标量。
(S 内部) 符号别名的引用计数被搞乱了。
(S 内部) Perl 试图减少标量的引用计数以查看它是否会变为 0,并发现它之前已经变为 0,应该被释放,实际上可能已经被释放了。这可能表明 SvREFCNT_dec() 被调用了太多次,或者 SvREFCNT_inc() 被调用了太少次,或者 SV 在不应该的时候被临时化了,或者内存被破坏了。
(W pack) 您尝试将一个临时值(例如函数的结果或计算出的表达式)传递给 "p" pack() 模板。这意味着结果包含一个指向可能随时变得无效的位置的指针,甚至在当前语句结束之前。使用字面量或全局值作为 "p" pack() 模板的参数以避免此警告。
(F) 您尝试使用 use
或 require
加载一个文件,该文件之前已经编译失败。除非您从 %INC 中删除其条目,否则 Perl 不会尝试再次编译此文件。参见 "perlfunc 中的 require" 和 "perlvar 中的 %INC"。
(W misc) 您尝试设置一个已释放数组的长度。您可以通过存储指向表示数组最后一个索引的标量的引用,然后通过该引用进行赋值来实现。例如
$r = do {my @a; \$#a};
$$r = 503
(W substr) 您将引用作为第一个参数提供给用作左值的 substr(),这很奇怪。也许您忘记了先取消引用它。参见 "perlfunc 中的 substr"。
(W misc) 例如,一个子程序被声明为 sub foo : prototype(A) : prototype(B) {}。由于每个子程序只能有一个原型,因此较早的声明将被丢弃,而最后一个声明将被应用。
(S debugging) 这表明某些地方出了问题,Perl 对 @_
或 @DB::args
被绑定感到非常困惑。
(F) 您向 msgctl()、semctl() 或 shmctl() 之一传递了错误大小的缓冲区。用 C 语言来说,正确的大小分别是 sizeof(struct msqid_ds *)、sizeof(struct semid_ds *) 和 sizeof(struct shmid_ds *)。
(F) 您使用了 /e
开关来评估替换的替换,但 Perl 在要评估的代码中发现了一个语法错误,最有可能是一个意外的右大括号 '}'.
(F) 一个符号被传递给需要文件句柄的东西,但该符号没有与之关联的文件句柄。也许您没有执行 open(),或者是在另一个包中执行的。
(S malloc) 一个内部例程在从未被 malloc() 的东西上调用了 free()。这是强制性的,但可以通过将环境变量 PERL_BADFREE
设置为 0 来禁用。
在具有“硬”动态链接的系统(如 AIX
和 OS/2
)上,经常会看到此消息。这是 Berkeley DB
的一个错误,如果 DB
使用宽容的系统 malloc(),则该错误不会被注意到。
(F) 使用 PL_infix_plugin
机制解析中缀关键字的插件消耗了命名标识符运算符名称的一部分,但没有消耗全部。这是不允许的,因为它会导致脆弱的解析结果。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(F) 您开始使用包前缀命名一个符号,但没有完成符号。特别是,您不能在引号之外进行插值,因此
$var = 'myvar';
$sym = mypack::$var;
与
$var = 'myvar';
$sym = "mypack::$var";
(F) 使用关键字插件机制的扩展违反了插件 API。
(S malloc) 内部例程在从未使用 malloc() 分配的内存上调用了 realloc()。这是强制性的,但可以通过将环境变量 PERL_BADFREE
设置为 1 来禁用。
(P) 内部请求要求将指定类型的条目添加到非符号表条目中。
(P) 内部请求要求将标量条目添加到非符号表条目中。
(W bareword) 编译器在预期条件语句的地方发现了裸词,这通常表明 || 或 && 被解析为前一个结构的最后一个参数的一部分,例如
open FOO || die;
这也可能表明拼写错误的常量被解释为裸词
use constant TYPO => 1;
if (TYOP) { print "foo" }
strict
编译指示在避免此类错误方面很有用。
(F) require 的裸词形式被调用,其文件名无法由解析器允许的有效裸词生成。您不应该从 Perl 代码中获得此错误,但如果 XS 代码将无效模块名称传递给 Perl_load_module
,则可能会抛出此错误。
(F) 在 require Bare::Word
中,裸字不能以双冒号开头。请将 require ::Foo::Bar
写成 require Foo::Bar
。
(F) 在使用 "strict subs" 时,裸字只能用作子程序标识符,在花括号中或 "=>" 符号左侧。您可能需要预先声明一个子程序?
(W bareword) 您使用了 Foo::
形式的限定裸字,但在该点之前编译器没有看到该命名空间的其他使用。您可能需要预先声明一个包?
(F) 您尝试在禁用 bareword_filehandles
功能的情况下使用裸字文件句柄。
在禁用 bareword_filehandles
功能的情况下,只能使用内置句柄 STDIN
、STDOUT
、STDERR
、ARGV
、ARGVOUT
和 DATA
。
(F) 在执行 BEGIN 子程序时引发了一个未捕获的异常。编译立即停止,解释器退出。
(F) Perl 在已经发生一个或多个编译错误后,发现了一个 BEGIN {}
子程序(或一个 use
指令,它隐含了一个 BEGIN {}
)。由于无法保证 BEGIN {}
的预期环境(由于错误),并且由于后续代码可能依赖于其正确操作,Perl 只是放弃了。
(W syntax) 在模式之外,反向引用作为变量存在。在替换的右侧使用反斜杠是允许的,但从风格上来说,最好使用变量形式,因为其他 Perl 程序员会期望这样做,而且如果有多于 9 个反向引用,它会更好地工作。
(W portable) 您指定的二进制数大于 2**32-1 (4294967295),因此在系统之间不可移植。有关可移植性问题的更多信息,请参阅 perlport。
(W closed) 您尝试在已关闭的套接字上进行绑定。您是否忘记检查 socket() 调用的返回值?请参阅 "bind" in perlfunc。
(W unopened) 您尝试在从未打开的文件句柄上使用 binmode()。请检查您的控制流和参数数量。
(W portable) 使用大于 32 的位向量大小是不便携的。
(P) Perl 检测到尝试复制不可复制的内部值。
(P) 在启动新线程或从线程返回值时,Perl 遇到了无效的数据类型。
(W regexp) (仅在 use re 'strict'
或 (?[...])
内)
在正则表达式模式的方括号字符类中,您有一个范围,其中只有一个端点使用 \N{}
指定,而另一个端点使用不可移植的机制指定。Perl 将该范围视为 Unicode 范围,即其中的所有字符都被视为 Unicode 字符,并且在 Perl 运行的一些平台上可能具有不同的代码点。例如,[\N{U+06}-\x08]
被视为您实际上说的是 [\N{U+06}-\N{U+08}]
,即它匹配 Unicode 代码点为 6、7 和 8 的字符。但 \x08
可能表示您指的是其他内容,因此会发出警告。
(W internal) VMS 特有的警告。在 Perl 准备迭代 %ENV 时,它遇到了一个过长的逻辑名或符号定义,因此被截断为显示的字符串。
(S experimental::builtin) 正在调用 builtin::
命名空间中的函数,该命名空间目前处于实验阶段。该函数的存在或性质可能会在 Perl 的未来版本中发生变化。
(F) 当当前没有编译代码时,调用了 builtin
包的 import
方法。由于此方法用于将新的词法子例程引入到当前正在编译的范围内,因此不会产生任何影响。
(F) 通过 call_sv() 从外部包调用的子例程通过调用退出而退出。
(W prototype) 您调用了一个具有原型的函数,但在解析器看到其定义或声明之前,Perl 无法检查调用是否符合原型。您需要为该子例程添加一个早期的原型声明,或者将子例程定义移到调用之前以获得正确的原型检查。或者,如果您确定正在正确调用该函数,可以在名称之前放置一个与号以避免警告。请参阅 perlsub。
(F) 尝试将参数名称应用于字段,而该名称已被同一类或其父类中的另一个字段使用。这会导致名称冲突,因此不允许。
(F) 您向 chr
传递了一个无效的数字(例如无穷大或非数字)。
(F) 您的 perl 脚本似乎在对由相对路径指定的进行就地编辑时更改了目录,并且您的系统不包含处理该问题的目录相对 POSIX 函数。
(F) 您尝试使用 BER 将无穷大或非数字压缩为无符号整数,这是没有意义的。
(F) pack("w",...) 的参数太大而无法压缩。BER 压缩整数格式只能用于正整数,而您尝试压缩一个非常大的数字 (> 1e308)。请参阅 "pack" in perlfunc。
(F) pack("w",...) 的参数为负数。BER 压缩整数格式只能用于正整数。参见 "pack" in perlfunc.
(F) 您直接操作了 Perl 的符号表,在其中存储了一个引用,然后尝试通过传统的 Perl 语法访问该符号。访问触发 Perl 自动创建该 typeglob,但从该类型的引用到 typeglob 没有合法的转换。
(P) Perl 检测到尝试将值复制到无法直接赋值的内部类型。
(F) 尝试从已经具有 @ISA
数组的包中创建类,并且该数组不为空。这是不允许的,因为它会导致继承不一致的类。
(S io) 您尝试将不存在的编码应用于文件句柄,无论是使用 open() 还是 binmode()。
(F) 您尝试通过传递一个不同类的实例的值来直接调用一个类的 method
子例程。这是不允许的,因为该方法将无法访问正确的实例字段。
(F) 您尝试通过传递一个不是该类实例的值来直接调用一个类的 method
子例程。这是不允许的,因为该方法将无法访问其实例字段。
(F) 您尝试使用 opendir() 将目录句柄与已包含文件句柄的符号(全局变量或标量)关联。由于这种用法可能会使您的代码难以理解,它在 Perl 5.10 中被弃用。从 Perl 5.28 开始,它是一个致命错误。
(F) 您尝试使用 open() 将文件句柄与已包含目录句柄的符号(全局变量或标量)关联。由于这种用法可能会使您的代码难以理解,它在 Perl 5.10 中被弃用。从 Perl 5.28 开始,它是一个致命错误。
(F) 您尝试在非 'class' 定义内部使用仅在 'class' 定义内部有意义的关键字之一。
(F) 您尝试将无穷大或非数字转换为整数,这是没有意义的。
(F) 您尝试将无穷大或非数字作为字符 (%c) 打印,这是没有意义的。也许您想使用 '%s',或者只是将其转换为字符串?
(F) 您尝试为已存在的类开始一个 'class' 定义。一个类只能有一个定义块。
(F) 'caller' 尝试设置 'DB::args',但发现它被绑定了。绑定 'DB::args' 不受支持。(在添加此错误之前,它曾经会导致崩溃。)
(P) 您不知何故在对一个不保留其参数引用计数且无法使其保留引用计数的数组调用 'tie'。此类数组甚至不应该被 Perl 代码访问,而只用于内部。
(F) 一些 XS 代码试图使用 `sv_vcatpvfn()` 或相关函数,并使用指定了某些元素显式索引的格式字符串,以及使用 C 样式的可变参数列表(`va_list`)。目前不支持此操作。想要执行此操作的 XS 作者必须改为构造一个包含参数的 `SV*` 标量的 C 数组。
(F) 传递给 pack("w",...) 的参数不是整数。BER 压缩整数格式只能用于正整数,而您尝试压缩其他内容。请参阅 "perlfunc 中的 pack"。
(F) 尝试使用控制流语句(如 `return`、`goto` 或循环控制)跳出 `defer` 块的范围。这是不允许的。
(F) 与上面类似,但涉及 `try`/`catch` 结构末尾的 `finally` 块,而不是 `defer` 块。
(F) 您尝试对已引用真实对象实例的值调用 `bless`。
(F) 只有硬引用可以被祝福。这是 Perl "强制" 对象封装的方式。请参阅 perlobj。
(F) 您调用了 `break`,但您在 `foreach` 块中而不是在 `given` 块中。您可能想使用 `next` 或 `last`。
(F) 您调用了 `break`,但您不在 `given` 块中。
(S) 这不应该发生。内部代码使用 `mortal_destructor_sv` 或 `mortal_destructor_x` 设置了析构函数,该析构函数在全局销毁期间触发。请尝试将触发此警告的代码简化为尽可能小的示例,然后将问题报告给 https://github.com/Perl/perl5/issues/new/choose
(F) 您使用了方法调用的语法,但对象引用或包名所填充的槽包含一个未定义的值。类似以下代码将重现此错误
$BADREF = undef;
process $BADREF 1,2,3;
$BADREF->process(1,2,3);
(F) 方法调用必须知道它应该在哪个包中运行。它通常从您提供的对象引用中找出这一点,但您在这种情况下没有提供对象引用。引用在被祝福之前不是对象引用。请参阅 perlobj。
(F) 您使用了方法调用的语法,但对象引用或包名所填充的槽包含一个表达式,该表达式返回一个定义的值,该值既不是对象引用也不是包名。类似以下代码将重现此错误
$BADREF = 42;
process $BADREF 1,2,3;
$BADREF->process(1,2,3);
(P) 在尝试更新 @ISA 缓存时,Perl 对哈希是普通哈希还是符号表哈希感到困惑。
(F) 一个 XS 模块试图在未附加到符号表的哈希上调用 `mro_method_changed_in`。
(F) 您调用了 `perl -x/foo/bar`,但 `/foo/bar` 不是您可以切换到的目录,可能是因为它不存在。
(F) 某些类型的 SV,特别是真实的符号表条目(类型全局变量),不能被强制停止成为它们本身。因此,您不能说诸如
*foo += 1;
您可以说
$foo = *foo;
$foo += 1;
但随后 $foo 不再包含一个全局变量。
(F) 您调用了 `continue`,但您不在 `when` 或 `default` 块中。
(F) 在 Cygwin 上,您使用空路径调用了路径转换函数。只有非空路径是合法的。
(P) VMS 特有的错误。该进程因配额耗尽或其他管道问题而无法运行。
(F) 只有标量、数组和哈希变量可以声明为“my”、“our”或“state”变量。它们必须具有普通标识符作为名称。
(F) 您使用了既不在 `foreach` 循环也不在 `given` 块中的 `default` 块。(请注意,此错误是在退出 `default` 块时发出的,因此如果您使用显式的 `continue`,则不会收到此错误。)
(S) 此警告表示 Perl 内部存在问题。Perl 试图查找特定 OP 的类别(例如 LISTOP),但无法做到。这可能是由于 Perl 内部存在错误,或者由于操作 Perl optree 的 XS 代码存在错误。
(S inplace) 您尝试对特殊文件使用 -i 开关,例如 /dev 中的文件、FIFO 或不可编辑的目录。该文件被忽略。
(S inplace) 创建新文件失败,原因如上所述。
(S inplace) 您的文件系统不支持超过 14 个字符的文件名,Perl 在使用 -i 开关进行就地编辑时无法创建唯一的文件名。该文件被忽略。
(W locale) 您正在 1) 使用 "use locale
";2) 当前区域设置不是 UTF-8 区域设置;3) 您尝试对指定的 Unicode 字符执行指定的字母大小写更改操作;4) 此操作的结果将混合 Unicode 和区域设置规则,这可能会导致冲突。禁止混合不同类型的规则,因此未执行操作;相反,结果是指示的值,这是使用完全 Unicode 规则的最佳可用值。事实证明,这几乎总是原始字符,未更改。
通常,混合非 UTF-8 区域设置和 Unicode 是一个坏主意,而这个问题就是其中一个原因。当 Unicode 规则通常会导致此操作的结果包含在区域设置指定的范围内(0..255)的字符时,就会引发此警告,因此该字符受区域设置规则而不是 Unicode 规则的约束。
如果您仅将区域设置用于其与数字和时间格式相关的特性(而不是 LC_CTYPE
),请考虑使用区域设置编译指示的受限形式(请参阅 "perllocale 中的“use locale”编译指示"),例如 "use locale ':not_characters'
"。
请注意,由于不区分大小写的 /i
正则表达式匹配而导致的失败的大小写更改操作将在此警告中显示为执行了 fc
操作(因为这是正则表达式引擎在幕后调用的操作)。
(F) 此机器没有 waitpid() 或 wait4(),因此仅模拟不带标志的 waitpid()。
(F) #! 行指定了一个在此处没有意义的开关。例如,在 #! 行上放置一个 -x 非常愚蠢。
(F) 您平台的字节序既不是大端序也不是小端序,或者它具有非常奇怪的指针大小。打包和解包大端序或小端序浮点数和指针可能不可行。请参阅 "perlfunc 中的 pack"。
(W exec) system()、exec() 或管道打开调用无法执行指定原因的命名程序。常见原因包括:文件权限错误、在 $ENV{PATH}
中找不到文件、要执行的可执行文件是为另一个体系结构编译的,或者脚本中的 #! 行指向无法运行的解释器(原因类似)。(或者,您的系统可能根本不支持 #!。)
(F) Perl 试图为你执行指定的程序,因为这就是 #! 行中所指示的。如果这不是你想要的,你可能需要在 #! 行中某个地方提及 "perl"。
(F) 你使用了 -S 开关,但 PATH 中找到的要执行的脚本没有正确的权限。
(F) 将形式为 CORE::word
的字符串传递给 prototype(),但没有名为 word
的内置函数。
(F) 你要求跳转到一个标签,但该标签在任何允许跳转到的位置都没有出现。请参阅 "perlfunc 中的 goto"。
(F) 你使用了 -S 开关,但无法在 PATH 中找到要执行的脚本。
(F) 你使用了 -S 开关,但无法在 PATH 中找到要执行的脚本,或者至少没有找到具有正确权限的脚本。该脚本存在于当前目录中,但 PATH 禁止运行它。
(F) Perl 字符串可以跨越多行。此消息表示缺少结束分隔符。由于方括号引号会计算嵌套级别,因此以下内容缺少其最终的括号
print q(The character '(' starts a side comment.);
如果你从 here-document 中收到此错误,你可能在结束标签之前或之后包含了看不见的空格,或者结束标签之后可能没有换行符。一个好的程序员编辑器将提供一种方法来帮助你找到这些字符(或缺少的字符)。有关 here-document 的完整详细信息,请参阅 perlop。
(F) 你通过 \p
或 \P
指定的命名属性不是 Perl 已知的属性。你可能拼错了名称?请参阅 "perluniprops 中通过 \p{} 和 \P{} 访问的属性",以获取可用官方属性的完整列表。如果它是一个 用户定义的属性,则必须在匹配正则表达式时定义它。
如果你不打算使用 Unicode 属性,请转义 \p
,方法是使用 \\p
(仅转义 \p
)或 \Q\p
(转义字符串的其余部分,或直到 \E
)。
(F) 在尝试创建子进程以打开管道时,发生了致命错误。
(W pipe) 管道中的创建子进程操作失败,返回 EAGAIN 错误,将在五秒后重试。
(S) VMS 特有的警告。这是由于 VMS 下的访问检查与 Perl 假设的 Unix 模型下的访问检查不同而产生的。在 VMS 下,访问检查是通过文件名进行的,而不是通过状态缓冲区中的位进行的,因此可以考虑 ACL 和其他保护措施。不幸的是,Perl 假设状态缓冲区包含所有必要的信息,并将它而不是文件规范传递给访问检查例程。它将尝试使用状态缓冲区中存在的设备名称和 FID 来检索文件规范,但这只有在你没有对 CRTL stat() 例程进行后续调用时才有效,因为设备名称在每次调用时都会被覆盖。如果出现此警告,则名称查找失败,访问检查例程放弃并返回 FALSE,只是为了保守起见。(注意:访问检查例程了解 Perl 的 stat
运算符和文件测试,因此你永远不会在响应 Perl 命令时看到此警告;它只会在某些内部代码轻视状态缓冲区时出现。)
(P) VMS 特有的错误。在创建邮箱作为管道后,Perl 无法检索其名称以供日后使用。
(P) VMS 特有的错误。Perl 向 $GETSYI 询问你希望邮箱缓冲区的大小,但没有得到答案。
(F) 执行了“goto”语句以跳转到二进制或列表表达式的中间。你无法从这里到达那里。此限制的原因是解释器会对参数数量感到困惑,从而导致堆栈损坏或崩溃。此错误发生在以下情况下
goto F;
print do { F: }; # Can't jump into the arguments to print
goto G;
$x + do { G: $y }; # How is + supposed to get its first operand?
(F) 执行了 goto
语句以跳转到 defer
块的范围内。这是不允许的。
(F) 执行了“goto”语句以跳转到given
块的中间。你无法从这里到达那里。请参阅"goto" in perlfunc。
(F) 执行了“goto”语句以跳转到foreach循环的中间。你无法从这里到达那里。请参阅"goto" in perlfunc。
(F) 执行了“goto”语句以跳转到看起来像块但实际上不是真正块的地方。这通常发生在你试图从sort()块或子程序中跳出时,这是不允许的。请参阅"goto" in perlfunc。
(F) “goto subroutine”调用无法用于从eval“字符串”或块中跳出。
(F) “goto subroutine”调用无法用于从sort()的比较子程序中跳出,或从类似的回调(例如List::Util中的reduce()函数)中跳出。
(F) 深度神奇的“goto subroutine”调用只能用另一个子程序调用替换一个子程序调用。它不能凭空制造一个。一般来说,你应该只在AUTOLOAD例程中调用它。请参阅"goto" in perlfunc。
(W signal) Perl检测到它正在运行,并且SIGCHLD信号(有时称为SIGCLD)被禁用。由于禁用此信号会干扰对子进程退出状态的正确确定,因此Perl已将信号重置为其默认值。这种情况通常表明Perl可能运行的父程序(例如cron)非常粗心。
(F) 进程标识符必须是(带符号的)整数。尝试杀死() 未定义、空字符串或其他非数字进程标识符将导致致命错误。
(F) 执行了“last”语句以退出当前块,但存在一个小问题,即没有当前块。请注意,“if”或“else”块不计为“循环”块,sort()、map() 或 grep() 给出的块也不计为“循环”块。通常可以通过将大括号加倍来获得相同的效果,因为内部大括号将被视为循环一次的块。请参见"last" in perlfunc。
(F) Perl 尝试计算包的方法解析顺序 (MRO),但由于包存储区没有名称而失败。
(F) 您尝试加载的模块未能加载动态扩展。这可能意味着您将 Perl 版本升级到与旧动态扩展不兼容的版本(这在 Perl 的主要版本之间发生),或者(更可能)您的动态扩展是在系统上安装的库的旧版本上构建的。您可能需要重新构建旧的动态扩展。
(F) 您在之前使用“my”或“state”声明为词法变量的变量名上使用了 local。这是不允许的。如果您想本地化相同名称的包变量,请使用包名称对其进行限定。
(F) 您使用了类似 local $$ref
的语句,Perl 目前无法处理,因为当它在 local() 范围结束之后恢复 $ref 指向的任何内容的旧值时,它无法确定 $ref 是否仍然是引用。
(F) 您尝试使用 `do`(或 `require`,或 `use`)加载一个找不到的文件。Perl 会在 `@INC` 中列出的所有位置查找该文件,除非文件名包含文件的完整路径。您可能需要设置 `PERL5LIB` 或 `PERL5OPT` 环境变量来指定额外库的位置,或者脚本需要将库名称添加到 `@INC` 中。或者您可能只是拼错了文件名。请参阅 "require" in perlfunc 和 lib。
(F) 在一个允许自动加载的包中调用了一个函数(或方法),但没有可自动加载的函数。最可能的原因是函数/方法名称拼写错误,或者没有使用 `AutoSplit` 拆分文件,例如,没有执行 `make install`。
(F) 您加载的模块试图加载一个外部库,例如,foo.so 或 bar.dll,但 DynaLoader 模块无法找到该库。请参阅 DynaLoader。
(F) 您正确地调用了一个方法,并且它正确地指示了一个充当类的包,但该包没有定义该特定方法,其任何基类也没有。请参阅 perlobj。
(F) 您在一个不存在的类上调用了一个方法,并且在 UNIVERSAL 中也找不到该方法。这通常意味着该方法需要一个尚未加载的包。
(F) 您将一个对象(直接或通过数组引用钩子)推入 `@INC`,但该对象不支持任何已知的钩子方法,也不支持字符串重载,也不是一个已祝福的 CODE 引用。简而言之,`require` 函数不知道如何处理该对象。另请参阅 "require" in perlfunc。
(W 语法) @ISA 数组包含另一个似乎不存在的包的名称。
(F) 您尝试在 open() 中使用一个不存在的 PerlIO 层,例如 open(FH, ">:nosuchlayer", "somefile")。
(F) 在某些系统(特别是 VMS)上不支持对 %ENV 进行列表赋值。
(S) 模块将标志 0x01 传递给 DynaLoader::dl_load_file() 以请求将来自指定文件中的符号在进程中全局可用,但此平台上不支持该功能。虽然模块可能仍然可以工作,但这可能会阻止 perl 解释器加载需要直接链接到指定文件中 C 或 XS 代码中定义的函数的其他基于 XS 的扩展。
(F) 您不允许对指示的项目进行赋值,或以其他方式尝试更改它,例如使用自动递增。
(F) 应该将旨在用作左值上下文的子程序声明为左值子程序。请参阅 "perlsub 中的左值子程序"。
(F) 只有有限数量的结构可以用作赋值左侧引用构造函数的参数,而您使用的不是其中之一。请参阅 "perlref 中的赋值到引用"。
(F) 不支持对 \local(@array)
或 \(local @array)
进行赋值,因为不清楚它应该做什么。如果您想让 @array 引用其他数组,请使用 \@array = \@other_array
。如果您想让 @array 的元素成为右侧引用的标量的别名,请使用 \(@array) = @scalar_refs
。
(F) 不支持对 \(%hash)
进行赋值。如果您想让 %hash 引用其他哈希,请使用 \%hash = \%other_hash
。如果您想让 %hash 的元素成为右侧引用的标量的别名,请使用哈希切片:\@hash{@keys} = @those_scalar_refs
。
(F) msgrcv 的目标必须可修改才能用作接收缓冲区。
(F) 执行了 "next" 语句以重新迭代当前块,但没有当前块。请注意,"if" 或 "else" 块不计为 "循环" 块,同样,传递给 sort()、map() 或 grep() 的块也不计为 "循环" 块。但是,您通常可以将花括号加倍以获得相同的效果,因为内部花括号将被视为循环一次的块。请参阅 "perlfunc 中的 next"。
(S inplace) 通过使用<>
文件句柄隐式打开文件失败,无论是在-n
或 -p
命令行开关下隐式打开,还是显式打开,失败的原因如上所示。通常这是因为您没有对命令行中指定的文件的读取权限。
(F) 您尝试使用-e 开关调用 perl,但无法打开/dev/null(或您的操作系统等效项)。
(W io) 您尝试使用 3 参数 open() 语法打开一个标量引用以进行读写
open FH, '>', $ref;
但您的 perl 版本是在没有 perlio 的情况下编译的,这种形式的 open 不受支持。
(W pipe) 您尝试使用open(CMD, "|cmd|")
,这不受支持。您可以尝试 Perl 库中的几个模块来完成此操作,例如 IPC::Open2。或者,将管道的输出定向到一个文件,使用“>”,然后在另一个文件句柄下读取它。
(F) VMS 特有的错误。Perl 执行自己的命令行重定向,并且无法打开命令行上 '2>' 或 '2>>' 后指定的文件以进行写入。
(F) VMS 特有的错误。Perl 执行自己的命令行重定向,并且无法打开命令行上 '<' 后指定的文件以进行读取。
(F) VMS 特有的错误。Perl 执行自己的命令行重定向,并且无法打开命令行上 '>' 或 '>>' 后指定的文件以进行写入。
(P) VMS 特有的错误。Perl 执行自己的命令行重定向,并且无法打开用于发送目标为 stdout 的数据的管道。
(F) 您指定的脚本无法打开,原因如上所示。
如果您正在调试一个使用 #! 的脚本,并且通常依赖于 shell 的 $PATH 搜索,则 -S 选项会导致 perl 执行该搜索,因此您不必键入路径或`which $scriptname`
。
(S) VMS 特有的警告。Perl 尝试从 CRTL 的内部环境数组中读取 %ENV 的一个元素,并发现该数组丢失了。您需要找出您的 CRTL 在哪里放错了它的环境,或者定义PERL_ENV_TABLES(参见 perlvms),以便不再搜索环境。
(F) 在另一个声明中发现了 "my"、"our" 或 "state" 声明,例如 my ($x, my($y), $z)
或 our (my $x)
。
(F) 执行 "redo" 语句以重新启动当前块,但没有当前块。请注意,"if" 或 "else" 块不计为 "循环" 块,同样,传递给 sort()、map() 或 grep() 的块也不计为 "循环" 块。通常可以通过将花括号加倍来获得相同的效果,因为内部花括号将被视为循环一次的块。请参阅 "redo" in perlfunc。
(S inplace) 您请求了原地编辑,但没有创建备份文件。Perl 无法删除原始文件以用修改后的文件替换它。文件保持未修改。
(F) 当隐式关闭时,用于原地编辑的临时文件无法重命名为原始文件名。
(F) 由 -i 开关执行的重命名由于某种原因失败,可能是因为您没有该目录的写入权限。
(P) VMS 特有的错误。Perl 认为 stdin 是一个管道,并尝试重新打开它以接受二进制数据。可惜,它失败了。
(F) 由于 UTF-8 的基本属性,尤其是 EBCDIC 平台,字符代码点的大小存在硬性限制。给定的代码点超过了该限制。唯一的解决方法是不使用如此大的代码点。
(F) 您调用了 reset('E')
或类似的函数,试图重置当前包中以 "E" 开头的所有变量。在主包中,这包括 %ENV。在某些系统上,重置 %ENV 不受支持,特别是 VMS。
(F)(P) 解析由方法名(而不是子例程引用)指定的重载时出错:包中没有可调用的此类方法。如果方法名为 ???
,则这是内部错误。
(F) Perl 检测到尝试从用作左值的子例程返回非法的左值(例如临时值或只读值)。这是不允许的。
(F) return 语句在主线代码中执行,即没有子例程调用来返回。请参阅 perlsub。
(F) 您尝试从左值子例程返回完整的数组或哈希,但您以一种让 Perl 认为您只想返回一个值的方式调用了子例程。您可能想在对子例程的调用周围加上括号,这告诉 Perl 该调用应该在列表上下文中。
(F) 对于普通的实数,您不能对负数或零取对数。不过,Perl 附带了一个 Math::Complex 包,如果您确实想对负数执行此操作。
(F) 对于普通的实数,您不能对负数取平方根。不过,Perl 附带了一个 Math::Complex 包,如果您确实想执行此操作。
(F) 你不能取消定义当前正在运行的例程。但是,你可以在它运行时重新定义它,甚至可以在旧例程运行时取消定义重新定义的子例程。想一想吧。
(F) 你试图削弱一个不是引用的东西。只有引用可以被削弱。
(P) 内部 sv_upgrade 例程向 SV 添加“成员”,使其成为更专业的 SV 类型。然而,前几个 SV 类型非常专业,因此它们不能相互转换。此消息表明尝试了这种转换。
(F) 你尝试使用 **-m** 开关调用 perl,但在模块名称后使用了除“=”以外的字符。
(F) 你尝试将哈希用作引用,例如在 %foo->{"bar"}
或 %$ref->{"hello"}
中。perl <= 5.22.0 版本曾经允许这种语法,但本不应该。这在 perl 5.6.1 中被弃用。
(F) 你尝试将数组用作引用,例如在 @foo->[23]
或 @$ref->[99]
中。perl <= 5.22.0 版本曾经允许这种语法,但本不应该。这在 perl 5.6.1 中被弃用。
(F) 进行方法查找的内部例程被传递了一个没有名称的符号表。例如,通过取消定义符号表,符号表可以变为匿名:undef %Some::Package::
。
(F) 用作硬引用或符号引用的值必须是已定义的值。这有助于消除一些隐蔽的错误。
(F) 只有硬引用在 "strict refs" 中被允许。符号引用不被允许。参见 perlref.
(F) 第一次使用 %!
哈希时,perl 会自动加载 Errno.pm 模块。Errno 模块预期会绑定 %! 哈希以提供 $!
errno 值的符号名称。
(F) 类型不能同时强制为大端和小端字节序,因此不允许这种修饰符组合。参见 "pack" in perlfunc.
(F) defined() 对数组没有用,因为它检查的是未定义的标量值。如果你想查看数组是否为空,只需使用 if (@array) { # 非空 }
即可。
(F) defined()
通常不适用于哈希。
虽然 defined %hash
在一个普通的未使用的哈希上为假,但在几个不明显的情况下会变为真,包括迭代器、弱引用、存储名称,甚至在 undef %hash
后仍然为真。这些情况使得 defined %hash
在实践中几乎没有用,因此现在会生成一个致命错误。
如果你想检查非空,只需将其置于布尔上下文中(参见 "Scalar values" in perldata)
if (%hash) {
# not empty
}
如果你使用 defined %Foo::Bar::QUUX
来检查是否存在这样的包变量,那么这从来都不可靠,也不是查询包的功能或是否加载等的好方法。
(P) 解析器在尝试解析 foreach
循环时感到困惑。
(F) 您试图将一个魔法变量声明为词法变量。这是不允许的,因为魔法只能绑定到一个位置(即全局变量),如果您的程序中存在看起来像魔法变量但实际上不是的变量,将会造成极大的混乱。
(F) 您试图对已经位于具有字节序修饰符的组中的类型强制使用不同的字节序。例如,您不能对位于大端组中的类型强制使用小端序。
(F) 全局变量 $a 和 $b 为排序比较保留。您在与 <=> 或 cmp 运算符相同的行中提到了 $a 或 $b,并且该变量之前被声明为词法变量。请使用包名限定排序变量,或重命名词法变量。
(F) 您混淆了引用类型。您必须取消引用所需类型的引用。如果需要,可以使用 ref() 函数测试引用的类型。
(F) 您告诉 Perl 取消引用一个字符串,而 use strict
会阻止这种情况意外发生。请参阅 "perlref 中的符号引用"。这可能是由双引号字符串中紧接在插值变量之前的 @
或 $
引起的,例如在 "user @$twitter_id"
中,它表示将 $twitter_id
的内容视为数组引用;使用 \
来表示一个字面上的 @
符号,后跟 $twitter_id
的内容:"user \@$twitter_id"
。
(F) 编译器试图将括号表达式解释为下标。但是,在括号左侧的表达式看起来不像哈希或数组引用,也不像任何其他可下标的表达式。
(W 语法) 在普通表达式中,反斜杠是一个一元运算符,用于创建对参数的引用。反斜杠用于表示对匹配子字符串的反向引用的用法仅在正则表达式模式中有效。尝试在普通的 Perl 代码中执行此操作会产生一个看起来像 SCALAR(0xdecaf) 的值。请改用 $1 形式。
(F) 您尝试削弱一个不是引用的东西。只有引用可以削弱。
(F) 您使用了不在 foreach
循环或 given
块中的 when() 块。(请注意,此错误是在退出 when
块时发出的,因此如果匹配失败,或者您使用显式的 continue
,您将不会收到错误。)
(F) 您尝试使用赋值运算符重复一个常量值(通常是未定义的值),这意味着修改值本身。也许您需要将该值复制到一个临时变量中,然后重复该变量。
(F) 您尝试使用 use feature 'try'
的 try
和 catch
语法,但没有在 catch
块中包含错误变量。与您可能从 CPAN 模块或其他语言中熟悉的某些其他语法形式不同,括号中的变量名不是可选的。
所需的语法是
try { ... }
catch ($var) { ... }
(F) 在 \cX
中,X 必须是可打印的(非控制)ASCII 字符。
请注意,不映射到控制字符的 ASCII 字符是不鼓励使用的,并且会在启用时生成警告(""\c%c" 可以更清晰地写成 "%s"")。
(F) (在上面,%c
被替换为 p
或 P
。) 您指定了不是合法 Unicode 属性名称的内容。大多数 Unicode 属性由 \p{...}
指定。但如果名称是单个字符,则可以省略大括号。
(W pack) 您说
pack("C", $x)
其中 $x 小于 0 或大于 255;"C"
格式仅用于编码本地操作系统字符(ASCII、EBCDIC 等),而不是 Unicode 字符,因此 Perl 的行为就好像您指的是
pack("C", $x & 255)
如果您确实想打包 Unicode 代码点,请改用 "U"
格式。
(W pack) 您说
pack("c", $x)
其中 $x 小于 -128 或大于 127;"c"
格式仅用于编码本地操作系统字符(ASCII、EBCDIC 等),而不是 Unicode 字符,因此 Perl 的行为就好像您指的是
pack("c", $x & 255);
如果您确实想打包 Unicode 代码点,请改用 "U"
格式。
(W unpack) 您尝试了类似
unpack("H", "\x{2a1}")
其中格式期望处理一个字节(值小于 256 的字符),但提供了一个更高的值。Perl 使用值模 256,就好像您提供了
unpack("H", "\x{a1}")
(W pack) 您说
pack("U0W", $x)
其中 $x 小于 0 或大于 255。但是,U0
模式期望所有值都落在 [0, 255] 区间内,因此 Perl 的行为就好像您指的是
pack("U0W", $x & 255)
(W pack) 您尝试了类似
pack("u", "\x{1f3}b")
其中格式期望处理一系列字节(值小于 256 的字符),但其中一些字符的值更高。Perl 使用字符值模 256,就好像您提供了
pack("u", "\x{f3}b")
(W unpack) 您尝试了类似
unpack("s", "\x{1f3}b")
其中格式期望处理一系列字节(值小于 256 的字符),但其中一些字符的值更高。Perl 使用字符值模 256,就好像您提供了
unpack("s", "\x{f3}b")
(F) 您定义了一个字符名称,其中包含多个连续的空格字符。将它们更改为单个空格。通常这些名称是在 use charnames
的 :alias
导入参数中定义的,但它们也可以通过安装到 $^H{charnames}
中的翻译器来定义。请参阅 "charnames 中的自定义别名"。
(W unopened) 您尝试在从未打开的文件句柄上执行 chdir()。
(W 语法) \cX
结构旨在用于指定不可打印字符。您将其用于可打印字符,最好直接写成本身,对于非单词字符,可能需要在前面加上反斜杠。您使用的方式在 ASCII 和 EBCDIC 平台之间不可移植。
(F) 您尝试使用 :isa
属性为 class
指定第二个超类,而它已经指定了一个超类。与使用 bless
创建实例的类不同,使用 class
关键字创建的类不能有多个超类。
(F) 您为类指定了一个属性,该属性需要在括号中传递一个值,但您没有提供。请记住,属性名称和其值之间 **不允许** 有空格;您必须这样写:
class Example::Class :attr(VALUE) ...
(S experimental::class) 如果您使用 use feature 'class'
的 class
关键字,就会发出此警告。此关键字目前处于实验阶段,其行为可能会在 Perl 的未来版本中发生变化。
(F) 使用 class
的 :isa
属性创建子类时,命名的超类也必须是使用 class
关键字创建的真实类。
(F) 在 s///
运算符中创建新线程不受支持。
(W io) 您尝试关闭的目录句柄要么已关闭,要么不是真正的目录句柄。请检查您的控制流。
(W 未打开) 您尝试关闭一个从未打开的文件句柄。
(F) 如果闭包具有属性,则传递给属性处理程序的子例程是创建新闭包时克隆的原型。此子例程不可调用。
(F) \C 字符类以前允许在多字节 utf-8 字符中匹配单个字节,但在 v5.24 中被移除,因为它破坏了封装,并且其实现存在极大的错误。如果您确实需要处理单个字节,您可能需要使用 utf8::encode() 将您的字符串转换为每个底层字节都存储为字符的字符串。
(F) 您有一个以 '/' 结尾的(子)模板。斜杠后面必须有另一个模板代码。参见 "perlfunc 中的 pack"。
(S 非 Unicode 可移植) 您有一个从未在任何标准中出现的代码点,因此其他语言(除了 Perl)可能无法理解它。此代码点在 ASCII 平台上也不适合 32 位字,因此在系统之间不可移植。
曾经,在某些标准中,代码点可以高达 0x7FFF_FFFF,但不能更高,而此代码点更高。
接受这些代码点是 Perl 的扩展,您应该预期除了 Perl 之外,没有其他东西可以处理它们;在 v5.24 之前的 EBCDIC 平台上的 Perl 本身不处理它们。
Perl 也不保证这些代码点的表示形式在将来的某个时间点不会改变,例如当机器变得可用时,它们具有大于 64 位字的字。到那时,由旧版 Perl 编写的包含这些代码点的文件可能需要在由新版 Perl 读取之前进行转换。
(S 非 Unicode) 您有一个超过 Unicode 最大值 U+10FFFF 的代码点。
Perl 允许字符串包含 Unicode 代码点的超集,但这些代码点可能不被其他语言/系统接受。此外,即使这些语言/系统接受这些大型代码点,它们也可能为它们选择了与 Perl 的 UTF-8 类表示不同的表示方式,这意味着文件在它们和 Perl 之间不可交换。
在 EBCDIC 平台上,Perl v5.24 中代码点高于 0x3FFF_FFFF 的表示方式与之前不同,因此任何包含这些代码点的文件,如果是在该版本之前编写的,则需要在被更高版本的 Perl 读取之前进行转换。
(A) 您不小心通过 csh 或其他 shell 而不是 Perl 运行了您的脚本。检查 #! 行,或手动将您的脚本输入 Perl。文件顶部的 #! 行可能如下所示
#!/usr/bin/perl
(A) 您不小心通过 bash 或其他 shell 而不是 Perl 运行了您的脚本。检查 #! 行,或手动将您的脚本输入 Perl。文件顶部的 #! 行可能如下所示
#!/usr/bin/perl
(A) 您不小心通过 zsh 或其他 shell 而不是 Perl 运行了您的脚本。检查 #! 行,或手动将您的脚本输入 Perl。文件顶部的 #! 行可能如下所示
#!/usr/bin/perl
(F) Perl 无法编译 require
语句中指定的某个文件。当 Perl 遇到的错误都不足以立即停止编译时,它会使用此通用消息。
(W closed) 您尝试在已关闭的套接字上执行连接。您是否忘记检查 socket() 调用的返回值?请参阅 "perlfunc 中的 connect"。
(F) 用于处理常量重载(请参阅 overload)或自定义 charnames 处理程序(请参阅 "charnames 中的 CUSTOM TRANSLATORS")的子例程返回了一个未定义的值。
(F) 解析器在尝试定义重载常量时发现不一致。您是否忘记加载相应的 overload pragma?
(F) 正在对一个常量值(可能使用 use constant
声明)进行解引用,但它对应错误的引用类型。消息指示了预期引用的类型。这通常表示对常量值进行解引用时的语法错误。请参阅 "perlsub 中的常量函数" 和 constant。
(F) 你写了类似以下内容:
my $var;
$sub = sub () { $var };
但 $var
在其他地方被引用,并且可能在 sub
表达式求值后被修改。它要么在其他地方被显式修改($var = 3
),要么被传递给子程序或像 printf
或 map
这样的运算符,这些运算符可能会或可能不会修改变量。
传统上,Perl 会捕获该点变量的值,并将子程序转换为可用于内联的常量。在变量可以在其他地方修改的情况下,这会破坏闭包的行为,在闭包中,子程序会捕获变量本身,而不是它的值,因此对变量的未来更改会反映在子程序的返回值中。
这种用法已被弃用,从 Perl 5.32 开始不再允许,这使得将来可以更改行为。
如果你希望子程序能够用于内联,那么确保变量在其他地方没有被引用,可能通过复制它
my $var2 = $var;
$sub = sub () { $var2 };
如果你希望这个子程序是一个闭包,它反映了对它闭包的变量的未来更改,请添加一个显式的 return
my $var;
$sub = sub () { return $var };
(W redefine)(S) 你重新定义了一个以前可以用于内联的子程序。请参阅 "perlsub 中的常量函数" 以了解评论和解决方法。
(W misc) 您取消定义了一个之前有资格进行内联的子例程。有关评论和解决方法,请参阅 "perlsub 中的常量函数"。
(F) 解析器在尝试定义重载常量或尝试查找 \N{...}
转义中指定的字符名称时发现不一致。您是否忘记加载相应的 overload 准则?
(S experimental::const_attr) "const" 属性处于实验阶段。如果您想使用此功能,请使用 no warnings 'experimental::const_attr'
禁用警告,但请注意,这样做会冒您的代码在未来的 Perl 版本中可能出现问题的风险。
(F) "const" 属性会导致匿名子例程在克隆时运行并捕获其值。命名子例程不会像这样克隆,因此该属性对它们没有意义。
(F) 重载 "=" 的方法有错误。请参阅 "overload 中的复制构造函数"。
(F) 您尝试使用 &foo
语法或通过引用调用 CORE::
命名空间中的子例程。此包中的一些子例程目前无法以这种方式调用,而必须作为裸词调用。类似这样的操作将起作用
BEGIN { *shove = \&CORE::push; }
shove @array, 1,2,3; # pushes on to @array
(F) CORE:: 命名空间保留用于 Perl 关键字。
(P) 这是 Perl 中的错误,或者,如果您正在使用,则是您的 自定义正则表达式引擎。如果不是后者,请将问题报告给 https://github.com/Perl/perl5/issues/new/choose。
(P) 正则表达式引擎对正则表达式编译器提供的內容感到困惑。
(P) 正则表达式引擎传递了一个没有有效魔数的正则表达式程序。
(P) Perl 附带的 malloc 包出现内部错误。
(F) 您在解包模板中指定了计数长度字符串,但同时也指定了字符串的显式大小。请参阅 "perlfunc 中的 pack"。
(S experimental::declared_refs) 如果您在 my
、state
、our
或 local
的右侧使用引用构造函数,则会发出此警告。如果您想使用此功能,只需抑制警告即可,但请注意,这样做意味着您正在使用可能在未来 Perl 版本中发生更改或被删除的实验性功能,并承担相应的风险。
no warnings "experimental::declared_refs";
use feature "declared_refs";
$fooref = my \$foo;
(W recursion) 此子程序已调用自身(直接或间接)超过 100 次,而返回次数却少于 100 次。这可能表明存在无限递归,除非您正在编写奇怪的基准测试程序,在这种情况下,它表明了其他问题。
可以通过重新编译 perl 二进制文件,将 C 预处理器宏 PERL_SUB_DEPTH_WARN
设置为所需的值,来更改此阈值(默认值为 100)。
(F) 您使用了类似 (?(DEFINE)...|..)
的内容,这是非法的。此错误最可能的原因是您在 ....
部分中遗漏了一个括号。
<-- HERE 显示了在正则表达式中发现问题的位置。
(F) 您可能说过类似“使用模块 42”的话,但在模块文件中既没有包声明也没有 `$VERSION`。
(F) `delete` 的参数必须是哈希或数组元素,例如
$foo{$bar}
$ref->{"susie"}[12]
或者哈希或数组切片,例如
@foo[$bar, $baz, $xyzzy]
$ref->[12]->@{"susie", "queue"}
或者哈希键/值或数组索引/值切片,例如
%foo[$bar, $baz, $xyzzy]
$ref->[12]->%{"susie", "queue"}
(F) 在类似 `<<FOO` 的这里文档结构中,标签 `FOO` 对 Perl 来说太长了。您必须非常扭曲才能编写触发此错误的代码。
(F) DESTROY() 方法创建了对正在销毁的对象的新的引用。Perl 感到困惑,它更愿意中止而不是创建悬挂引用。
参见 "500 服务器错误"。
(F) 必需的(或使用的)文件必须返回真值,以表明它已正确编译并正确运行了其初始化代码。传统上,此类文件以“1;”结尾,尽管任何真值都可以。参见 "perlfunc 中的 require"。
(W misc) 您可能将导入的子例程 &FOO 引用为 $FOO 或类似的东西。
(W shadow) 请记住,“our”不会局部化声明的全局变量。您在同一个词法作用域中再次声明了它,这似乎是多余的。
(W) 你可能在写 %hash{$key} 时,是想写 $hash{$key} 或 @hash{@keys}。另一方面,也许你只是想写 %hash,然后写过头了。
(F) 你传递给 die() 一个空字符串(相当于 die ""
)或者你调用它时没有参数,并且 $@
为空。
参见 "500 服务器错误"。
(F) 你写了类似 "use Module 42" 的代码,但 Module 没有定义 $VERSION
。
(F) 你不能在 '/' 代码后面直接使用任何类型的重复次数。请参考 "pack" in perlfunc。
(D deprecated::dot_in_inc) 以前 do "somefile";
会在当前目录中搜索指定文件。从 perl v5.26.0 开始,. 默认情况下已从 @INC
中移除,因此不再适用。要搜索当前目录(并且仅搜索当前目录),你可以写 do "./somefile";
。
(P) PerlIO_getname
是 VMS 特定的 perl 内部 I/O 函数,它在其他平台上被调用。这种情况不应该发生。
(P) 魔法变量的内部处理出现了错误。
(S deprecated::version_downgrade) 当在 use VERSION
语句中请求低于 v5.11 的版本(此时 use strict
的效果将被禁用),并且之前声明的版本号更大(这将启用这些效果)时,就会发出此警告。由于 use VERSION
与严格性标志交互方式的改变,这种做法不再被支持。
(S 语法) 这是根据消息“%s found where operator expected”做出的推测。它通常意味着引用了尚未声明的子程序或模块名称。这可能是由于文件中的排序问题,或者由于缺少“sub”、“package”、“require”或“use”语句。如果您引用了尚未定义的内容,您实际上不必在当前位置之前定义子程序或包。您可以使用空的“sub foo;”或“package FOO;”来输入“前向”声明。
(F) 您使用了过时的 dump()
内置函数。它在 Perl 5.8.0 中被弃用。从 Perl 5.30 开始,它必须以完全限定的格式编写:CORE::dump()
。
(F) 您的机器不支持 dump/undump。
(S malloc) 内部例程在已释放的内容上调用了 free()。
(W unpack) 您在 pack 模板中的类型之后多次应用了相同的修饰符。参见 "perlfunc 中的 pack"。
(W 语法) 您在匿名哈希或数组上调用了 each。由于每次都会创建一个新的哈希或数组,因此 each() 将每次重新开始遍历您的哈希或数组。
(S 语法) Perl 中没有 "elseif" 关键字,因为 Larry 认为它很丑。你的代码会被解释为尝试对由以下代码块返回的类调用名为 "elseif" 的方法。这很可能不是你想要的。
(F) 你使用了类似 \b{}
、\B{}
、\o{}
、\p
、\P
或 \x
的东西,但没有指定它要操作的内容。
不幸的是,出于向后兼容性的原因,空 \x
在 use re 'strict'
之外是合法的,并且扩展为 NUL 字符。
(W 正则表达式) (仅在 use re 'strict'
下) (?)
不执行任何操作,因此这可能是一个拼写错误。
(F) 特殊变量 ${^ENCODING}
,以前用于实现 encoding
pragma,从 Perl 5.26.0 开始不再受支持。
从 Perl 5.28 开始,将其设置为除 undef
之外的任何值都会导致致命错误。
(F) 你尝试将除 undef 或 CODE 引用之外的东西分配给 %{^HOOK}
。钩子只能是 CODE 引用。有关详细信息,请参阅 "%{^HOOK}" in perlvar。
(F) 你尝试将除 undef 或 CODE 引用之外的东西分配给 %{^HOOK}
。钩子只能是 CODE 引用。有关详细信息,请参阅 "%{^HOOK}" in perlvar。
(F) 在 use filetest
pragma 下,切换真实和有效 uid 或 gid 失败。
(F) 你在 taint 模式下运行,并且 %ENV
变量已与另一个哈希表存在别名关系,因此它不再反映程序环境的状态。这可能不安全。
(F) VMS 特有的错误。由于 Perl 可能需要处理 VMS 或 Unix 语法中的文件规范,因此在必须直接操作它们时,它会将它们转换为单一形式。您可能向 Perl 传递了无效的文件规范,或者您遇到了转换例程无法处理的情况。真糟糕。
(F) 在处理用户定义属性时遇到错误("perlunicode 中的用户定义字符属性")。这些是程序员编写的子例程,因此可能存在阻止它们编译或运行的错误。对这些子例程的调用是 eval
的,如果出现故障,则会使用来自失败 eval
的 $@
内容引发此消息。
另一种可能性是在扩展属性的链中遇到受污染的数据。如果是这样,消息措辞将表明这是问题所在。请参阅 "不安全的用户定义属性 %s"。
(F) Perl 在尝试编译包含 (?{ ... })
零宽度断言的正则表达式时检测到受污染的数据,这是不安全的。请参阅 "perlre 中的 (?{ code })" 和 perlsec。
(F) Perl 尝试在运行时编译包含 (?{ ... })
零宽度断言的正则表达式,就像模式包含插值值时一样。由于这是一种安全风险,因此不允许。如果您坚持,您仍然可以通过使用 re 'eval'
编译指示或通过在运行时从插值字符串显式构建模式并在 eval() 中使用它来做到这一点。请参阅 "perlre 中的 (?{ code })"。
(F) 正则表达式包含 (?{ ... })
零宽度断言,但该构造仅在 use re 'eval'
编译指示生效时才允许。请参阅 "perlre 中的 (?{ code })"。
(F) 您使用了嵌套了太多 EVAL 调用的模式,而没有消耗任何文本。重新构建模式,以便消耗文本。
<-- HERE 显示了在正则表达式中发现问题的位置。
(F) <> 运算符的内容不能超过 Perl 标识符的最大长度。如果您只是想 glob 一长串文件名,请尝试使用 glob() 运算符,或者将文件名放入变量中并 glob 该变量。
(F) exec
函数在某些系统上未实现,例如 Catamount。请参阅 perlport。
(F) Perl 编译失败时的最终摘要消息。
(F) Perl 编译失败时的最终摘要消息。
(F) exists
的参数必须是哈希或数组元素,或者带有 & 符号的子例程,例如
$foo{$bar}
$ref->{"susie"}[12]
&do_something
(F) exists &sub
的 exists
参数必须是子例程名称,而不是子例程调用。exists &sub()
会生成此错误。
(W exiting) 您正在通过非常规方式退出 eval,例如 goto 或循环控制语句。
(W exiting) 您正在通过非常规方式退出格式,例如 goto 或循环控制语句。
(W exiting) 您正在通过非常规方式退出相当特殊的块结构(如 sort 块或子例程),例如 goto 或循环控制语句。请参阅 "sort" in perlfunc。
(W 退出) 您正在通过非常规方式退出子例程,例如 goto 或循环控制语句。
(W 退出) 您正在通过非常规方式退出替换,例如 return、goto 或循环控制语句。
(F) 传递给 "export_lexically" 在内置函数中 的引用的类型与前导名称的符号不匹配,或者该值根本不是引用。
(F) 你写了类似以下内容:
(?13
表示形式为 (?PARNO)
的捕获组,但省略了 ")"
。
(F) 看起来您试图插值一个已经编译的扩展字符类,如下所示
my $thai_or_lao = qr/(?[ \p{Thai} + \p{Lao} ])/;
...
qr/(?[ \p{Digit} & $thai_or_lao ])/;
但标记的代码在语法上不正确,不能作为这样的插值类。
(F) 要通过引用进行别名,您必须首先启用该功能
no warnings "experimental::refaliasing";
use feature "refaliasing";
\$x = \$y;
(F) Perl 5.14 中添加的一个实验性功能允许使用标量参数调用 each
、keys
、push
、pop
、shift
、splice
、unshift
和 values
。该实验被认为不成功,已被删除。postderef
功能可能更能满足您的需求。
(F) 要使用子例程签名,您必须首先启用它们
use feature "signatures";
sub foo ($left, $right) { ... }
(W misc) 您正在祝福对零长度字符串的引用。这将使引用祝福到包 main 中。这通常不是您想要的。考虑提供一个默认目标包,例如 bless($ref, $p || 'MyPackage');
(F) "export_lexically" in builtin 在运行时被调用。因为它在当前正在编译的词法范围内创建新的名称,所以它只能从该范围内的 BEGIN
块内的代码中调用。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(F) 在执行 UNITCHECK、CHECK、INIT 或 END 子例程时,引发了一个未捕获的异常。对这些例程队列中剩余部分的处理已提前结束。
(F) 关闭从就地编辑输出的文件(如使用 -i
命令行开关)失败。
(W regexp)(F) 字符类范围必须以一个字面字符开始和结束,而不是以另一个字符类(如 \d
或 [:alpha:]
)开始和结束。错误范围中的 "-" 被解释为字面 "-"。在 (?[...])
结构中,这是一个错误,而不是警告。考虑对 "-" 进行引用,即 "\-"。 <-- HERE 显示了在正则表达式中发现问题的位置。请参阅 perlre。
(P) VMS 特有的错误。VMS 系统服务或 RTL 例程中发生了异常情况;Perl 的退出状态应该提供更多详细信息。 "at %s" 中的文件名和 "line %d" 中的行号告诉您 Perl 源代码的哪个部分出现了问题。
(F) 您的机器似乎没有实现 fcntl()。这是什么,PDP-11 还是其他东西?
(F) 关联数组声称拥有负数个元素,这是不可能的。
(F) 字段最多只能使用一次 :param
属性来为其分配参数名称;一旦应用第二次,就不允许了。
(F) 您为字段指定了一个属性,该属性需要在括号中传递一个值,但您没有提供。请记住,属性名称与其值之间**不允许**有空格;您必须将其写成
field $var :attr(VALUE) ...
(S experimental::class) 如果您使用 use feature 'class'
的 field
关键字,则会发出此警告。此关键字目前处于实验阶段,其行为可能会在将来的 Perl 版本中发生变化。
(F) 尝试从不在 method
子例程主体内部出现的代码中访问类的字段变量。这是不允许的,因为只有方法才能访问实例的字段。
(F) 尝试从另一个类的嵌套方法中访问类的字段变量,该方法嵌套在实际定义该字段变量的类中。这是不允许的,因为只有给定类定义的方法才能访问该类的字段。
(W pack) uuencoded 字符串中的每一行都以长度指示符开头,该指示符不能编码超过 63 的值。因此,要求大于该值的行长度没有意义。Perl 将表现得好像您指定了 u63
作为格式。
(W io) 您尝试写入只读文件句柄。如果您希望它成为读写文件句柄,则需要使用 "+<" 或 "+>" 或 "+>>" 打开它,而不是使用 "<" 或不使用任何内容。如果您只打算写入文件,请使用 ">" 或 ">>"。请参阅 "perlfunc 中的 open"。
(W io) 您尝试从仅用于写入的文件句柄中读取。如果您希望它成为读写文件句柄,则需要使用 "+<" 或 "+>" 或 "+>>" 打开它,而不是使用 ">"。如果您只想从文件中读取,请使用 "<"。参见 "perlfunc 中的 open"。另一种可能是您尝试将文件描述符 0(也称为 STDIN)打开以供输出(也许您之前关闭了 STDIN?)。
(W io) 您打开了一个文件句柄以供读取,该文件句柄获得了与 STDOUT 或 STDERR 相同的文件句柄 ID。这是因为您之前关闭了 STDOUT 或 STDERR。
(W io) 您打开了一个文件句柄以供写入,该文件句柄获得了与 STDIN 相同的文件句柄 ID。这是因为您之前关闭了 STDIN。
(W io) 您打开了一个文件句柄以供读取,该文件句柄获得了与 STDOUT 或 STDERR 相同的文件句柄 ID。这是因为您之前关闭了该句柄。
(F) 您现在必须决定字符串中的最终 $ 是否表示一个文字美元符号,或者是否表示一个恰好缺失的变量名。因此您必须添加反斜杠或名称。
(S experimental::defer) defer
块修饰符是实验性的。如果您想使用此功能,请使用 no warnings 'experimental::defer'
禁用警告,但请注意,这样做会冒您的代码在未来的 Perl 版本中可能出现问题的风险。
(W closed) 您尝试 flock() 的文件句柄在一段时间前自行关闭。检查您的控制流程。flock() 在文件句柄上操作。您是否尝试在同名目录句柄上调用 flock()?
(S experimental::for_list) 如果您使用 for
同时迭代多个值,则会发出此警告。此语法目前处于实验阶段,其行为可能会在未来的 Perl 版本中发生变化。
(F) 格式必须以包含单个点的行结尾。Perl 在没有找到这样的行的情况下到达了您的文件末尾。
(W redefine) 您重新定义了一个格式。要抑制此警告,请说
{
no warnings 'redefine';
eval "format NAME =...";
}
(W syntax) 您说
if ($foo = 123)
您的意思是
if ($foo == 123)
(或类似的东西)。
(S syntax) Perl 词法分析器知道是否应该期望一个词语或一个运算符。如果它在期望看到运算符时看到了它知道是词语的东西,它会发出此警告。通常,这表示省略了运算符或分隔符,例如分号。
(S) 来自 GDBM_File 扩展的警告,表示存储失败。
(F) 您的 C 库显然没有实现 gethostent(),可能是因为它如果实现了,它会觉得有道德义务返回互联网上的每个主机名。
(W closed) 您尝试在已关闭的套接字上获取套接字或对等套接字名称。您是否忘记检查 socket() 调用的返回值?
(S) VMS 特有的警告。对 getpwnam
运算符底层的 sys$getuai
调用返回了一个无效的 UIC。
(W closed) 您尝试在已关闭的套接字上获取套接字选项。您是否忘记检查 socket() 调用的返回值?请参见 "perlfunc 中的 getsockopt"。
(D 已弃用::智能匹配) given
依赖于智能匹配,而智能匹配已弃用。它将在 Perl 5.42 中被移除。请参阅 "perlsyn 中关于 given 和 when 的实验细节" 中的解释。
(F) 您已经使用了 "use strict" 或 "use strict vars",这表示所有变量必须是词法作用域的(使用 "my" 或 "state"),事先使用 "our" 声明,或者显式限定以说明全局变量属于哪个包(使用 "::")。
(S glob) glob
和 <*.c>
使用的外部程序出现问题。通常,这意味着您提供的 glob
模式导致外部程序失败并退出,状态码为非零。如果消息表明异常退出导致了核心转储,这也可能意味着您的 csh(C shell)已损坏。如果是这样,您应该更改 config.sh 中所有与 csh 相关的变量:如果您有 tcsh,请将变量设置为引用它,就好像它是 csh 一样(例如 full_csh='/usr/bin/tcsh'
);否则,将它们全部清空(除了 d_csh
应该为 'undef'
),这样 Perl 就会认为 csh 丢失了。无论哪种情况,在编辑 config.sh 后,运行 ./Configure -S
并重新构建 Perl。
(F) 词法分析器在预期为项的地方看到了左尖括号,因此它正在寻找相应的右尖括号,但没有找到。您可能在该行的前面遗漏了一些必要的括号,而您实际上是想使用 "小于" 符号。
(W 溢出) 您使用 gmtime
传递了一个它无法处理的数字:太大、太小或 NaN。返回值为 undef
。
(W 溢出) 您使用 gmtime
传递了一个大于它可以可靠处理的数字,gmtime
可能返回了错误的日期。此警告也会在 NaN(特殊非数字值)的情况下触发。
(W 溢出) 您使用了一个小于 gmtime 可靠处理的数字调用了 gmtime
,并且 gmtime
可能返回了错误的日期。
(P) OS/2 特有的错误。很可能您正在使用过时的 Perl 版本,这种情况不应该发生。
(F) 与 "next" 或 "last" 不同,您不允许 goto 未指定的目的地。请参阅 "perlfunc 中的 goto"。
(F) 您尝试使用 goto &sub
语法调用子例程,但指定的子例程尚未定义,或者如果已定义,则已取消定义。
(F) 组名必须遵循 perl 标识符的规则,这意味着它们必须以非数字单词字符开头。此错误的常见原因是使用 (?&0) 而不是 (?0)。请参阅 perlre。
(F) ()-组以计数开头。计数应该在某些东西之后:模板字符或 ()-组。请参阅 "perlfunc 中的 pack"。
(F) perl -c
失败时的最终摘要消息。
(S 内部) 一个例程从一个应该已经存在的符号表中请求了一个符号,但由于某种原因它不存在,并且必须紧急创建以防止核心转储。
(F) 解析器在遇到 10 个错误后放弃了尝试解析程序。进一步的错误消息可能没有信息量。
(W 溢出) 十六进制浮点数的指数大于浮点数支持的指数。
(W overflow) 十六进制浮点数的指数小于浮点数支持的范围。在 IEEE 754 浮点数中,这也可能意味着正在使用次正规数(以前称为非正规数),这可能是或可能不是错误。
(F) 十六进制浮点数处理中出现严重错误。
(W overflow) 十六进制浮点数字面量的尾数(0x 和指数之间的部分,也称为分数或有效数字)位数超过了浮点数支持的范围。
(W overflow) 十六进制浮点数内部的数字位数超过了输出所能容纳的范围。这可能是由于不支持 long double 格式,或者由于 64 位整数不可用(在某些配置下需要检索数字)。
(F) 您已将 Perl 配置为使用 long double,但 long double 格式的内部结构未知;因此无法输出十六进制浮点数。
(W portable) 您指定的十六进制数大于 2**32-1 (4294967295),因此在不同系统之间不可移植。有关可移植性问题的更多信息,请参阅 perlport。
(F) Perl 将标识符(变量、函数等的名称)限制为约 250 个字符(对于简单名称),对于复合名称(如 $A::B
)则限制更长。您已超过了 Perl 的限制。未来的 Perl 版本可能会消除这些任意限制。
(W regexp) 命名 Unicode 字符转义(\N{...}
)可能会返回零长度序列。当这种转义在字符类中使用时,其行为没有明确定义。请检查是否使用了正确的转义,以及正确的 charname 处理程序是否在范围内。
(W digit) 这里 %s
是 "binary"、"octal" 或 "hex" 之一。您可能尝试使用除给定类型允许的数字以外的数字,例如二进制中仅使用 0 和 1。对于八进制,只有当非法字符是 '8' 或 '9' 时才会引发此错误。对于十六进制,'A' - 'F' 和 'a' - 'f' 是合法的。数字的解释在遇到错误的数字或字符之前停止。
(F) 您在二进制数中使用了除 0 或 1 以外的数字。
(W illegalproto) 在原型声明中发现了一个非法字符。原型中的 '_' 必须后跟一个 ';',表示其余参数是可选的,或者是一个 '@' 或 '%',因为这两个字符将接受 0 个或多个最终参数。
(F) Perl 通常将程序文本中的回车符视为其他空白符,这意味着当 Perl 使用标准选项构建时,您不应该看到此错误。由于某种原因,您的 Perl 版本似乎是在没有此支持的情况下构建的。请联系您的 Perl 管理员。
(F) 子程序签名中的参数在 $
、@
或 %
符号字符后包含意外字符。通常,符号字符后应紧跟变量名或 =
等。您是否尝试在 use feature 'signatures'
的作用域内使用原型?例如
sub foo ($$) {} # legal - a prototype
use feature 'signatures;
sub foo ($$) {} # illegal - was expecting a signature
sub foo ($a, $b)
:prototype($$) {} # legal
(W illegalproto) 在原型声明中发现非法字符。原型中允许的字符为 $、@、%、*、;、[、]、&、\ 和 +。您是否尝试编写子程序签名,但未首先启用该功能 (use feature 'signatures'
),因此您的签名被解释为错误的原型。
(F) 使用 sub
关键字构造匿名子程序时,必须始终指定代码块。请参阅 perlsub。
(F) 子程序声明不正确。请参阅 perlsub。
(F) 您尝试将数字除以 0。您的逻辑可能存在问题,或者您需要添加条件来防止无意义的输入。
(F) 您尝试将数字除以 0 以获取余数。大多数数字对此并不友好。
(F) vec() 中的位数(第三个参数)必须是 1 到 32(或 64,如果您的平台支持)的 2 的幂。
(F) 您在八进制数中使用了 8 或 9。
(F) 子程序签名中的参数后面不是 =
(引入默认值)、,
或 )
。
use feature 'signatures';
sub foo ($=1) {} # legal
sub foo ($a = 1) {} # legal
sub foo ($a += 1) {} # illegal
sub foo ($a == 1) {} # illegal
(F) 你写了类似以下内容:
(?+foo)
"+"
仅在后面跟着数字时有效,表示捕获组。参见 (?PARNO)
.
(F) 在 suidperl 下运行的脚本是非法的。
(X) PERL5OPT 环境变量只能用于设置以下开关:-[CDIMUdmtw]。
(F) 您在正则表达式模式中指定了一个类似 Unicode 的属性名称(使用 \p{}
或 \P{}
),Perl 知道它不是官方的 Unicode 属性,可能是用户定义的属性名称,但它不能是其中之一,因为它们必须以 In
或 Is
开头。检查拼写。另请参见 "找不到 Unicode 属性定义 "%s"".
(W internal) VMS 特有的警告。Perl 尝试读取 CRTL 的内部环境数组,并遇到一个没有 =
分隔符的元素,用于分隔键和值。该元素被忽略。
(W internal) VMS 特有的警告。Perl 尝试读取逻辑名称或 CLI 符号定义,以便迭代 %ENV,但没有看到键和值之间的预期分隔符,因此该行被忽略。
(W misc) 此前缀通常表示 DESTROY() 方法引发了指示的异常。由于析构函数通常在执行过程中的任意点由系统调用,并且通常会调用大量次,因此该警告仅针对会导致相同消息重复的任何数量的失败发出一次。
使用G_KEEPERR
标志分派的使用者回调失败也可能导致此警告。请参阅"perlcall 中的 G_KEEPERR"。
(S experimental::args_array_with_signatures) 在使用签名的子例程中发现了一个隐式涉及@_
参数数组的表达式。这是实验性的,因为参数数组和通过签名进行参数处理之间的交互在任何将来的 Perl 版本中都不保证保持稳定,因此应避免此类代码。
(F) (?[ ])
内存在语法错误。如果构造内部的表达式完全为空,或者运算符的数量过多或过少,则可能会发生这种情况。Perl 不够智能,无法为您提供更精确的错误指示。
(F) 给定类的解析顺序 (MRO) 不符合 C3 一致性,并且您已为此类启用 C3 MRO。有关更多信息,请参阅 mro 中的 C3 文档。
(F) 您有一个缩进的 here-document,其中其一行或多行开头有空格,与结束分隔符不匹配。
例如,下面的第 2 行是错误的,因为它没有至少 2 个空格,但第 1 行和第 3 行是正确的,因为它们至少有 2 个空格
if ($something) {
print <<~EOF;
Line 1
Line 2 not
Line 3
EOF
}
请注意,制表符和空格是严格比较的,这意味着 1 个制表符将不匹配 8 个空格。
(F) 您使用了一个模式,该模式引用自身而不消耗任何输入文本。您应该检查模式以确保递归模式要么消耗文本,要么失败。
(F) 用户定义属性 ("perlunicode 中的用户定义字符属性") 可以依赖于其他用户定义属性的定义。如果依赖关系链回到此属性,则会发生无限递归,如果不是因为引发此错误的检查。
重新组织您的属性定义以避免这种情况。
(F) 您尝试在正则表达式代码块中使用空模式,例如 /(?{ s!!! })/
,这会导致重新执行相同的模式,从而形成一个无限循环,最终通过抛出异常来中断。
(F) state
仅允许初始化单个变量,且不带括号。因此 state $a = 42
和 state @a = qw(a b c)
是允许的,但 state ($a) = 42
或 (state $a) = 42
不允许。要初始化多个 state
变量,请逐个初始化它们。
(W syntax) 在标量上下文中,您使用数组索引/值切片(用 % 表示)来选择数组中的单个元素。通常最好请求一个标量值(用 $ 表示)。区别在于 $foo[&bar]
始终像标量一样工作,无论是在返回值方面还是在评估其参数方面,而 %foo[&bar]
则为其下标提供列表上下文,如果期望只有一个下标,这可能会导致奇怪的行为。在列表上下文中调用时,它还会返回索引(&bar
返回的值)以及值。
(W syntax) 在标量上下文中,您使用哈希键/值切片(用 % 表示)来选择哈希中的单个元素。通常最好请求一个标量值(用 $ 表示)。区别在于 $foo{&bar}
始终像标量一样工作,无论是在返回值方面还是在评估其参数方面,而 @foo{&bar}
则为其下标提供列表上下文,如果期望只有一个下标,这可能会导致奇怪的行为。在列表上下文中调用时,它还会返回键以及值。
(F) 您尝试执行了污染机制不喜欢的事情。当您运行 setuid 或 setgid,或者显式指定 -T 来启用它时,污染机制就会被启用。污染机制会标记所有直接或间接来自用户的、被认为不可信的数据。如果此类数据用于“危险”操作,您就会收到此错误。有关更多信息,请参阅 perlsec。
(F) 如果 $ENV{PATH}
包含一个对所有人可写的目录,则您不能在 setuid 或 setgid 脚本中使用 system()、exec() 或管道打开。此外,PATH 必须不包含任何相对目录。请参阅 perlsec。
(F) 如果 $ENV{PATH}
、$ENV{IFS}
、$ENV{CDPATH}
、$ENV{ENV}
、$ENV{BASH_ENV}
或 $ENV{TERM}
来自用户提供(或可能提供)的数据,则您不能在 setuid 或 setgid 脚本中使用 system()、exec() 或管道打开。脚本必须使用可信数据将路径设置为已知值。请参阅 perlsec。
(F) Perl 在尝试编译包含对用户定义字符属性函数的调用的正则表达式时检测到污染数据,例如 \p{IsFoo}
或 \p{InFoo}
。请参阅 "perlunicode 中的用户定义字符属性" 和 perlsec。
(F) printf()
或 sprintf()
的格式字符串中指定的索引和宽度过大。数字不能超过您的体系结构的整数大小。
(S 溢出) 您以十六进制、八进制或二进制形式指定的数字(作为字面量或作为 hex() 或 oct() 的参数)对于您的体系结构来说太大,并且已转换为浮点数。在 32 位体系结构上,可表示的最大十六进制、八进制或二进制数字(不溢出)分别是 0xFFFFFFFF、037777777777 或 0b11111111111111111111111111111111。请注意,Perl 在内部会将所有数字透明地提升为浮点数表示形式,这可能会在后续操作中导致精度丢失错误。
(S 溢出) 您传递给 srand 的数字太大,无法容纳在您的体系结构的整数表示中。该数字已被替换为支持的最大整数(在 32 位体系结构上为 0xFFFFFFFF)。这意味着您可能获得的随机性比您预期的要少,因为超过最大值的不同的随机种子将返回相同的随机数序列。
(W 溢出) 版本初始化的某个部分对于您的体系结构的整数大小来说太大。这不是警告,因为没有合理的理由让版本尝试使用通常大于 2**32 的元素。这通常是由于尝试将一些奇特的数学运算用作版本造成的,例如 100/9。
(P) 正则表达式解析器出现严重错误。 <-- HERE 指示了在正则表达式中发现问题的位置。
(S) 这是 VMS 特有的警告。Perl 会跟踪你调用 fork
和 exec
的次数,以确定当前对 exec
的调用应该影响当前脚本还是子进程(参见 "perlvms 中的 exec LIST")。不知何故,这个计数变得混乱,因此 Perl 正在猜测并将此 exec
视为终止 Perl 脚本并执行指定命令的请求。
(S internal) Perl 处理 printf
和 sprintf
格式化的内部例程在从 C 或 XS 代码调用时遵循略有不同的规则集。具体来说,由数字后跟 "p"(例如,"%7p")组成的格式保留供将来使用。如果你看到此消息,则表示 XS 模块尝试使用其中一种保留格式调用该例程。
(P) 正则表达式解析器出现严重错误。 <-- HERE 指示了在正则表达式中发现问题的位置。
(W syntax) 你违反了以下规则:任何列表运算符后跟括号都会变成函数,所有列表运算符参数都在括号内找到。参见 "perlop 中的术语和列表运算符(左向)"。
(F) 在正则表达式模式中,此上下文中的双字符序列 "(?"
应该是一个不可分割的标记,"("
和 "?"
之间没有任何间隔,但你用空格将它们分开了。
(F) 在正则表达式模式中,此上下文中的两个字符序列 "(*"
应该是一个不可分割的标记,"("
和 "*"
之间没有任何间隔,但您将它们分开了。修复模式并重试。
(F) 子例程或变量的指定属性未被 Perl 或用户提供的处理程序识别。请参阅 attributes。
(F) 子例程或变量的指定属性未被 Perl 或用户提供的处理程序识别。请参阅 attributes。
(F) 您尝试为字符名创建自定义别名,使用 use charnames
的 :alias
选项,并且指定名称中的指定字符无效。请参阅 "CUSTOM ALIASES" in charnames。
(W syscalls) 从 5.20 开始,路径名或其他系统调用参数中的嵌入式 \0 字符会产生警告。以前,系统调用会忽略 \0 之后的各个部分。
(F) 只有某些字符对字符名有效。指定的字符无效。请参阅 "CUSTOM ALIASES" in charnames。
(W printf) Perl 不理解给定的格式转换。请参阅 "sprintf" in perlfunc。
(W regexp)(F) 值 < 256 的数字转义(例如 \xHH
)在从编码规范(由编码 pragma 指定)进行转换时,不对应于单个字符。转义被替换为替换字符 (U+FFFD),除了在 (?[ ])
中,在那里它是一个致命错误。 <-- HERE 显示了在正则表达式中发现转义的位置。
(F) 由 ...
表示的字符常量不是有效的十六进制数字。它要么为空,要么您尝试在十六进制数字中使用 0-9 或 A-F、a-f 之外的字符。
(F) perl 的 -m 和 -M 命令行选项的模块参数不能在模块名称中包含单个冒号,而只能在 '=' 后的参数中包含单个冒号。换句话说,-MFoo::Bar=:baz 是可以的,但 -MFoo:Bar=baz 不行。
(F) 您尝试了 mro::set_mro("classname", "foo")
或 use mro 'foo'
,其中 foo
不是有效的 MRO(方法解析顺序)。目前,唯一支持的有效 MRO 是 dfs
和 c3
,除非您加载了作为 MRO 插件的模块。参见 mro 和 perlmroapi。
(W utf8) 您向 chr
传递了一个负数。负数不是有效的字符编号,因此它返回 Unicode 替换字符 (U+FFFD)。
(F) 您为 -C 选项提供的数字要么有额外的前导零,要么超过了 perl 的无符号整数表示范围。
(S 调试) Perl 被调用时使用了无效的调试器标志。使用 -D 选项(不带任何标志)调用 perl 以查看可接受的值列表。另请参见 perlrun 中的 "-Dletters"。
(F) 该模式看起来像一个 {min,max} 量词,但 min 或 max 无法解析为有效数字 - 因为它有前导零,或者它表示的数字太大而无法处理。 <-- HERE 显示了在正则表达式中发现问题的位置。参见 perlre。
(F) 字符类中指定的范围的最小字符大于最大字符。一种可能性是您忘记了结束 \x{}
中的 {}
- 没有花括号的 \x
只能到 ff
。 <-- HERE 显示了在正则表达式中发现问题的位置。参见 perlre。
(F) tr/// 或 y/// 运算符中指定的范围的最小字符大于最大字符。参见 perlop。
(F) 您指定的捕获组不可能存在,因为您使用的数字不在此机器上可能的合法值范围内。
(F) 在属性列表的元素之间看到了冒号或空格以外的东西。如果前面的属性有带括号的参数列表,那么该列表可能过早地终止了。参见 attributes。
(W 层) 将层推送到 Perl I/O 系统时,在层列表的元素之间看到了冒号或空格以外的字符。如果上一个属性具有带括号的参数列表,则该列表可能过早终止。
(F) 版本号不符合版本的“严格”标准。一个“严格”的版本号是一个正十进制数(整数或十进制小数),没有指数,或者是一个带点十进制的 v 字符串,以 'v' 字符开头,至少包含三个部分。括号中的文本指示哪些标准未满足。有关允许的版本格式的更多详细信息,请参阅 version 模块。
(F) 给定的字符不是有效的 pack 或 unpack 类型。请参阅 "pack" in perlfunc。
(W) 给定的字符不是有效的 pack 或 unpack 类型,但以前会被静默忽略。
(F) 版本号不符合版本的“宽松”标准。一个“宽松”的版本号是一个正十进制数(整数或十进制小数),没有指数,或者是一个带点十进制的 v 字符串。如果 v 字符串少于三个部分,则它必须以 'v' 字符开头。否则,开头的 'v' 是可选的。十进制和带点十进制版本都可以在小数或带点十进制部分之后添加一个下划线字符分隔的尾部“alpha”部分。括号中的文本指示哪些标准未满足。有关允许的版本格式的更多详细信息,请参阅 version 模块。
(F) 版本对象的内部结构无效。可能是内部结构以某种方式直接修改,或者将任意引用祝福到“version”类中。
(F) 你写了类似以下内容:
qr/\P{name=KATAKANA LETTER AINU P}/
qr/[^\p{name=KATAKANA LETTER AINU P}]/
此名称实际上计算为两个片假名字符的序列,而不仅仅是一个字符,尝试取序列的补集是非法的。(从数学上讲,这意味着任何长度为 0 到无穷大的字符序列,只要不是这两个字符连续出现,这可能没有实际用途。)
(F) 在正则表达式模式中,此上下文中出现的两个字符序列 "(*"
应该是一个不可分割的标记,在 "("
和 "*"
之间没有任何间隔,但您将它们分开了。
(F) 您的机器似乎没有实现 ioctl(),对于支持 C 的机器来说这很奇怪。
(W unopened) 您尝试在从未打开的文件句柄上调用 ioctl()。请检查您的控制流和参数数量。
(F) 您的 Perl 没有配置为使用 PerlIO,因此您无法使用 IO 层。要使用 PerlIO,Perl 必须使用 'useperlio' 进行配置。
(F) 您的机器没有实现 sockatmark() 功能,既不是作为系统调用,也不是作为 ioctl 调用 (SIOCATMARK)。
(F) 您使用了 \b{...}
或 \B{...}
,而 ...
对 Perl 来说是未知的。当前有效的选项在 perlrebackslash 中的 "\b{}, \b, \B{}, \B" 中给出。
(F) sysread()、recv()、syswrite() 和 send() 运算符不允许在具有 :utf8
层的句柄上使用,无论是显式还是隐式,例如,使用 :encoding(UTF-16LE)
层。
以前 sysread() 和 recv() 当前仅使用流的 :utf8
标志,忽略实际的层。由于 sysread() 和 recv() 没有进行 UTF-8 验证,因此它们最终可能会创建编码不正确的标量。
类似地,syswrite() 和 send() 仅使用 :utf8
标志,否则忽略任何层。如果设置了该标志,两者都会以 UTF-8 编码写入值,即使该层是其他编码,例如上面的示例。
理想情况下,所有这些运算符都应该完全忽略 :utf8
状态,只处理字节,但这会导致现有代码静默失效。
(W regexp) (仅在 use re 'strict'
或 (?[...])
内)
您指定了一个字符,它有更简单的写法,并且可以移植到运行不同字符集的平台上。
(F) 特殊变量 $*
在旧版本的 Perl 中已被弃用,在 5.10.0 中被移除,不再受支持,并且在 Perl 5.30 中会导致致命错误。在之前的 Perl 版本中,使用 $*
可以启用或禁用字符串中的多行匹配。
您应该使用 /m
(可能还有 /s
)正则表达式修饰符来代替 $*
。您可以使用 use re '/m'
为词法作用域(甚至整个文件)启用 /m
。(在旧版本中:当 $*
设置为真值时,所有正则表达式都表现得好像它们是用 /m
编写的。)
在 Perl 5.30 中,使用此变量将导致致命错误。
(F) 特殊变量 $#
在旧版本的 Perl 中已被弃用,在 5.10.0 中被移除,不再受支持,并且在 Perl 5.30 中会导致致命错误。您应该使用 printf/sprintf 函数来代替。
(W overload) overload::constant 的第二个(第四个,第六个,...)参数需要是一个代码引用。可以是匿名子程序,也可以是子程序的引用。
(W overload) 您尝试重载 overload 包不知道的常量类型。
(F) 尝试使用 builtin pragma 模块为未知函数名创建词法别名。
(S inplace) 命令行中传递了 -i
选项,表明脚本旨在就地编辑文件,但没有给出任何文件。这通常是一个错误,因为就地编辑 STDIN 没有意义,并且可能令人困惑,因为它可能使 Perl 看起来好像挂起了,而实际上它只是试图从 STDIN 读取。您应该传递要编辑的文件名,或者从命令行中删除 -i
。有关更多详细信息,请参见 perlrun。
(P) 正则表达式解析器出现错误。
(F) 您的正则表达式在先行断言或后行断言中使用了 \K
,目前不允许这样做。
这在将来可能会改变,请参阅 Support \K in lookarounds。
(F) 您为要跳出的循环命名了标签,但您当前不在该名称的循环中,即使您计算了调用您的位置也是如此。请参阅 "last" in perlfunc。
(F) 您为要继续的循环命名了标签,但您当前不在该名称的循环中,即使您计算了调用您的位置也是如此。请参阅 "last" in perlfunc。
(F) 您为要重新启动的循环命名了标签,但您当前不在该名称的循环中,即使您计算了调用您的位置也是如此。请参阅 "last" in perlfunc。
(F) 在 use filetest
pragma 下,切换真实和有效 uid 或 gid 失败。
(F) 在解包时,当 unpack 长度/代码组合尝试获取更多数据时,字符串缓冲区已被使用完毕。这会导致长度的值未定义。请参阅 "pack" in perlfunc。
(W syntax) 您在数组或哈希上使用了 length(),而您可能想要的是元素数量。
数组大小可以通过以下方式获取
scalar(@array);
哈希中的元素数量可以通过以下方式获取
scalar(keys %hash);
(F) 扩展试图将文本插入当前解析(使用 lex_stuff_pvn 或类似方法),但试图插入一个不能作为当前输入一部分的字符。这是填充机制的固有缺陷,也是避免它的原因之一。在必须填充的情况下,建议只填充纯 ASCII 字符。
(F) 由扩展提供的词法分析代码以可检测的方式违反了词法分析器的 API。
(W closed) 您尝试在已关闭的套接字上执行 listen 操作。您是否忘记检查 socket() 调用的返回值?请参见 "perlfunc 中的 listen"。
(F) 在某些平台上,特别是 Windows,open
的三参数或更多参数形式不支持管道,例如 open($pipe, '|-', @args)
。请改用两参数 open($pipe, '|prog arg1 arg2...')
形式。
(F) (仅在 use re 'strict'
或 (?[...])
中)
您可能忘记了 /x
修饰符,或者模式中存在拼写错误。例如,您是否真的想匹配换页符?如果是,所有 ASCII 垂直空格控制字符都可以用转义序列表示,这些转义序列不会像您的模式在显示时那样出现令人不快的外观。
\r carriage return
\f form feed
\n line feed
\cK vertical tab
(P) 正在加载到进程中的动态加载库 .so
或 .dll
是针对与该库编译时不同的 Perl 版本构建的。重新安装 XS 模块可能会解决此错误。
(W 本地化) 您正在使用名为 UTF-8 的本地化设置。UTF-8 本地化设置预计具有非常特殊的行为,大多数本地化设置都符合预期。当 Perl 发现一些偏离预期的行为时,就会出现此消息,并通知您预期行为会覆盖这些差异。在某些情况下,这些差异是由本地化设置定义有缺陷造成的,但此警告最常见的原因是,在遵循标准时存在歧义和冲突,而本地化设置选择了一种与 Perl 不同的方法。
其中一个原因是,与声称相反,Unicode 并非完全与本地化设置无关。土耳其语和一些相关语言有两种类型的 "I"
字符。一种是大写和小写都带点的,另一种是大写和小写都不带点的。Unicode 允许本地化设置使用土耳其规则,或使用所有其他情况下的规则,在所有其他情况中,只有一种类型的 "I"
,它在大写时不带点,在小写时带点。Perl 内核(尚未)处理土耳其语情况,此消息会警告您这一点。相反,Unicode::Casing 模块允许您主要实现土耳其语大小写规则。
另一个常见原因是这些字符:
$ + < = > ^ ` | ~
这些字符有问题。C 标准规定,在 C 本地化设置中,这些字符应被视为标点符号(POSIX 标准遵循 C 标准),而 Unicode 通常被认为是 C 本地化设置的超集。但 Unicode 添加了一个额外的类别“符号”,并将这些特定字符归类为符号。大多数 UTF-8 本地化设置将它们视为标点符号,因此 ispunct(3) 对它们返回非零值。但一些本地化设置让它返回 0。Perl 采用第一种方法,根本不使用 ispunct()
(参见 perlrecharclass 中的注释 [5]),此消息会提醒您,您获得的是 Perl 的方法,而不是本地化设置的方法。
(S 本地化) Perl 不支持命名的本地化设置,使用它会导致未定义的行为,包括可能导致计算机崩溃。
目前,唯一会生成此严重警告的本地化设置是非 UTF-8 本地化设置,这些本地化设置的字符需要多个字节来表示(在较旧的东亚语言本地化设置中很常见)。参见 perllocale。
(W locale) 您正在使用命名的区域设置,它是非 UTF-8 区域设置,Perl 已经确定它与它可以处理的内容不完全兼容。第二个 %s
给出了原因。
迄今为止最常见的原因是区域设置中包含用多个字节表示的字符。Perl 可以处理的唯一此类区域设置是 UTF-8 区域设置。最有可能的是,指定的区域设置是非 UTF-8 区域设置,用于中文或日语等东亚语言。如果区域设置是 ASCII 的超集,则其 ASCII 部分可能在 Perl 中工作。
一些基本上已过时的区域设置,它们不是 ASCII 的超集,主要是那些在 ISO 646 或其他 7 位区域设置中的区域设置,例如 ASMO 449,也会出现问题,具体取决于区域设置更改了 ASCII 字符集的哪些部分,以及程序也使用了哪些部分。警告消息列出了可确定的冲突字符。
请注意,并非所有不兼容性都会被发现。
如果发生这种情况,您几乎无能为力,只能切换到使用其他区域设置或使用 Encode 将区域设置转换为 UTF-8;如果这不可行,则已警告您某些内容可能会中断。
每当在 use locale
的范围内切换到不良区域设置时,或者如果 use locale
继承了不良区域设置,则此消息将输出一次。对于来自 POSIX 模块的任何操作,都不会引发此消息。
(W overflow) 您使用它无法处理的数字调用了 localtime
:太大、太小或 NaN。返回的值为 undef
。
(W overflow) 您使用大于它可以可靠处理的数字调用了 localtime
,并且 localtime
可能返回了错误的日期。此警告也会在使用 NaN(特殊的非数字值)时触发。
(W 溢出) 您使用了一个小于 `localtime` 可可靠处理的数字调用了 `localtime`,并且 `localtime` 可能返回了错误的日期。
(F) 目前对后顾可以处理的字符串长度有限制。此限制可能会在将来的版本中放宽。
(W 不精确) 您尝试将一个值增加或减少 1,但结果对于底层浮点表示来说太大而无法准确存储。因此,`++` 或 `--` 的目标被增加了或减少了与 1 相差很大的值,例如零(即目标保持不变)或二,这是由于舍入造成的。Perl 发出此警告是因为它已经从整数切换到浮点数,因为值对于整数来说太大,而现在即使浮点数也不够用。您可能希望显式地切换到使用 Math::BigInt。
(W io) 您尝试对文件句柄执行 lstat。您的意思是?lstat() 仅对文件名有意义。(Perl 对文件句柄执行了 fstat()。)
(W misc) 虽然 attributes.pm 允许这样做,但在已定义的 Perl 子例程上打开或关闭 lvalue 属性并不总是能正常工作。它可能或可能不会按您的意愿执行,具体细节取决于子例程内部的代码,具体细节可能会在不同 Perl 版本之间发生变化。只有在您真正了解自己在做什么的情况下才这样做。
(W misc) 不允许使用 `:lvalue` 声明语法在定义 Perl 子例程后将其设为 lvalue 子例程。要将子例程设为 lvalue 子例程,请在定义中添加 lvalue 属性,或在定义之前放置 `sub foo :lvalue;` 声明。
另请参见 attributes.pm。
(F) 您将一个魔法数组分配给了一个 stash 元素,然后尝试使用同一个槽中的子例程。您要求 Perl 做一些它无法做到的事情,细节可能会在 Perl 版本之间发生变化。
(F) 包含数字重复计数的方括号之间只允许出现数字。请参阅 "perlfunc 中的 pack"。
(F) 包含数字重复计数的方括号之间只允许出现数字。请参阅 "perlfunc 中的 pack"。
(F) OS/2 特有的错误。PERLLIB_PREFIX 应采用以下形式
prefix1;prefix2
或 prefix1 prefix2
其中 prefix1 和 prefix2 不为空。如果 prefix1
确实是内置库搜索路径的前缀,则会替换 prefix2。如果找不到组件或组件过长,则可能会出现此错误。请参阅 perlos2 中的“PERLLIB_PREFIX”。
(F) 您尝试使用原型格式错误的函数。函数原型的语法会进行简短的编译时检查,以查找明显的错误,例如无效字符。当调用函数时,会进行更严格的检查。也许函数的作者试图编写一个子例程签名,但没有先启用该功能(use feature 'signatures'
),因此签名被解释为一个错误的原型。
(S utf8)(F) Perl 检测到一个应该为 UTF-8 的字符串,但它不符合 UTF-8 编码规则,或者表示一个代码点,其序数值不适合当前平台的字长(溢出)。有关确切格式错误的详细信息,请参阅消息中的变量 %s
。
一个可能的原因是您自己为数据设置了 UTF8 标志,而您认为该数据是 UTF-8,但实际上并非如此(例如,它是传统 8 位数据)。为了防止这种情况,您可以使用 Encode::decode('UTF-8', ...)
。
如果您使用:encoding(UTF-8)
PerlIO 层进行输入,无效字节序列将被优雅地处理,但如果您使用:utf8
,则该标志将在不验证数据的情况下设置,这可能会导致此错误消息。
另请参阅 "Encode 中的处理格式错误的数据"。
(F) charnames 处理程序返回了格式错误的 UTF-8。
(F) 此消息表明 Perl 核心或 XS 代码中存在错误。此类代码试图找出据称以 UTF-8 内部编码存储的字符是否属于给定类型,例如是否为标点符号或数字。但该字符未以合法的 UTF-8 编码。%s
被替换为一个字符串,可以由有经验的人员用来确定正在检查的类型。
在 Perl 5.18 中,传递格式错误的字符串已被弃用,并在 Perl 5.26 中变为致命错误。
(F) 您尝试解包不符合 UTF-8 编码规则的内容,perl 无法猜测如何继续进行。
(F) 您尝试打包不符合 UTF-8 编码规则的内容,perl 无法猜测如何继续进行。
(F) 您尝试解包不符合 UTF-8 编码规则的内容,perl 无法猜测如何继续进行。
(F) Perl 认为它正在读取 UTF-16 编码的字符数据,但在执行此操作时,Perl 遇到了格式错误的 Unicode 代理。
(F) 在子程序签名中,你写了类似 "$a = undef, $b" 的代码,使前面的参数可选,后面的参数必填。参数是从左到右填充的,因此调用者无法省略前面的参数并传递后面的参数。如果你想让参数看起来是从右到左填充的,请将最右边的参数声明为可选,然后在子程序体中重新排列参数。
(S non_unicode) Perl 允许字符串包含 Unicode 代码点的超集;每个代码点可以与系统上带符号整数所能存储的最大值一样大,但其他语言/系统可能无法接受这些代码点。当你在包含此类代码点的字符串上匹配正则表达式模式时,就会出现此消息,并且该代码点与 Unicode 属性 \p{...}
或 \P{...}
匹配。Unicode 属性仅在 Unicode 代码点上定义,因此此匹配的结果由 Unicode 未定义,但 Perl(从 v5.20 开始)将非 Unicode 代码点视为典型的未分配 Unicode 代码点,并相应地匹配了此代码点。在 "perluniprops 中通过 \p{} 和 \P{} 访问的属性" 中指定了这些代码点是否与给定属性匹配。
如果代码点是 Unicode 与否对匹配结果无关紧要,则会抑制此消息(除非它已被设为致命)。例如,属性 \p{ASCII_Hex_Digit}
只能匹配 22 个字符 [0-9A-Fa-f]
,因此显然所有其他代码点(无论是否为 Unicode)都不会与它匹配。(而 \P{ASCII_Hex_Digit}
将匹配除这 22 个字符之外的每个代码点。)
收到此消息表明匹配的结果可能应该与实际发生的结果相反。如果你认为情况确实如此,你可能希望将 non_unicode
警告类别设为致命;如果你同意 Perl 的决定,你可能希望关闭此类别。
有关更多信息,请参阅 "perlunicode 中的 Unicode 代码点之外"。
(W regexp) 如果你指定的模式没有被正则表达式引擎专门检查,它将是一个无限循环。 <-- HERE 显示了在正则表达式中发现问题的位置。参见 perlre。
(F) Perl 由于挂起的信号数量过多而中止。这通常表明您的操作系统尝试过快地传递信号(以非常高的优先级),导致 perl 进程无法获得处理信号所需的资源,从而无法安全地处理信号。(参见 "Deferred Signals (Safe Signals)" in perlipc。)
(W) 此警告可能是由于通过 perl4 解释器运行 perl5 脚本造成的,尤其是当被警告的单词是 "use" 或 "my" 时。
(F) 您不能通过提供校验和来打包字符串,因为校验和过程会丢失信息,您无法反向操作。参见 "unpack" in perlfunc。
(F) 尝试在重载表中指定一个条目,该条目无法解析为有效的子例程。参见 overload。
(S experimental::class) 如果您使用 use feature 'class'
的 method
关键字,则会发出此警告。此关键字目前处于实验阶段,其行为可能会在将来的 Perl 版本中发生变化。
参见 "500 服务器错误"。
(W redefine) 您重新定义了一个方法。要抑制此警告,请说
{
no warnings 'redefine';
*name = method { ... };
}
(S) 一条建议,表明之前的错误可能是由于字符串或模式缺少分隔符造成的,因为它最终在当前行的前面结束。
(F) 无法解析打包模板,因为无法匹配 [...]
或 (...)
对。请参阅 "perlfunc 中的 pack"。
(W syntax) 数字常量中的下划线(下划线)没有分隔两个数字。
(F) 在格式字符串中使用了 %n
,但没有相应的参数供 perl 将当前字符串长度写入。
(W missing) 您调用了一个函数,其参数少于您提供的其他参数指示的所需参数。
目前仅在 printf 类型的格式需要比提供的参数更多的参数时发出,但将来可能会用于其他情况,例如,我们可以静态确定函数的参数是否缺失,例如 "perlfunc 中的 pack" 函数。
(F) 指示的命令行开关的参数必须紧跟在开关之后,中间不能有空格。
(F) 双引号上下文中的字符名称字面量 \N{charname}
语法错误。当正则表达式使用 /x
修饰符时,\N
和 {
之间存在空格(或注释)时,也会发生这种情况。此修饰符不会改变花括号必须紧跟在 \N
之后的规定。
(F) 在双引号上下文中,\o
必须紧跟一个 {
。
(F) 虽然某些函数允许你在参数列表之前指定文件句柄或“间接对象”,但这个函数不行。
(W pipe) 你使用了 open(FH, "| command")
或 open(FH, "command |")
结构,但命令缺失或为空。
(F) 双引号字符串以 "\c" 结尾,缺少所需的控制字符名称。
(W illegalproto) 分组以 [
开始,但从未以 ]
结束。
(F) 词法作用域子例程的语法要求它们有一个名称,以便可以找到它们。
(F) 看起来你一直在用 csh 编程太多。在 Perl 中,变量总是用 $ 来表示,不像在 shell 中,它可能在一行到下一行之间变化。
(S syntax) 这是与消息 "%s found where operator expected" 结合在一起的推测。通常缺少的运算符是逗号。
(F) 你尝试使用 require
或 do
调用,但没有参数或使用未定义的值作为参数。Require 期望参数为包名或文件规范;do 期望参数为文件名。请参阅 "require EXPR" in perlfunc 和 "do EXPR" in perlfunc。
(F) %{^HOOK}{require__before}
钩子使用空字符串和未定义的值重写了使用 require
或 do
编译的文件的名称,这是禁止的。请参阅 "%{^HOOK}" in perlvar 和 "require EXPR" in perlfunc。
(F) \x{...}
、\p{...}
、\P{...}
或 \N{...}
中缺少右大括号。
(F) \N
有两种含义。
传统意义上,它后面跟着一个用大括号括起来的名称,表示该名称所代表的字符(或字符序列)。因此,\N{ASTERISK}
是 *
的另一种写法,在双引号字符串和正则表达式模式中都有效。在模式中,它没有与未转义的 *
相同的含义。
从 Perl 5.12.0 开始,\N
在模式中也具有额外的含义(仅限于此),即匹配非换行符。(这是 [^\n]
的简写,与 .
相似,但不受 /s
正则表达式修饰符的影响。)
这会导致一些歧义。当 \N
后面没有立即跟着左大括号时,Perl 假设 [^\n]
含义。此外,如果大括号形成一个有效的量词,例如 \N{3}
或 \N{5,}
,Perl 假设这意味着匹配给定数量的非换行符(在这些示例中,分别为 3;和 5 或更多)。在所有其他情况下,如果存在 \N{
和匹配的 }
,Perl 假设需要字符名称。
但是,如果没有匹配的 }
,Perl 就不知道它是被错误地省略了,还是需要 [^\n]{
,并会引发此错误。如果您指的是前者,请添加右大括号;如果您指的是后者,请用反斜杠转义大括号,如下所示:\N\{
(F) 词法分析器计算出的左大括号或方括号数量多于右大括号或方括号数量。一般来说,您会发现它缺少您上次编辑的位置附近。
(S 语法) 这是与消息“%s 位于预期运算符的位置”结合在一起的推测。不要仅仅因为看到了此消息就在上一行自动添加分号。
(F) 您直接或间接尝试更改常量的值。当然,您没有尝试“2 = 1”,因为编译器会捕获它。但是,一个简单的方法是
sub mod { $_[0] = 1 }
mod(2);
另一种方法是分配给字符串末尾的 substr()。
另一种方法是将 foreach
循环的 VAR 分配给 VAR,而 VAR 在循环 LIST 中与常量别名。
$x = 1;
foreach my $n ($x, 2) {
$n *= 2; # modifies the $x, but fails on attempt to
} # modify the 2
PerlIO::scalar 如果您尝试打开只读标量以进行写入,也会产生此消息作为警告。
(F) 您尝试使数组值突然出现,并且下标可能为负数,即使从数组末尾反向计数也是如此。
(P) 您尝试使哈希值突然出现,但由于某些特殊原因无法创建。
(F) 只有裸模块名称才允许作为 "use" 的第一个参数。
(F) -M
或 -m
选项表示 Perl 应该加载一些模块,但您省略了模块的名称。有关 -M
和 -m
的完整详细信息,请参阅 perlrun。
(F) open
函数被要求打开多个文件。如果您尝试打开一个管道到接受参数列表的命令,但忘记指定管道打开模式,则可能会发生这种情况。有关详细信息,请参阅 "perlfunc 中的 open"。
(S) 您使用 -DPERL_DEBUG_READONLY_COW 编译了 perl(请参阅 "perlguts 中的 Copy on Write"),但无法将共享字符串缓冲区设为只读。
(S) 您使用 -DPERL_DEBUG_READONLY_OPS 编译了 perl(请参阅 perlhacktips),但无法将操作树设为只读。
(S) 您使用 -DPERL_DEBUG_READONLY_COW 编译了 perl(请参阅 "perlguts 中的 Copy on Write"),但无法将只读共享字符串缓冲区设为可变。
(S) 您使用 -DPERL_DEBUG_READONLY_OPS 编译了 perl(请参阅 perlhacktips),但在释放操作之前无法将只读操作树设为可变。
(F) 您的系统上没有 System V 消息 IPC。
(F) 您在 no feature "multidimensional";
下为哈希查找提供了一个下标列表,例如
$z = $foo{$x, $y};
默认情况下,它就像
$z = $foo{join($;, $x, $y)};
(W syntax) 多维数组不像 $foo[1,2,3]
那样写。它们像 C 语言一样写成 $foo[1][2][3]
。
(F) 在子程序签名中,贪婪参数 (@
或 %
) 必须是最后一个参数,并且不能超过一个;例如
sub foo ($a, @b) {} # legal
sub foo ($a, @b, %) {} # invalid
(F) 您的 unpack 模板包含一个 '/',但它没有遵循产生数值的某些 unpack 规范。请参阅 "perlfunc 中的 pack"。
(F) 转写 (tr///
和 y///
) 转写单个字符。但命名序列的定义不仅仅是一个字符,因此对它进行此操作没有意义。
(F) 词法作用域子程序尚未实现。请勿尝试这样做。
(F) 词法作用域子程序不在包中,因此尝试在前面使用包限定符声明它没有意义。
(W 语法) 包变量 $a 和 $b 用于排序比较。您在排序比较块中使用 $a 或 $b 作为 <=>
或 cmp
运算符的操作数,并且该变量之前已声明为词法变量。要么使用包名限定排序变量,要么重命名词法变量。
(F) 词法作用域变量不在包中,因此尝试使用包限定符在前面声明一个词法作用域变量没有意义。如果您想本地化一个包变量,请使用 local()。
(W 一次) 拼写错误通常表现为唯一的变量名。如果您有充分的理由使用唯一的名称,那么只需以某种方式再次提及它即可抑制消息。our
声明也为此目的提供。
注意:此警告检测仅使用过一次的包符号。这意味着词法变量永远不会触发此警告。这也意味着所有包变量 $c、@c、%c 以及 *c、&c、sub c{}、c() 和 c(文件句柄或格式)都被视为相同;如果程序只使用 $c 一次,但也使用其他任何一个,则不会触发此警告。以下划线开头的符号和使用特殊标识符的符号(参见 perldata)不受此警告的影响。
(F) 在 (?[ ])
中,所有解释为八进制的常量都需要正好 3 位长。这有助于捕获一些歧义。如果您的常量太短,请添加前导零,例如
(?[ [ \078 ] ]) # Syntax error!
(?[ [ \0078 ] ]) # Works
(?[ [ \007 8 ] ]) # Clearer
此结构可以表达的最大数字是 \777
。如果您需要更大的数字,则需要使用 \o{}。如果您指的是两个不同的东西,则需要将它们分开
(?[ [ \7776 ] ]) # Syntax error!
(?[ [ \o{7776} ] ]) # One meaning
(?[ [ \777 6 ] ]) # Another meaning
(?[ [ \777 \006 ] ]) # Still another
(F) 从长度/代码解包操作中获得的长度计数为负数。参见 "perlfunc 中的 pack"。
(F) 您尝试使用小于 0 的缓冲区长度执行读/写/发送/接收操作。这很难想象。
(F) 当在左值上下文中调用 vec
时,第二个参数必须大于或等于零。
(W numeric) 您尝试执行 x
重复运算符少于 0 次,这是没有意义的。
(F) 您不能在没有括号的情况下对量词进行量化。因此,像 ** 或 +* 或 ?* 之类的东西是非法的。 <-- HERE 显示了在正则表达式中发现问题的位置。
请注意,最小匹配量词 *?
、+?
和 ??
似乎是嵌套量词,但实际上并非如此。参见 perlre。
(S internal) 相关符号已声明,但不知何故在它可能被使用之前就超出了作用域。
(F) next::method
需要在真实包中真实方法的上下文中调用,它无法找到这样的上下文。参见 mro。
(F) \N
的新含义(从 Perl 5.12 开始)为 [^\n]
,在方括号字符类中无效,原因与 .
在字符类中失去特殊性相同:它匹配几乎所有内容,这可能不是你想要的。
(F) 命名的 Unicode 字符转义(\N{...}
)可能会返回一个多字符序列。即使字符类应该只匹配一个输入字符,perl 也会正确匹配整个序列,除了在某些情况下。目前这些情况是
(F) 某些操作被认为对 setuid 或 setgid 脚本来说太不安全,甚至不允许尝试。一般来说,会有另一种方法可以实现你想要的功能,即使它不安全,至少也是可安全的。请参阅 perlsec。
(F) Perl 的-e 和-E 命令行选项需要一个参数。如果你想运行一个空程序,请将空字符串作为单独的参数传递,或者运行一个包含单个 0 或 1 的程序。
perl -e ""
perl -e0
perl -e1
(F) 带有文件句柄或“间接对象”的列表运算符不允许在该句柄和后续参数之间使用逗号。否则它将只是另一个参数。
这可能的原因是,你期望使用use 或import 将一个常量导入到你的命名空间中,但没有进行这样的导入,例如,你的操作系统可能不支持该特定的常量。希望你对期望看到的常量使用了显式导入列表;请参阅 "use" in perlfunc 和 "import" in perlfunc。虽然显式导入列表可能会在早期捕获此错误,但它自然无法解决你的操作系统仍然不支持该常量的事实。也许你在use 或import 的符号导入列表的常量中,或者在触发此错误的行中的常量名称中存在拼写错误?
(F) 这是 VMS 特有的错误。Perl 处理自己的命令行重定向,并在命令行末尾找到了一个 '|',因此它不知道你想要将此命令的输出管道传输到哪里。
(F) 当前正在执行的代码是用-d 开关编译的,但由于某种原因,当前调试器(例如 perl5db.pl 或 Devel::
模块)没有定义要在每个语句开始时调用的例程。
(P) 这被视为内部错误,因为现在每台机器都应该提供 dbm,因为 Perl 附带了 SDBM。请参阅 SDBM_File.
(F) 当前正在执行的代码是用-d 开关编译的,但由于某种原因,当前调试器(例如 perl5db.pl 或 Devel::
模块)没有定义要在每个普通子程序调用开始时调用的 DB::sub
例程。
(F) 在 0x
后未找到十六进制数字,或在 0b
后未找到二进制数字。
(F) -I 命令行开关需要一个目录名作为同一参数的一部分。例如,使用 -Ilib。-I lib 不会起作用。
(F) VMS 特有的错误。Perl 处理自己的命令行重定向,并在命令行中找到了 '2>' 或 '2>>',但找不到要写入 stderr 数据的文件名。
(F) pack 或 unpack 模板有一个开头的 '(' 或 '[',但没有匹配的对应项。请参阅 "perlfunc 中的 pack"。
(F) VMS 特有的错误。Perl 处理自己的命令行重定向,并在命令行中找到了 '<',但找不到要从中读取 stdin 数据的文件名。
(F) next::method
在此类 MRO 的剩余包中未找到此方法名的更多实例。如果您不希望它抛出异常,请使用 maybe::next::method
或 next::can
。请参阅 mro。
(W numeric) 您尝试执行 x
重复运算符 Inf
(或 -Inf
)或 NaN
次,这是没有意义的。
(F) 在正则表达式中,在需要十六进制字符的地方出现了一个非十六进制字符,例如
(?[ [ \xDG ] ])
(?[ [ \x{DEKA} ] ])
(W digit) 在解析十六进制数字常量时,意外遇到一个非十六进制字符。结果值如所示。
请注意,在花括号内,从第一个非十六进制字符开始到结束花括号的所有字符都会被忽略。
(F) 在正则表达式中,在预期为八进制字符的位置出现了一个非八进制字符,例如
(?[ [ \o{1278} ] ])
(W digit) 在解析八进制数字常量时,意外遇到一个非八进制字符。结果值如所示。
当不使用 \o{...}
时,您在双引号字符串中写了类似 \08
或 \179
的内容。解析结果如所示,除了最后一个数字之外的所有数字都被视为一个以八进制表示的单个字符。最后一个数字是字符串中的下一个字符。要告诉 Perl 这确实是您想要的,您可以使用 \o{ }
语法,或者使用正好三个数字来指定字符的八进制表示。
请注意,在花括号内,从第一个非八进制字符开始到结束花括号的所有字符都会被忽略。
(F) "no" 关键字在编译时被识别并执行,并且不返回任何有用的值。请参阅 perlmod。
(W misc) 一个数字作为位掩码参数传递给 select()。使用 vec() 函数为 select 构造文件描述符位掩码。请参阅 "select" in perlfunc。
(F) VMS 特有的错误。Perl 处理自己的命令行重定向,并在命令行末尾发现了一个单独的 '>',因此它不知道您要将 stdout 重定向到哪里。
(F) VMS 特有的错误。Perl 处理自己的命令行重定向,并在命令行中发现了一个 '>' 或 '>>',但无法找到要写入 stdout 数据的文件名。
(F) 在 "our" 声明中不允许使用完全限定的子程序和变量名,因为这在现有规则下没有意义。这种语法保留用于未来的扩展。
(F) 您调用了 perl -x
,但在文件中未找到以 #! 开头且包含 "perl" 一词的行。
(F) Configure 未找到与您的系统上的 setregid() 调用相似的任何内容。
(F) Configure 未找到与您的系统上的 setreuid() 调用相似的任何内容。
(F) 您在 "my"、"our" 或 "state" 声明中提供了类限定符,但此类在您程序中的此位置不存在。
(F) 您尝试通过指示的类型化变量访问哈希中的键,但该键不受相同类型的包允许。指示的包已使用 fields 准则限制了允许键的集合。
(F) 您指定了一个 Perl 未识别的信号钩子。目前,Perl 接受 __DIE__
和 __WARN__
作为有效的信号钩子。
(P) VMS 特有的错误。内部例程 my_pclose() 尝试关闭一个未打开的管道。这应该在早期被捕获为尝试关闭一个未打开的文件句柄。
(W signal) 您在 %SIG 中指定了一个信号名称作为下标,但该名称未被识别。在您的 shell 中输入 kill -l
以查看系统上的有效信号名称。
(W regexp) 您为 Unicode 属性值指定了一个通配符,但在当前 Unicode 版本中没有与之匹配的属性值。请检查您的拼写。
(F) Perl 试图评估对代码值的引用(即子程序),但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。另请参见 perlref。
(F) Perl 试图评估对“typeglob”(即类似于 *foo
的符号表条目)的引用,但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。参见 perlref。
(F) Perl 试图评估对哈希值的引用,但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。参见 perlref。
(F) 在子程序签名定义中,紧跟在符号($
、@
或 %
)后的注释需要用空格或逗号等分隔,特别是为了避免与 $#
变量混淆。例如
# bad
sub f ($# ignore first arg
, $b) {}
# good
sub f ($, # ignore first arg
$b) {}
(F) Perl 试图评估对数组值的引用,但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。参见 perlref。
(F) Perl 试图评估对标量值的引用,但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。参见 perlref。
(F) Perl 试图评估对代码值的引用(即子程序),但发现引用的是其他东西。您可以使用 ref() 函数来找出它到底是什么类型的引用。另请参见 perlref。
(F) 尝试在重载表中指定一个条目,该条目没有以某种方式指向有效的子程序。参见 overload。
(F) 该函数需要比您指定的更多参数。
(W syntax) 指定的格式比下一行提供的图片字段更多。请参阅 perlform。
(A) 您不小心将脚本通过 Bourne shell 而不是 Perl 运行。请检查 #! 行,或手动将脚本输入 Perl。
(S) VMS 特有的警告。Perl 无法找到本地时区偏移量,因此它假设本地系统时间等效于 UTC。如果并非如此,请定义逻辑名称 SYS$TIMEZONE_DIFFERENTIAL 以转换为需要添加到 UTC 以获得本地时间的秒数。
(S debugging) 某些内部例程使用空操作码指针调用 run()。
(F) formline 的第一个参数必须是有效的格式图片规范。发现它为空,这可能意味着您提供了一个未初始化的值。请参阅 perlform。
(P) 内部模式匹配例程已失效。
(F) Perl 将程序中十进制数的表示限制为大约 250 个字符。您已超过该长度。未来的 Perl 版本可能会消除此任意限制。在此期间,请尝试使用科学记数法(例如,使用“1e6”而不是“1_000_000”)。
(F) Perl 在寻找数字,但没有找到任何看起来像数字的东西。例如,在 \o{}
中,花括号之间没有数字就会发生这种情况。
(F) 提供给 sprintf() 或 printf() 的数字格式结果的长度对于底层 C 函数来说太大而无法报告。此限制通常为 2GB。
(F) 唯一允许以 0 开头的数字变量是 $0
,而你提到了一个以 0 开头且超过一位的变量。你可能想要删除前导 0,或者如果意图是表示八进制变量名,则应将其转换为十进制。
(W portable) 你指定的八进制数大于 2**32-1 (4294967295),因此在不同系统之间不可移植。有关可移植性问题的更多信息,请参见 perlport。
(F) 在其签名中使用贪婪哈希参数的子程序收到了用于填充哈希的奇数个参数。它要求参数成对出现,键和值的个数相同。子程序的调用者可能是错误的。
该消息尝试包含被调用子程序的名称。如果子程序已被别名化,则将显示子程序的原始名称,而不管调用者使用了什么名称。
(W overload) 对 overload::constant 的调用包含奇数个参数。参数应该成对出现。
(W misc) 你指定了奇数个元素来初始化哈希,这很奇怪,因为哈希以键/值对的形式出现。
(F) 对 "export_lexically" in builtin 的调用包含奇数个参数。这是不允许的,因为每个名称都必须与一个有效的引用值配对。
(W misc) 你指定了奇数个元素来初始化哈希,这很奇怪,因为哈希以键/值对的形式出现。
(W misc) 你指定了奇数个元素来初始化对象的哈希字段。哈希是从键/值对列表中初始化的,因此每个键都必须有一个对应的值。最终缺少的值将用 undef 代替。
(F)(W layer) 你尝试使用指向缓冲区外的偏移量进行读/写/发送/接收/查找操作。这很难想象。唯一的例外是,当通过 sysread()
读取文件或当查找超出为 I/O 打开的标量的末尾时(为了预期未来的读取并模仿对真实文件的行为),将进行零填充。
(W deprecated::apostrophe_as_package_separator, syntax) 您在变量、子程序或包名称中使用了旧的包分隔符 "'"。对旧包分隔符的支持将在 Perl 5.42 中删除。
(W deprecated::apostrophe_as_package_separator, syntax) 您在双引号字符串中使用的变量名称中使用了旧的包分隔符 "'";例如,"In $name's house"
。这等效于 "In $name::s house"
。如果您指的是前者,请在单引号前加一个反斜杠 ("In $name\'s house"
)。
对旧包分隔符的支持将在 Perl 5.42 中删除。
(F) 您尝试将 :param
属性应用于数组或哈希字段。目前不允许这样做。
(W unopened) 在从未初始化的文件句柄上尝试了 I/O 操作。您需要执行 open()、sysopen() 或 socket() 调用,或从 FileHandle 包调用构造函数。
(W unopened) 您尝试在未打开的文件句柄上调用文件测试运算符。检查您的控制流。另请参见 perlfunc 中的 "-X"。
(S internal) 语法错误的内部警告。
(S internal) 语法错误的内部警告。
(F) 你写了类似以下内容:
(?[ \p{Digit} \p{Thai} ])
有两个操作数,但没有运算符说明如何组合它们。
(F) 尝试执行未定义处理程序的重载操作。虽然某些处理程序可以根据其他处理程序自动生成,但任何操作都没有默认处理程序,除非将 fallback
重载键指定为 true。参见 overload。
(S non_unicode) 您对一个不在 Unicode 中的代码点执行了需要 Unicode 规则的操作,因此其应执行的操作未定义。Perl 选择让它什么也不做,并向您发出警告。
如果显示的操作是 "ToFold",则意味着在正则表达式中对代码点进行了不区分大小写的匹配。
如果您知道自己在做什么,可以通过 no warnings 'non_unicode';
关闭此警告。
(S surrogate) 您对 Unicode 代理执行了需要 Unicode 规则的操作。Unicode 不赞成将代理用于除在 UTF-16 中存储字符串之外的任何用途,但代理的规则(勉强)已定义,并且它们对于此操作什么也不做。由于使用代理可能很危险,因此 Perl 会发出警告。
如果显示的操作是 "ToFold",则意味着在正则表达式中对代码点进行了不区分大小写的匹配。
如果您知道自己在做什么,可以通过 no warnings 'surrogate';
关闭此警告。
(S ambiguous) 您在解析器期望运算符的地方使用了变量或子例程调用。解析器假设您确实想使用运算符,但这很可能是错误的。例如,如果您说 "*foo *foo",它将被解释为如果您说 "*foo * 'foo'"。
(F) 在子例程签名中,您写了类似 "$a =" 的内容,创建了一个没有默认值的命名可选参数。无名可选参数允许没有默认值,但命名可选参数必须有特定的默认值。您可能想要 "$a = undef"。
(W shadow) 您似乎已经在当前词法作用域中声明过相同的全局变量。
(X) malloc() 函数返回 0,表示没有足够的剩余内存(或虚拟内存)来满足请求。Perl 只能立即退出。
至少在 Unix 系统中,您可以通过增加进程数据大小限制来解决此问题:在 csh/tcsh 中使用 `limit` 和 `limit datasize n`(其中 `n` 是千字节数)来检查当前限制并进行更改,在 ksh/bash/zsh 中分别使用 `ulimit -a` 和 `ulimit -d n`。
(X) 尝试将数组、列表或字符串扩展到最大可能的内存分配之外。
(F) malloc() 函数返回 0,表示没有足够的剩余内存(或虚拟内存)来满足请求。但是,请求被认为足够大(编译时默认值为 64K),因此允许通过捕获此错误来关闭程序。
(X)(F) malloc() 函数返回 0,表示没有足够的剩余内存(或虚拟内存)来满足请求。
请求被认为很小,因此是否可以捕获它取决于 Perl 的编译方式。默认情况下,它不可捕获。但是,如果为此编译,Perl 可能会在使用此消息进行 die() 后使用 `$^M` 的内容作为紧急池。在这种情况下,错误可以捕获 *一次*,并且错误消息将包含发生失败请求的行和文件。
(F) 您无法分配超过 2^31+"少量" 字节的内存。此错误很可能是由 Perl 程序中的拼写错误引起的。例如,`$arr[time]` 而不是 `$arr[$time]`。
(F) Yacc 解析器想要扩展其堆栈以便继续解析,但 realloc() 无法为其提供更多内存,无论是虚拟内存还是其他内存。
(F) 模板中 '.' 的参数试图将工作位置移动到正在构建的打包字符串的开头之前。
(F) 您的模板指定了要解包的字符串之外的绝对位置。请参阅 "perlfunc 中的 pack"。
(F) 您使用了一个模板,该模板指定了在解包字符串之外的绝对位置。要解包的字符串也是无效的 UTF-8。请参阅 "perlfunc 中的 pack"。
(W overload) overload 编译指示传递了一个它无法识别的参数。您是否拼错了运算符?
(F) 解引用了一个具有重载解引用运算符的对象,但重载操作未返回引用。请参阅 overload。
(F) 一个具有 qr
重载的对象用作匹配的一部分,但重载操作未返回已编译的正则表达式。请参阅 overload。
(W reserved) 使用了一个小写属性名称,该名称具有包特定的处理程序。该名称将来可能对 Perl 本身有意义,即使它现在还没有。也许您应该使用混合大小写的属性名称。请参阅 attributes。
(F) 您无法指定一个重复计数,该计数大到足以使您的有符号整数溢出。请参阅 "perlfunc 中的 pack"。
(W io) 对 write() 的一次调用产生了比页面所能容纳的更多的行。请参阅 perlform。
(P) 内部错误。
(P) 文件测试运算符之一进入了一个调用 ACL 相关函数的代码分支,但该函数在此平台上不可用。早期的检查意味着在此平台上不可能进入此分支。
(P) Windows 上的 ithreads 实现中的子伪进程未在允许的时间段内调度,因此无法正确初始化。
(P) 尝试编译 grep 时,内部一致性检查失败。
(P) 请求保存栈恢复比保存栈中更多的本地化值。
(P) 在尝试重置弱引用时,内部一致性检查失败。
(P) 在尝试折叠常量时,捕获到除 eval
失败之外的异常。
(P) 库函数 frexp() 失败,导致 printf("%f") 无法执行。
(P) 我们将上下文栈弹出到具有指定标签的上下文,然后发现它不是我们知道如何执行 goto 的上下文。
(P) 用于清除 typeglob 条目的内部例程尝试多次,但每次都会在 glob 中重新创建条目。最有可能的是,glob 包含一个对象,该对象包含对 glob 的反向引用以及一个将新对象添加到 glob 的析构函数。
(P) 词法分析器在 case 修饰符处进入错误状态。
(P) 词法分析器在解析带有方括号的字符串时进入错误状态。
(F) 分叉的子进程返回了关于其 errno 的难以理解的消息。
(P) 保存栈可能不同步。至少,它的顶部有一个无效的枚举。
(P) 在尝试重置对对象的全部弱引用时,内部一致性检查失败。
(P) 有些东西请求了负数的 malloc 字节数。
(P) 有些东西试图分配超过可能的内存或负数。
(P) 解析器在尝试解析 foreach
循环时,内部一致性检查失败。
(P) 编译器对它正在分配和释放临时变量和词法变量的哪个临时存储区感到困惑。
(P) 编译器对它正在分配和释放临时变量和词法变量的哪个临时存储区感到困惑。
(P) 在内部检测到零临时存储区偏移量。试图释放一个从未分配的目标。
(P) 编译器对它正在分配和释放临时变量和词法变量的哪个临时存储区感到困惑。
(P) 在内部检测到零临时存储区偏移量。很可能一个运算符需要一个目标,但该目标由于某种原因没有被分配。
(P) 编译器对它正在分配和释放临时变量和词法变量的哪个临时存储区感到困惑。
(P) 在内部检测到无效的临时存储区偏移量。
(P) foreach 迭代器在非循环上下文帧中被调用。
(P) 内部 pp_match() 例程被调用时,操作数据无效。
(P) 有些东西请求了负数字节的 realloc。
(P) 内部 sv_replace() 函数被传递了一个引用计数不为 1 的新 SV。
(P) 一些内部例程请求了一个 goto(或类似的东西),但没有提供目标。
(P) 我们将上下文堆栈弹出到子例程或 eval 上下文,然后发现它不是子例程或 eval 上下文。
(P) scan_num() 在非数字对象上被调用。
(P) 在编译包含嵌入式 (?{}) 或 (??{}) 代码块的模式时,perl 无法找到应该已经由 perl 在控制权传递给正则表达式编译器之前看到并编译的代码块。
(P) sv_chop() 函数传递了一个不在标量字符串缓冲区内的位置。
(P) sv_insert() 函数被告知要删除比字符串本身更多的字符串。
(P) 编译器试图执行 goto 操作,或者类似的奇怪操作。
(P) 在编译左值上下文中的子例程调用时,Perl 失败了内部一致性检查。它遇到了格式错误的操作树。
(P) 编译器被搞乱了,试图使用在运行时不允许的操作。
(P) 处理 &CORE::foo()
子例程调用参数的内部函数无法确定预期参数的类型。
(P) 有些东西试图用奇数(而不是偶数)字节长度调用 utf16_to_utf8。
(P) 有些东西试图用奇数(而不是偶数)字节长度调用 utf16_to_utf8_reversed。
(P) 在处理 case 修饰符时,词法分析器进入错误状态。
(W parenthesis) 你说了一些类似于
my $foo, $bar = @_;
您的意思是
my ($foo, $bar) = @_;
记住 "my"、"our"、"local" 和 "state" 的绑定优先级高于逗号。
(F) 由扩展提供的解析代码以可检测的方式违反了解析器的 API。
(F) 你使用了在未消耗任何文本的情况下使用了过多嵌套子模式调用的模式。重新构建模式,以便在超过嵌套限制之前消耗文本。
-p
目标:%s(F) 在由 -p
命令行开关调用的隐式输出期间发生错误。(此输出将发送到 STDOUT,除非你使用 select() 重定向它。)
(F) 有关的 XS 模块是针对与加载 XS 模块的 Perl 版本不同的不兼容的 Perl 版本编译的。
(S regexp) 你使用了具有不区分大小写匹配的正则表达式,并且 Perl 中存在一个错误,其中内置的正则表达式折叠规则不准确。这可能导致错误的结果。请将此问题报告给 https://github.com/Perl/perl5/issues/new/choose。
(F) 你的平台具有非常不常见的字节顺序和整数大小,因此无法设置一些或所有固定宽度字节顺序转换函数。这只有在你使用 (un)pack 模板中的 '<' 或 '>' 修饰符时才会出现问题。请参阅 "pack" in perlfunc。
(F) 您尝试运行的代码需要比您当前运行的版本更新的 Perl 版本。也许您写的是 use 5.10
而不是 use 5.010
或 use v5.10
。如果没有前导的 v
,该数字将被解释为十进制数,小数点后的每三位数字代表版本号的一部分。因此 5.10 等效于 v5.100。
(F) 有关的模块使用比当前运行版本更新的 Perl 版本的功能。您上次升级是什么时候?请参阅 "perlfunc 中的 require"。
(F) OS/2 特有的错误。PERL_SH_DIR 是查找 sh
shell 的目录。请参阅 perlos2 中的“PERL_SH_DIR”。
(X) 请参阅 "perlrun 中的 PERL_SIGNALS" 以了解合法值。
(F) 您尝试运行的代码声称它不会在您使用的 Perl 版本上运行,因为它太新了。也许代码需要更新,或者它可能只是错误的,版本检查应该被删除。
(S) PERL_HASH_SEED 应该匹配 /^\s*(?:0x)?[0-9a-fA-F]+\s*\z/,但它包含一个非十六进制字符。这可能意味着您没有使用您认为的哈希种子。
(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 部分的 LOCALE PROBLEMS 中找到如何真正解决问题。
(S) Perl 在运行时定义了环境变量 PERL_PERTURB_KEYS,但包含意外的值。此设置的合法值如下所示。
Numeric | String | Result
--------+---------------+-----------------------------------------
0 | NO | Disables key traversal randomization
1 | RANDOM | Enables full key traversal randomization
2 | DETERMINISTIC | Enables repeatable key traversal
| | randomization
接受数字和字符串值,但请注意字符串值区分大小写。此设置的默认值为 "RANDOM" 或 1。
(W exec) VMS 特有的警告。Waitpid() 被要求等待一个不是当前进程子进程的进程。虽然从 VMS 的角度来看这是可以的,但这可能不是您的本意。
(F) unpack 格式 P 必须具有显式大小,而不是 "*".
(F) 字符类 [: :] 语法中的类未知。 <-- HERE 显示在正则表达式中发现问题的位置。请注意,POSIX 字符类 **不** 具有相应的 C 接口所具有的 is
前缀:换句话说,它是 [[:print:]]
,而不是 isprint
。请参阅 perlre。
(F) 您的系统具有 POSIX getpgrp(),它不接受任何参数,这与 BSD 版本不同,BSD 版本接受 pid。
(W regexp) Perl 认为您打算编写一个 POSIX 字符类,但没有使用足够的括号。这些 POSIX 类构造 [: :], [= =] 和 [. .] 位于字符类内部,[] 是构造的一部分,例如:qr/[012[:alpha:]345]/
。编译后的正则表达式模式可能不是您想要的。例如,qr/[:alpha:]/
编译为一个由四个字符 ":"
、"a"
、"l"
、"h"
和 "p"
组成的普通带括号的字符类。要指定 POSIX 类,它应该写成 qr/[[:alpha:]]/
。
请注意,[= =] 和 [. .] 目前尚未实现;它们只是未来扩展的占位符,会导致致命错误。 <-- HERE 显示了正则表达式中发现问题的所在。请参阅 perlre。
如果类的规范不完全有效,则消息会指出这一点。
(F) 在正则表达式字符类 ([]) 中,以 "[." 开头并以 ".]" 结尾的语法保留供将来扩展使用。如果您需要在正则表达式字符类中表示这些字符序列,只需用反斜杠引用方括号:"\[." 和 ".\]"。 <-- HERE 显示了正则表达式中发现问题的所在。请参阅 perlre。
(F) 在正则表达式字符类 ([]) 中,以 "[=" 开头并以 "=]" 结尾的语法保留供将来扩展使用。如果您需要在正则表达式字符类中表示这些字符序列,只需用反斜杠引用方括号:"\[=" 和 "=\]"。 <-- HERE 显示了正则表达式中发现问题的所在。请参阅 perlre。
(W qw) qw() 列表包含由空格分隔的项目;与文字字符串一样,注释字符不会被忽略,而是被视为文字数据。(您可能使用了与这里显示的括号不同的分隔符;大括号也经常使用。)
您可能写了类似这样的代码
@list = qw(
a # a comment
b # another comment
);
而您应该写成这样
@list = qw(
a
b
);
如果您真的想要注释,请以传统方式构建您的列表,使用引号和逗号
@list = (
'a', # a comment
'b', # another comment
);
(W qw) qw() 列表包含由空格分隔的项目;因此,不需要逗号来分隔项目。(您可能使用了与这里显示的括号不同的分隔符;大括号也经常使用。)
您可能写了类似这样的代码
qw! a, b, c !;
这会将文字逗号放入某些列表项中。如果您不希望逗号出现在您的数据中,请在没有逗号的情况下编写它
qw! a b c !;
(F) ioctl() 或 fcntl() 返回了超过 Perl 预期的结果。Perl 会猜测一个合理的缓冲区大小,但在缓冲区末尾放置一个哨兵字节以防万一。这个哨兵字节被覆盖了,Perl 假设内存现在已损坏。请参阅 "perlfunc 中的 ioctl"。
(W syntax) 混合使用控制流运算符(例如 return
)和低优先级运算符(例如 or
)可能会出现问题。请考虑以下情况
sub { return $a or $b; }
这将被解析为
sub { (return $a) or $b; }
实际上等同于
sub { return $a; }
请使用括号或运算符的高优先级变体。
请注意,这也会在类似以下的结构中触发
sub { 1 if die; }
(W precedence) 您的程序将位逻辑运算符与数值比较运算符结合使用,例如
if ($x & $y == 0) { ... }
由于 ==
的优先级更高,此表达式实际上等同于 $x & ($y == 0)
。这可能不是您想要的。(如果您确实想写这个,请禁用警告,或者,最好是显式地使用括号并写成 $x & ($y == 0)
)。
(W ambiguous) 您在正则表达式中使用了类似 m/$\/
的语句。正则表达式 m/foo$\s+bar/m
翻译为:匹配单词 'foo',输出记录分隔符(请参阅 "perlvar 中的 $\")和字母 's'(一次或多次),然后是单词 'bar'。
如果你确实想要这样做,你可以使用 `m/${\}/` 来消除警告(例如:`m/foo${\}s+bar/`)。
如果你想匹配行尾的单词 'foo' 后面跟着空格,然后是下一行的单词 'bar',那么你可以使用 `m/$(?)\/`(例如:`m/foo$(?)\s+bar/`)。
(W ambiguous) 你在双引号字符串中使用了类似 '@foo' 的内容,但在当时作用域中没有名为 `@foo` 的数组。如果你想要一个字面意义上的 @foo,那么请将其写成 \@foo;否则,请找出你丢失的数组发生了什么。
(S precedence) 以前不规则的结构
open FOO || die;
现在被误解为
open(FOO || die);
这是因为 Perl 5 的语法严格地规范化为一元和列表运算符。(旧的 open 既有一元运算符的特性,也有列表运算符的特性。)你必须将文件句柄放在括号中,或者使用新的 "or" 运算符代替 "||"。
参见 "500 服务器错误"。
(W closed) 你正在写入的文件句柄在之前某个时间点被关闭了。请检查你的控制流程。
(W closed) 你正在打印的文件句柄在之前某个时间点被关闭了。请检查你的控制流程。
(W) 这是 OS/2 应用程序发出的标准消息,而 *nix 应用程序会静默退出。这被认为是 OS/2 移植的一个特性。可以通过适当的信号处理程序轻松地禁用此功能,请参阅 "perlipc 中的信号"。另请参阅 perlos2 中的 "进程被 SIGTERM/SIGINT 终止"。
(W illegalproto) 原型中 % 或 @ 后面跟着一个字符。这是没有意义的,因为 % 和 @ 会吞噬子程序参数的剩余部分。
(S 原型) 正在声明或定义的子程序之前已使用不同的函数原型声明或定义过。
(F) 您在函数原型定义中省略了右括号。
(W 原型) 原型在子程序名称后的括号中以及通过 prototype 属性声明。括号中的原型是无用的,因为它将在使用之前被属性中的原型替换。
(W 语法) BEGIN
块在解析后立即执行,然后被丢弃。因此,任何原型或属性都是无意义的,并且会被忽略。您应该将它们从 BEGIN
块中删除。请注意,这也意味着您不能创建名为 BEGIN
的常量。
(F) 您用量词开始了正则表达式。如果您想将其作为字面量,请对其进行反斜杠转义。 <-- HERE 显示了在正则表达式中发现问题的位置。请参见 perlre。
(F) 目前对 {min,max} 结构的最小值和最大值的尺寸有限制。 <-- HERE 显示了在正则表达式中发现问题的位置。请参见 perlre。
(W 正则表达式) 最小值应该小于或等于最大值。如果您真的希望您的正则表达式匹配 0 次,只需使用 {0}。
(W 正则表达式) 您在没有意义的地方应用了正则表达式量词,例如在零宽度断言上。尝试将量词放在断言内部。例如,匹配 "abc" 且其后跟三个 "xyz" 的重复的方法是 /abc(?=(?:xyz){3})/
,而不是 /abc(?=xyz){3}/
。
(F) 范围运算符 ".." 的一个(或两个)数字参数超出了内部整数可以表示的范围。一种可能的解决方法是在数字前添加 "0",强制 Perl 使用神奇的字符串增量。
(W regexp) (仅在 use re 'strict'
或 (?[...])
内)
更严格的规则有助于发现拼写错误和其他错误。也许你在这里根本没有打算使用范围,如果 " - " 应该表示其他字符,或者应该被转义(例如 " \ - ")。如果你确实打算使用范围,那么所使用的范围在 ASCII 和 EBCDIC 平台之间不可移植,并且对普通读者没有明显的意义。
[3-7] # OK; Obvious and portable
[d-g] # OK; Obvious and portable
[A-Y] # OK; Obvious and portable
[A-z] # WRONG; Not portable; not clear what is meant
[a-Z] # WRONG; Not portable; not clear what is meant
[%-.] # WRONG; Not portable; not clear what is meant
[\x41-Z] # WRONG; Not portable; not obvious to non-geek
(你可以通过指定 Unicode 范围来强制移植性,这意味着端点由 \N{...}
指定,但含义可能仍然不明确。) 更严格的规则要求以非控制 ASCII 字符开头或结尾的范围的所有端点都必须是文字字符,而不是一些转义序列(如 "\x41"
),并且范围必须全部是数字,或者全部是大写字母,或者全部是小写字母。
(W regexp) (仅在 use re 'strict'
或 (?[...])
内)
更严格的规则有助于发现拼写错误和其他错误。你包含了一个范围,并且至少有一个端点是十进制数字。在更严格的规则下,当这种情况发生时,两个端点都应该是同一组 10 个连续数字中的数字。
(W io) 你正在从中读取的目录句柄已关闭或根本不是目录句柄。检查你的控制流。
(W closed) 您正在读取的文件句柄在当前时间之前已关闭。请检查您的控制流。
(W unopened) 您正在读取的文件句柄从未打开。请检查您的控制流。
(W closed) 您尝试从已关闭的文件句柄中读取数据。
(W unopened) 您尝试从从未打开的文件句柄中读取数据。
(S malloc) 内部例程在已释放的内存上调用 realloc()。
(S debugging) 除非将生成所需输出的代码编译到 Perl 中,否则您无法使用 -D 选项,这会带来一些开销,这就是为什么它目前未包含在您的副本中。
(P) 在 %INC 钩子内创建文件句柄时,目前不允许加载模块。这可能发生在 open my $fh, '<', \$scalar
中,它会隐式加载 PerlIO::scalar。请尝试先显式加载 PerlIO::scalar。
(F) 在计算包的方法解析顺序 (MRO) 时,Perl 认为在 @ISA
层次结构中发现了无限循环。这是一个粗略的检查,它在 @ISA
深度达到 100 层后退出。
(W redundant) 您调用了一个函数,其参数数量超过了您提供的其他参数所指示的所需数量。目前仅在 printf 类型的格式需要比提供的参数更少时才会发出此警告,但将来可能会用于例如 "perlfunc 中的 pack"。
(P) Perl 的 I/O 实现失败了内部一致性检查。如果您看到此消息,则说明情况非常糟糕。
(W misc) 您提供了一个单一引用,而 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 misc) 您尝试削弱一个已经是弱引用的引用。这样做没有效果。
(W misc) 您尝试加强一个不是弱引用的引用。这样做没有效果。
(F) 您在正则表达式中使用了 \g0
或类似的表达式。您只能使用严格的正整数(普通反向引用)或严格的负整数(相对反向引用)来引用捕获的括号。使用 0 没有意义。
(F) 您在正则表达式中使用了类似 \7
的东西,但表达式中至少没有七组捕获的括号。如果您想将序数为 7 的字符插入正则表达式,请在前面添加零使其成为三位数:\007
<-- HERE 显示了在正则表达式中发现问题的位置。
(F) 您在正则表达式中使用了类似 \k'NAME'
或 \k<NAME>
的东西,但没有相应的命名捕获括号,例如 (?'NAME'...)
或 (?<NAME>...)
。检查反向引用和声明中名称是否拼写正确。
<-- HERE 显示了在正则表达式中发现问题的位置。
(F) 您在正则表达式中使用了类似于 \g{-7}
的内容,但在 \g{-7}
所在位置之前,表达式中至少没有七组闭合的捕获括号。
<-- HERE 显示了在正则表达式中发现问题的位置。
(P) 正则表达式引擎对正则表达式编译器提供的內容感到困惑。
(F) 正则表达式模式中指定的修饰符出现次数过多。删除多余的修饰符。
(F) 关闭给定修饰符会产生打开另一个修饰符的副作用。Perl 目前不允许这样做。重新编写正则表达式以使用您要打开的修饰符(并将其放在减号之前),而不是您要关闭的修饰符。
(F) 正则表达式模式中指定的修饰符出现次数过多。删除多余的修饰符。
(F) 正则表达式模式中包含了多个互斥修饰符。只保留应该存在的修饰符。
(P) 一个“不可能发生”的错误,因为 safemalloc() 应该在更早的时候就捕获到它。
(F) 您的格式包含 ~~ repeat-until-blank 序列和一个永远不会为空的数字字段,因此重复永远不会终止。您可以使用 ^# 代替。请参阅 perlform。
(W misc) 您使用了比搜索列表更长的替换列表。因此,替换列表中的附加元素毫无意义。
(F) 您调用了具有必需命名参数的类的构造函数,但根本没有传递该参数。
(F) 您使用了需要冒号和模式参数的结构。提供这些或检查您是否正在使用正确的结构。
从 Perl 5.32 开始,不再生成此消息。请参阅 "非八进制字符 '%c' 提前终止 \o。解析为 "%s""。 (W misc, regexp) 您在双引号字符串中写了类似 \08
或 \179
的内容。除了最后一个数字之外,所有数字都被视为单个字符,以八进制表示。最后一个数字是字符串中的下一个字符。为了告诉 Perl 这确实是您想要的,您可以使用 \o{ }
语法,或者使用正好三个数字来指定字符的八进制表示。
(W syntax) 您反向写了赋值运算符。= 必须始终放在最后,以避免与后续的单目运算符产生歧义。
(W io) 您尝试对其执行 rewinddir() 的目录句柄已关闭或实际上不是目录句柄。检查您的控制流。
(S internal) Perl 的内部标量簿记出现问题:在 Perl 退出时,并非所有标量变量都被释放。这通常表明存在内存泄漏,这当然很糟糕,尤其是在 Perl 程序旨在长时间运行的情况下。
(W syntax) 您使用数组切片(由 @ 表示)来选择数组中的单个元素。通常最好请求标量值(由 $ 表示)。区别在于 $foo[&bar]
在赋值时和评估其参数时始终表现为标量,而 @foo[&bar]
在赋值时表现为列表,并为其下标提供列表上下文,如果期望的只是一个下标,这可能会导致奇怪的行为。
另一方面,如果您实际上希望将数组元素视为列表,则需要了解引用是如何工作的,因为 Perl 不会为您在标量和列表之间进行神奇的转换。请参阅 perlref。
(W syntax) 您使用哈希切片(由 @ 表示)来选择哈希中的单个元素。通常最好请求标量值(由 $ 表示)。区别在于 $foo{&bar}
在赋值时和评估其参数时始终表现为标量,而 @foo{&bar}
在赋值时表现为列表,并为其下标提供列表上下文,如果期望的只是一个下标,这可能会导致奇怪的行为。
另一方面,如果您实际上希望将哈希元素视为列表,则需要了解引用是如何工作的,因为 Perl 不会为您在标量和列表之间进行神奇的转换。请参阅 perlref。
(F) 词法分析器无法找到 // 或 m{} 结构的最终分隔符。请记住,括号分隔符会计算嵌套级别。从变量 $m
中缺少前导 $
可能会导致此错误。
请注意,自 Perl 5.10.0 以来,// 也可以是 定义或 结构,而不仅仅是空搜索模式。因此,在 Perl 5.10.0 或更高版本中编写的使用 // 作为 定义或 的代码可能会被 5.10.0 之前的 Perl 误解析为未终止的搜索模式。
(W io) 您正在对它进行 seekdir() 操作的目录句柄要么已关闭,要么根本不是目录句柄。请检查您的控制流程。
(W unopened) 您尝试对一个从未打开或已关闭的文件句柄使用 seek() 或 sysseek() 函数。
(F) 此机器未实现 select() 系统调用。
(F) 在当前实现中,不支持数组和哈希的自绑定。
(W semicolon) 附近的语法错误可能是由缺少分号或其他缺少的操作符(如逗号)引起的。
(S internal) 内部 newSVsv() 例程被调用来复制之前已标记为已释放的标量。
(F) 您的系统上没有 System V 信号量 IPC。
(W closed) 您正在发送到的套接字在之前某个时间点已关闭。请检查您的控制流程。
(F) 这三个字符不能在双引号上下文中连续出现。此消息仅在非 ASCII 平台上引发(在 ASCII 平台上会输出不同的错误消息)。如果您打算使用此序列指定控制字符,则必须使用其他方式来指定它。
(F) 正则表达式以不完整的扩展名 (?. 结束。 <-- HERE 显示在正则表达式中发现问题的位置。请参阅 perlre。
(F) 提议的正则表达式扩展保留了该字符,但尚未编写。 <-- HERE 显示在正则表达式中发现问题的位置。请参阅 perlre。
(F) 您使用了不合理的正则表达式扩展。 <-- HERE 显示了在正则表达式中发现问题的位置。 当使用 (?^...)
结构告诉 Perl 使用默认的正则表达式修饰符,并且您冗余地指定了默认修饰符时,可能会发生这种情况。 有关其他原因,请参阅 perlre。
(F) 正则表达式注释必须以右括号终止。 不允许嵌入括号。 请参阅 perlre。
(F) (?&...)
形式的命名引用缺少名称后的最终右括号。 <-- HERE 显示了在正则表达式中发现问题的位置。
(F) (?'...')
或 (?<...>)
形式的命名组缺少最终的右引号或右尖括号。 <-- HERE 显示了在正则表达式中发现问题的位置。
(F) 前瞻断言 (?=...)
或 (?!...)
或后顾断言 (?<=...)
或 (?<!...)
缺少最终的右括号。 <-- HERE 显示了在正则表达式中发现问题的位置。
(F) 形式为 (?('...')...)
或 (?(<...>)...)
的命名引用缺少名称后的最终闭合引号或尖括号。 <-- HERE 显示在正则表达式中发现问题的位置。
(F) '('. 没有匹配的闭合括号。 <-- HERE 显示在正则表达式中发现问题的位置。
(F) 正则表达式期望在转义序列之后有一个强制性参数,但该参数被省略或写错了。
(F) {...} 中包含的 perl 代码的结尾必须紧跟一个 ')'.
(F) 形式为 (?P>...)
的命名引用缺少名称后的最终闭合括号。 <-- HERE 显示在正则表达式中发现问题的位置。
(F) 形式为 (?P<...>')
的命名组缺少最终闭合尖括号。 <-- HERE 显示在正则表达式中发现问题的位置。
(F) 形式为 (?P=...)
的命名引用缺少名称后的最终闭合括号。 <-- HERE 显示在正则表达式中发现问题的位置。
(F) 正则表达式中的 (?R)
或 (?0)
序列缺少最终括号。
(A) 当尝试通过网络运行 CGI 程序(包括 SSI)时,这通常是在浏览器窗口中看到的错误消息。实际的错误文本在不同的服务器之间差异很大。最常见的变体是“500 服务器错误”、“方法(某些内容)不允许”、“文档不包含数据”、“脚本标头过早结束”和“未生成有效的标头”。
这是一个 CGI 错误,而不是 Perl 错误.
您需要确保您的脚本是可执行的,可以被运行脚本的 CGI 用户访问(这可能不是您测试过的用户帐户),不依赖于任何环境变量(如 PATH)来自它没有运行的用户,并且不在 CGI 服务器找不到它的位置,基本上,或多或少。有关更多信息,请参阅以下内容
https://www.perl5.cn/CGI_MetaFAQ.html
http://www.htmlhelp.org/faq/cgifaq.html
http://www.w3.org/Security/Faq/
您还应该查看 perlfaq9。
(F) 您尝试为 $)
赋值,但您的操作系统不支持 setegid() 系统调用(或等效调用),或者至少 Configure 没有这样认为。
(F) 您尝试为 $>
赋值,但您的操作系统不支持 seteuid() 系统调用(或等效调用),或者至少 Configure 没有这样认为。
(F) 您的系统具有来自 BSD 4.2 的 setpgrp(),它不接受任何参数,与 POSIX setpgid() 不同,后者接受进程 ID 和进程组 ID。
(F) 您尝试为 $(
赋值,但您的操作系统不支持 setrgid() 系统调用(或等效调用),或者至少 Configure 没有这样认为。
(F) 您尝试为 $<
赋值,但您的操作系统不支持 setruid() 系统调用(或等效调用),或者至少 Configure 没有这样认为。
(W closed) 您尝试在已关闭的套接字上设置套接字选项。您是否忘记检查 socket() 调用的返回值?请参阅 "perlfunc 中的 setsockopt"。
(F) 您将对标量的引用分配给了 $/
,而引用的项不是正整数。在旧版本的 Perl 中,这 **看起来** 与将其设置为 undef
相同,但实际上在内部是不同的,效率更低,而且如果运气不好,可能会导致您的文件被引用的字符串形式分割。
在 Perl 5.20.0 中,这被更改为与将 $/
设置为 undef **完全** 相同,除了会抛出此警告。
建议您将代码更改为显式地将 $/
设置为 undef
,如果您希望将文件全部读入内存。从 Perl 5.28 开始,将 $/
分配给对非正整数的引用会导致致命错误。
(F) 您尝试将对非整数的引用分配给 $/
。在旧版本的 Perl 中,这将类似于将其设置为对正整数的引用,其中整数是引用的地址。从 Perl 5.20.0 开始,这是一个致命错误,以便允许将来的 Perl 版本将非整数引用用于更有趣的目的。
(F) 您的系统上没有 System V 共享内存 IPC。
(W syntax) 非匹配运算符为 !~,而不是 !=~。!=~ 将被解释为 !=(数值不等)和 ~(1 的补码)运算符:这可能不是您的本意。
(W syntax) 您在 Perl 预期找到字符串的地方使用了模式,例如 join
的第一个参数。Perl 将把模式与 $_ 匹配的真假结果视为字符串,这可能不是您的本意。
(W closed) 您尝试在已关闭的套接字上执行 shutdown 操作。这似乎有点多余。
(W 信号) 在 %SIG 中命名的信号处理程序实际上并不存在。也许你把它放错了包?
(S) 如果你看到这条消息,那么操作树的内部簿记肯定出了大问题。一个操作树在编译错误后需要被释放,但找不到,所以它被泄漏了。
(W 溢出) 你用一个大于它能可靠处理的数字调用了 sleep
,并且 sleep
可能睡的时间比要求的少。
(F) 在子程序签名中,你在 slurpy(数组或哈希)参数之后放了一些东西。slurpy 参数接受所有可用的参数,所以不能有任何剩余的参数来填充后面的参数。
(F) 你不应该对没有重载它的对象使用 ~~
运算符:Perl 拒绝使用对象的底层结构进行智能匹配。
(D deprecated::smartmatch) 如果你使用智能匹配 (~~
) 运算符,就会发出此警告。这是一个已弃用的功能。特别是,它的行为被认为过于复杂且不直观,它将在 Perl 5.42 中被移除。
(F) 你试图创建一个包含非常大键的哈希,其中“非常大”意味着它需要至少 2 吉字节来存储。不幸的是,Perl 还没有处理如此大的哈希键。你应该重新考虑你的设计,避免直接对如此长的字符串进行哈希。
(F) 一个古老的错误消息,几乎没有人再遇到。但在 sort 成为关键字之前,人们有时会把它用作文件句柄。
(F) 您尝试在传递给 eval
的字符串中激活源过滤器(通常是通过加载源过滤器模块)。在 unicode_eval
特性下不允许这样做。请考虑使用 evalbytes
代替。请参阅 特性。
(W misc) 您尝试指定一个偏移量,该偏移量超出了传递给 splice() 的数组的末尾。splice() 将从数组的末尾开始,而不是超出末尾。如果您不希望这样,请尝试通过分配 $#array = $offset
来显式地预扩展数组。请参阅 "perlfunc 中的 splice"。
(P) 分割正在无限循环。(显然,分割不应该迭代超过输入字符数,而这正是发生的情况。)请参阅 "perlfunc 中的 split"。
(W exec) 您执行了 exec(),并在其后执行了一些语句,而不是 die()。这几乎总是错误的,因为 exec() 除非失败,否则不会返回。您可能想使用 system() 代替,system() 会返回。要抑制此警告,请将 exec() 放置在单独的块中。
(F) 词法作用域子程序不在包中,因此尝试在前面使用包限定符声明它没有意义。
(W 语法) 包变量 $a 和 $b 用于排序比较。您在排序比较块中使用 $a 或 $b 作为 <=>
或 cmp
运算符的操作数,并且该变量之前已声明为词法变量。要么使用包名限定排序变量,要么重命名词法变量。
(F) 词法作用域变量不在包中,因此尝试使用包限定符在前面声明一个词法作用域变量没有意义。如果您想本地化一个包变量,请使用 local()。
(W unopened) 您尝试在从未打开或已关闭的文件句柄上使用 stat() 函数。
(W utf8) 您尝试打开对标量的引用以进行读取或追加,其中标量包含大于 0xFF 的代码点。内存文件模拟磁盘文件,并且只能包含字节。
(P) 通过 @ISA 树进行的重载解析可能会被导入存根破坏。存根不应该被隐式创建,但对 can
的显式调用可能会破坏这一点。
(F) 当启用子程序签名时,任何子程序属性都必须位于签名之前。请注意,在 5.22..5.26 版本中,此顺序是相反的。所以
sub foo :lvalue ($a, $b) { ... } # 5.20 and 5.28 +
sub foo ($a, $b) :lvalue { ... } # 5.22 .. 5.26
(W closure) 在编译期间,内部命名子程序或 eval 试图捕获当前不可用的外部词法子程序。这可能由于以下两种原因之一。首先,词法子程序可能在尚未创建的外部匿名子程序中声明。(请记住,命名子程序在编译时创建,而匿名子程序在运行时创建。)例如,
sub { my sub a {...} sub f { \&a } }
在创建 f 时,它无法捕获当前的 "a" 子程序,因为匿名子程序尚未创建。相反,以下情况不会发出警告,因为匿名子程序现在已经创建并处于活动状态
sub { my sub a {...} eval 'sub f { \&a }' }->();
第二种情况是由 eval 访问已超出范围的词法子程序引起的,例如,
sub f {
my sub a {...}
sub { eval '\&a' }
}
f()->();
这里,当编译 eval 中的 '\&a' 时,f() 当前未执行,因此其 &a 不可用于捕获。
(W shadow) 在当前作用域或语句中重新声明了 "my" 或 "state" 子程序,有效地消除了对先前实例的所有访问。这几乎总是打字错误。请注意,较早的子程序将一直存在,直到作用域结束或所有对它的闭包引用被销毁。
(W redefine) 您重新定义了一个子程序。要抑制此警告,请说
{
no warnings 'redefine';
eval "sub name { ... }";
}
(W closure) 内部(嵌套)命名子程序正在引用在外部命名子程序中定义的 "my" 子程序。
当调用内部子例程时,它将看到外部子例程的词法子例程的值,该值是在调用外部子例程之前和期间的*第一次*调用时的值;在这种情况下,在第一次调用外部子例程完成后,内部和外部子例程将不再共享词法子例程的公共值。换句话说,它将不再被共享。如果词法子例程访问其周围作用域中声明的词法变量,这将尤其重要。
这个问题通常可以通过使内部子例程匿名来解决,使用sub {}
语法。当创建引用外部子例程中词法子例程的内部匿名子例程时,它们会自动重新绑定到这些词法子例程的当前值。
(P) 替换正在无限循环。 (显然,替换不应该迭代超过输入字符数,而这正是发生的事情。)请参阅"perlop 中的正则表达式引号类运算符"中关于替换的讨论。
(F) 词法分析器找不到 s/// 或 s{}{} 结构的内部分隔符。请记住,括号分隔符计算嵌套级别。从变量$s
中缺少前导$
可能会导致此错误。
(F) 词法分析器找不到 s/// 或 s{}{} 结构的最终分隔符。请记住,括号分隔符计算嵌套级别。从变量$s
中缺少前导$
可能会导致此错误。
(W substr)(F) 您尝试引用指向字符串外部的 substr()。也就是说,偏移量的绝对值大于字符串的长度。请参阅"perlfunc 中的 substr"。如果 substr 在左值上下文中使用(例如作为赋值的左侧或作为子例程参数),则此警告是致命的。
(P) Perl 试图强制将 SV 升级到实际上低于其当前类型的类型。
(F) (?(condition)if-clause|else-clause) 结构最多可以有两个分支(if-clause 和 else-clause)。如果您希望一个或两个分支包含交替,例如使用this|that|other
,请将其括在聚类括号中
(?(condition)(?:this|that|other)|else-clause)
The <-- HERE 指示正则表达式中发现问题的所在。参见 perlre。
(F) (?(condition)if-clause|else-clause) 结构的条件部分未知。条件必须是以下之一
(1) (2) ... true if 1st, 2nd, etc., capture matched
(<NAME>) ('NAME') true if named capture matched
(?=...) (?<=...) true if subpattern matches
(?!...) (?<!...) true if subpattern fails to match
(?{ CODE }) true if code returns a true value
(R) true if evaluating inside recursion
(R1) (R2) ... true if directly inside capture group 1, 2, etc.
(R&NAME) true if directly inside named capture
(DEFINE) always false; for defining named subpatterns
The <-- HERE 指示正则表达式中发现问题的所在。参见 perlre。
(F) 您在模式中的某个地方遗漏了 (?(condition)...) 块的关闭。在适当的位置添加一个右括号。参见 perlre。
(F) 在 use filetest
pragma 下,我们无法切换真实和有效 uid 或 gid。
(F) 可能意味着您有语法错误。常见原因包括
A keyword is misspelled.
A semicolon is missing.
A comma is missing.
An opening or closing parenthesis is missing.
An opening or closing brace is missing.
A closing quote is missing.
通常会有另一个与语法错误相关的错误消息,提供更多信息。(有时打开 -w 会有所帮助。)错误消息本身通常会告诉您它在决定放弃时位于该行的哪个位置。有时实际错误发生在该位置之前的几个标记,因为 Perl 擅长理解随机输入。偶尔行号可能会误导人,而且偶尔唯一找出是什么触发错误的方法是反复调用 perl -c
,每次都砍掉一半的程序,看看错误是否消失了。有点像 20 个问题 的网络版。
(A) 您不小心将脚本通过 Bourne shell 而不是 Perl 运行。请检查 #! 行,或手动将脚本输入 Perl。
(F) 如果您通过 perl4 解释器运行 perl5 脚本,则很可能发生此错误,尤其是如果接下来的 2 个标记是 "use strict" 或 "my $var" 或 "our $var"。
(F) Perl 无法弄清楚您在这个结构中想要表达的意思;这通知您它放弃了尝试。
(F) perl -c
成功时的最终摘要消息。
(W closed) 您尝试从已关闭的文件句柄中读取数据。
(W unopened) 您尝试从从未打开的文件句柄中读取数据。
(F) 您尝试使用以 "sem"、"shm" 或 "msg" 开头的函数,但您的机器未实现 System V IPC。在某些机器上,该功能可能存在但未配置。请咨询您的系统支持人员。
(W closed) 你正在写入的文件句柄在之前某个时间点被关闭了。请检查你的控制流程。
-T
和 -B
未在文件句柄上实现(F) 当 Perl 不了解您的 stdio 类型时,它无法查看文件句柄的 stdio 缓冲区。您必须使用文件名。
(F) 您尝试使用 goto
跳转到一个对 Perl 来说嵌套过深的标签。Perl 拒绝这样做是为了您的安全。
(W io) 您尝试调用 telldir() 的目录句柄已关闭或不是真正的目录句柄。请检查您的控制流。
(W unopened) 您尝试在未打开或已关闭的文件句柄上使用 tell() 函数。
(F) Configure 无法在您的机器上找到 crypt() 函数,可能是因为您的供应商没有提供它,也可能是因为他们认为美国政府认为它是一个秘密,或者至少他们会继续假装它是秘密。如果您引用我说的话,我会否认。
(F) 要声明对变量的引用,例如 my \%x
,您必须先启用该功能。
no warnings "experimental::declared_refs";
use feature "declared_refs";
(F) 根据 Configure 的探测,该函数未在此架构上实现。
(S experimental::private_use) 此功能实际上是为将来使用而设计的钩子。
(F) 如果最后一个写入 stat 缓冲区的 stat 已经越过符号链接到达实际文件,则测试当前 stat 缓冲区是否为符号链接是没有意义的。请使用实际文件名。
(S experimental::uniprop_wildcards) 此功能处于实验阶段,其行为可能会在 Perl 的任何未来版本中发生变化。请参阅 "perlunicode 中的属性值通配符"。
(F) 此属性从未在 my
或 sub
声明中得到支持。
(W internal) VMS 特有的警告。您尝试更改或删除 CRTL 内部环境数组的元素,但您的 Perl 副本不是使用包含 setenv() 函数的 CRTL 构建的。您需要使用包含 setenv() 函数的 CRTL 重新构建 Perl,或者重新定义 PERL_ENV_TABLES(请参阅 perlvms),以便环境数组不是导致警告的 %ENV 更改的目标。
(F) 有些东西试图使用依赖于 Perl 使用随机哈希键遍历的默认支持进行编译的内部 API 调用,但此 Perl 没有使用该支持进行编译。您应该将此警告报告给相关的上游方,或者使用默认选项重新编译 perl。
(F) 您使用了类似于 my $x if 0
的声明。Perl 中存在一个长期存在的错误,导致当声明包含一个错误的条件时,词法变量在作用域退出时不会被清除。有些人利用这个错误来实现一种静态变量。由于我们打算修复这个错误,我们不希望人们依赖这种行为。您可以通过在函数外部的单独块中声明变量来实现类似的静态效果,例如
sub f { my $x if 0; return $x++ }
变为
{ my $x; sub f { return $x++ } }
从 Perl 5.10.0 开始,您还可以使用 state
变量来拥有只初始化一次的词法变量(参见 feature)
sub f { state $x; return $x++ }
这种在错误条件下使用 my()
的方法从 Perl 5.10 开始被弃用,并在 Perl 5.30 中成为致命错误。
(F) 第一次使用用户定义的属性("perlunicode 中的用户定义字符属性")时,会查找其定义并将其转换为内部形式,以便在后续使用中更高效地处理。如果两个或多个线程几乎同时尝试执行此处理,可能会出现竞争条件。相反,在这个任务周围创建了一个临界区,阻止除一个线程以外的所有线程执行它。此消息表明正在执行转换的线程花费了意外的长的时间。超时仅仅是为了防止死锁;它足够长,以至于系统可能正在发生抖动并即将崩溃。除了重启之外,没有真正的补救措施。
(F) 您的 C 库版本显然没有执行 times()。我怀疑您没有在 Unix 上运行。
(X) Perl 脚本中的 #! 行(或本地等效项)包含 -T 选项(或 -t 选项),但 Perl 在其命令行中没有使用 -T 调用。这是一个错误,因为当 Perl 在脚本中发现 -T 时,为时已晚,无法正确地从环境中污染所有内容。因此,Perl 放弃了。
如果 Perl 脚本作为命令使用 #! 机制(或其本地等效项)执行,此错误通常可以通过编辑 #! 行来修复,以便 -%c 选项成为 Perl 第一个参数的一部分:例如,将 perl -n -%c
更改为 perl -%c -n
。
如果 Perl 脚本作为 perl scriptname
执行,则 -%c 选项必须出现在命令行中:perl -%c scriptname
。
(F) 您尝试为 lc()、lcfirst、uc() 或 ucfirst()(或其字符串内联版本)定义自定义 To 映射,但您指定了非法映射。请参阅 "perlunicode 中的用户定义字符属性"。
(F) 您的模板包含嵌套深度过高的 () 组。
(F) syscall() 至少需要一个参数来指定要调用的系统调用,傻瓜。
(F) 子程序使用比签名要求更少的参数。子程序的调用者可能是错误的。
该消息试图包含被调用子程序的名称。如果子程序已被别名化,则将显示子程序的原始名称,无论调用者使用什么名称。它还将指示给定的参数数量和预期的参数数量。
类似于上一条消息,但适用于接受可变数量参数的子程序。
(X) Perl 脚本中的 #! 行(或本地等效项)包含 -M、-m 或 -C 选项。
对于 -M 和 -m,这是一个错误,因为这些选项不打算在脚本内部使用。请改用 use
准则。
-C 选项仅在命令行中也指定了此选项(并使用相同的字母或数字序列)时才有效。请在命令行中指定此选项,或者,如果您的系统支持,请使您的脚本可执行并直接运行它,而不是将其传递给 perl。
(W void) CHECK 或 INIT 块在运行时本身被定义,此时运行它们的机会已经过去。也许您正在使用 require
或 do
加载文件,而您应该使用 use
。或者,也许您应该将 require
或 do
放入 BEGIN 块中。
(F) Perl 最多只支持 14 个系统调用参数。
(F) 该函数需要的参数少于您指定的参数。
(F) 使用签名的子程序接收到的参数超过了签名允许的参数数量。子程序的调用者可能是错误的。
该消息试图包含被调用子程序的名称。如果子程序已被别名化,则将显示子程序的原始名称,无论调用者使用什么名称。它还将指示给定的参数数量和预期的参数数量。
类似于上一条消息,但适用于接受可变数量参数的子程序。
(F) 您已超过未匹配对应右括号的左括号 "("
的数量。此限制可防止占用过多内存。它最初设置为 1000,但可以通过将 ${^RE_COMPILE_RECURSION_LIMIT}
设置为其他值来更改。这可能需要在编译正则表达式模式之前在 BEGIN 块中完成。
(F) 您执行的代码在彼此内部嵌套了过多的 BEGIN 块,无论是显式地作为 BEGIN{} 还是隐式地作为 use 语句。此限制默认为一个相当高的数字,在正常情况下不应该超过,触发它很可能表明您的代码中存在严重错误。例如,eval 和 BEGIN 块的无限递归已知会触发此错误。
如果您知道有充分的理由超过限制,则可以通过将 ${^MAX_NESTED_EVAL_BEGIN_BLOCKS}
设置为与默认值 1000 不同的值来更改它。
(F) 您的正则表达式模式中捕获组过多。您需要重新设计模式以使用更少的捕获组。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(F) 正则表达式以未转义的反斜杠结尾。请对其进行转义。参见 perlre。
(F) 词法分析器无法找到 tr/// 或 tr[][] 或 y/// 或 y[][] 结构的内部分隔符。变量 $tr
或 $y
中缺少前导 $
可能会导致此错误。
(F) 词法分析器无法找到 tr///、tr[][]、y/// 或 y[][] 结构的最终分隔符。
(S) 一个包正在使用旧版本的 Module::Install::DSL
进行安装,该版本对 INIT 块何时被调用做出了不安全的假设。由于 Module::Install::DSL
用于安装其他模块,并且难以升级,因此我们提供了一个特殊的解决方法来处理这种情况。除非您是受影响模块的维护者,否则您可以忽略此警告。我们只将其作为健全性检查发出。
(F) 您尝试在不允许使用该运算符的安全隔室中使用该运算符。参见 Safe。
(F) 您的机器没有实现 Configure 知道的截断文件机制。
(S experimental::try) 如果您使用 try
和 catch
语法,则会发出此警告。此语法目前处于实验阶段,其行为可能会在 Perl 的未来版本中发生变化。
(S experimental::try) 如果您使用带有 `finally` 块的 `try` 和 `catch` 语法,则会发出此警告。此语法目前处于实验阶段,其行为可能会在未来的 Perl 版本中发生变化。
(F) CORE 包中的该子程序要求其参数为对指定类型数据的硬引用。重载会被忽略,因此对不是指定类型的对象的引用,即使它有重载来处理它,也不会被接受。
(F) 此函数要求该位置的参数为特定类型。数组必须为 @NAME 或 @{EXPR}
。哈希必须为 %NAME 或 %{EXPR}
。不允许隐式解引用 - 使用 {EXPR} 形式作为显式解引用。参见 perlref。
(F) 您的机器没有实现 umask 函数,而您尝试使用它来限制您自己的权限(EXPR & 0700)。
(S internal) 退出代码检测到进入和离开执行上下文的数量存在内部不一致。
(S internal) 退出代码检测到临时本地化的值的数量存在内部不一致。
(S internal) 退出代码检测到进入和离开块的数量存在内部不一致。
(S internal) 退出时,Perl 发现共享字符串表中仍有一些字符串,该字符串表用于写时复制和哈希键。这些条目应该被释放,因此这表明某个地方存在错误。
(S internal) 退出代码检测到分配和释放的易逝标量的数量存在内部不一致。
(F) 指示的格式似乎不存在。也许它实际上在另一个包中?请参阅 perlform。
(F) 指定的排序比较例程似乎不存在。也许它在不同的包中?请参阅 "sort" in perlfunc。
(F) 指示的子例程尚未定义,或者如果已定义,则它已被取消定义。
(F) 您尝试调用的匿名子例程尚未定义,或者如果已定义,则它已被取消定义。
(F) 指定的排序比较例程已声明,但似乎尚未定义。请参阅 "sort" in perlfunc。
(F) 指示的格式似乎不存在。也许它实际上在另一个包中?请参阅 perlform。
(W misc) 为类型全局变量分配了未定义的值,例如 *foo = undef
。这没有任何作用。您可能真正想要的是 undef *foo
。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(F) 要记住的简单规则是,如果您想在正则表达式模式中匹配字面上的 "{"
字符(U+007B LEFT CURLY BRACKET
),则需要以某种方式转义每个字面上的实例。通常最简单的方法是在它前面加上一个反斜杠,例如 "\{"
或将其括在方括号中 ("[{]"
)。如果模式分隔符也是大括号,则任何匹配的右大括号 ("}"
) 也应该转义,以避免混淆解析器,例如,
qr{abc\{def\}ghi}
强制将字面量"{"
字符转义,使Perl语言能够在未来的版本中以各种方式扩展。为了避免不必要地破坏现有代码,在不太可能存在扩展可能会与"{"
作为字面量的使用冲突的上下文中,不会强制执行此限制。那些不具有潜在歧义的不会发出警告;那些具有潜在歧义的会发出非弃用警告。
不会发出警告或错误的上下文是
作为模式中的第一个字符,或者在"^"
之后,表示将匹配锚定到行的开头。
作为"|"
之后表示交替的第一个字符。
作为括号分组中的第一个字符,例如
/foo({bar)/
/foo(?:{bar)/
作为量词后的第一个字符
/\s*{/
(W regexp) 如果要匹配正则表达式模式中的字面量"{"
字符(U+007B LEFT CURLY BRACKET
),需要记住的简单规则是,以某种方式转义每个字面量实例。通常最简单的方法是在其前面加上反斜杠,例如"\{"
,或者将其括在方括号中("[{]"
)。如果模式分隔符也是大括号,则任何匹配的右大括号("}"
)也应该转义,以避免混淆解析器,例如,
qr{abc\{def\}ghi}
强制将字面量"{"
字符转义,使Perl语言能够在未来的版本中以各种方式扩展。为了避免不必要地破坏现有代码,在不太可能存在扩展可能会与"{"
作为字面量的使用冲突的上下文中,不会强制执行此限制。那些不具有潜在歧义的不会发出警告;那些具有潜在歧义的会发出此警告。这确保了意外的拼写错误不会静默地导致模式编译成意外的内容。
不会发出警告或错误的上下文是
作为模式中的第一个字符,或者在"^"
之后,表示将匹配锚定到行的开头。
作为"|"
之后表示交替的第一个字符。
作为括号分组中的第一个字符,例如
/foo({bar)/
/foo(?:{bar)/
作为量词后的第一个字符
/\s*{/
(W regexp) (仅在 use re 'strict'
下)
在正则表达式模式中,use re 'strict'
范围内,您包含了一个未转义的 }
或 ]
,它们被解释为字面量。这两个字符有时是元字符,有时是字面量,具体取决于模式中它们前面的内容。这与类似的 )
不同,除非转义,否则它始终是元字符。
这种远程操作,可能是远距离操作,会导致 Perl 默默地误解您的意图,因此,当您通过 use re 'strict'
指定您想要额外的检查时,就会生成此警告。如果您将该字符作为字面量,只需在该字符前面加上反斜杠来确认 Perl,或者将其变成一个方括号字符类(如 [}]
)。如果您将其作为对应 [
或 {
的结束符,您需要回顾模式以找出为什么没有发生这种情况。
(F) unexec() 例程由于某种原因失败。请联系您当地的 FSF 代表,他们很可能最初就将其置于此。
(F) 您有类似以下内容
(?[ | \p{Digit} ])
其中 "|"
是一个二元运算符,右侧有一个操作数,但左侧没有操作数。
(F) 您有类似以下内容
(?[ z ])
在 (?[ ])
中,不允许使用任何字面字符,除非它们位于一对内部方括号中,例如
(?[ [ z ] ])
另一种可能是您忘记了反斜杠。Perl 不够智能,无法弄清楚您真正想要的是什么。
(F) 您尝试使用除单个类名(可选地带有尾随版本号)以外的其他内容作为 class
:isa
属性的值。这使解析器感到困惑。
(S) 当 PERL_EXIT_WARN
在 PL_exit_flags
中设置时,调用了 exit() 或脚本以其他方式正常结束。
(S) 当 PERL_EXIT_WARN
在 PL_exit_flags
中设置时,调用了未捕获的 die()。
(F) 您有类似以下内容
(?[ ( \p{Digit} + ) ])
")"
放在错误的位置。显然,某些东西应该与数字组合在一起,或者 "+"
不应该在那里,或者类似的东西。Perl 无法弄清楚意图。
(F) 在解析扩展字符类时,在定义中遇到 ']' 字符,而 ']' 的唯一合法用法是作为 '])' 的一部分关闭字符类定义,您可能忘记了关闭括号,或者以其他方式混淆了解析器。
(F) 您有类似以下内容
(?[ \p{Digit} ( \p{Lao} + \p{Thai} ) ])
"("
前面应该有一个运算符,因为没有指示如何将数字与老挝语和泰语脚本中的字符组合在一起。
(S nonchar) Unicode 标准将某些代码点(例如 U+FFFE 和 U+FFFF)定义为非字符。这些是合法的代码点,但保留供内部使用;因此,应用程序不应尝试交换它们。应用程序可能根本不希望收到任何这些字符,收到它们可能会导致错误。如果您知道自己在做什么,可以通过 no warnings 'nonchar';
关闭此警告。
这实际上不是一个“严重”错误,但即使没有启用警告,也应该默认引发它,目前在 Perl 中执行此操作的唯一方法是将其标记为严重错误。
(F) Unicode 属性通配符看起来像一个分隔的正则表达式模式(全部包含在封闭的 \p{...}
的大括号内)。没有找到与起始分隔符匹配的结束分隔符。如果起始分隔符通过在前面加上反斜杠进行转义,则结束分隔符也必须进行转义。
(F) Unicode 字符串属性是指扩展为多个字符序列的属性。例如 \p{name=KATAKANA LETTER AINU P}
,它由序列 \N{KATAKANA LETTER SMALL H}
后跟 \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}
组成。扩展字符类 (?[...])
目前无法处理这些。
(S 代理) 您在不接受代理的上下文中使用了 UTF-16 代理。这些代码点,介于 U+D800 和 U+DFFF(含)之间,仅由 Unicode 用于 UTF-16。但是,Perl 在内部允许所有无符号整数代码点(高达您的平台上可用的大小限制),包括代理。但是,这些在输入或输出时会导致问题,这很可能是此消息的来源。如果您真的知道自己在做什么,可以通过 no warnings 'surrogate';
来关闭此警告。
(F) 在 Perl 5.12 及更高版本中,您执行了 省略号语句。这是一个裸露的 ...;
,旨在用于允许您概述要编写的代码,但尚未完成,类似于以下内容
sub not_done_yet {
my($self, $arg1, $arg2) = @_;
...
}
如果调用 not_done_yet()
,Perl 将在包含 ...
的行中以 Unimplemented
错误终止。
(F) 您在 \N{}
中使用的名称在 Perl 中未知。检查拼写。您可以说 use charnames ":loose"
以不必对标准 Unicode 名称中的空格、连字符和大写进行精确区分。(任何已创建的自定义别名必须精确指定,无论是否使用 :loose
。)如果 \N{}
不在相应 use charnames
的范围内,也可能会发生此错误。
(F) (*
后面跟着正则表达式编译器无法识别的内容。请检查您的拼写。
(P) Perl 即将在 $@
中打印错误消息,但即使尝试创建后,$@
变量也不存在。
(W locale) 您使用了 Perl 无法识别的区域设置类别,因此无法执行您的请求。请检查您是否使用的是有效的类别。如果是,请参阅 "perllocale 中的多线程",了解有关将此问题报告为错误以及在本地修改 Perl 以满足您的需求的建议。
(F) 3 参数 open() 的第二个参数不在有效模式列表中:<
、>
、>>
、+<
、+>
、+>>
、-|
、|-
、<&
、>&
。
(W layer) 尝试将未知层推送到 Perl I/O 系统。 (层负责在外部和内部表示之间转换数据。)请注意,某些层(例如 mmap
)并非在所有环境中都受支持。 如果您的程序没有明确请求失败的操作,则可能是环境变量 PERLIO 的值导致的。
(P) VMS 特有的错误。 Perl 在迭代 %ENV 之前读取其值,而其他人将一条消息插入了 Perl 预期的数据流中。 有人非常困惑,或者可能试图出于恶意目的破坏 Perl 对 %ENV 的填充。
(F) 正则表达式模式的结束分隔符后面的字母数字字符被 Perl 解释为正则表达式的修饰符标志。 您指定的其中一个标志无效。 这种情况可能发生的一种方式是,您没有在正则表达式的末尾和后面的字母数字运算符之间放置空格
if ($a =~ /foo/and $bar == 3) { ... }
"a"
是一个有效的修饰符标志,但 "n"
不是,并引发此错误。可能本意是
if ($a =~ /foo/ and $bar == 3) { ... }
(W) 您尝试使用 "re" 指令的未知子指令。
(F) (?(condition)if-clause|else-clause) 结构的条件部分未知。条件必须是以下之一
(1) (2) ... true if 1st, 2nd, etc., capture matched
(<NAME>) ('NAME') true if named capture matched
(?=...) (?<=...) true if subpattern matches
(*pla:...) (*plb:...) true if subpattern matches; also
(*positive_lookahead:...)
(*positive_lookbehind:...)
(*nla:...) (*nlb:...) true if subpattern fails to match; also
(*negative_lookahead:...)
(*negative_lookbehind:...)
(?{ CODE }) true if code returns a true value
(R) true if evaluating inside recursion
(R1) (R2) ... true if directly inside capture group 1, 2,
etc.
(R&NAME) true if directly inside named capture
(DEFINE) always false; for defining named subpatterns
The <-- HERE 指示正则表达式中发现问题的所在。参见 perlre。
(F) 您指定了一个未知的 Unicode 选项。有关已知选项的列表,请参阅 perlrun 文档中的 -C
开关。
(F) 您指定了一个未知的 Unicode 选项。有关已知选项的列表,请参阅 perlrun 文档中的 -C
开关。
(F) 您指定在 \p{...}
中使用一个属性,该属性在语法上是一个有效的用户定义属性,但在需要进行处理时没有找到它的定义。请检查您的拼写。请参阅 "perlunicode" 中的 "用户定义字符属性"。
(F) 您可能输入错误,或者在模式中打开的花括号后错误地放置了 *
量词。请检查模式并查看 perlre 以了解合法动词模式的详细信息。
(F) 由 warnings
指令发出的错误。您指定了一个 perl 在此时未知的警告类别。
请注意,如果您要启用由模块注册的警告类别(例如 use warnings 'File::Find'
),则必须首先加载此模块。
(F) 字符类周围的方括号必须匹配。如果您希望在字符类中包含一个右方括号,请对其进行反斜杠转义或将其放在首位。 <-- HERE 显示了在正则表达式中发现问题的位置。请参阅 perlre。
(F) 在正则表达式中,未转义的括号必须始终成对出现。如果您是 vi 用户,% 键对于查找匹配的括号非常有用。 <-- HERE 显示了在正则表达式中发现问题的位置。请参阅 perlre。
(F) 词法分析器计算出的闭合花括号或方括号数量多于打开的数量,因此您可能缺少匹配的打开括号。一般来说,您会在最后编辑的地方附近找到缺少的括号(打个比方)。
(W reserved) 您使用了一个裸字,它可能在将来被用作保留字。最好将此类单词用引号括起来,或以某种方式将其大写,或在其中插入下划线。您也可以将其声明为子例程。
(F) Perl 解析器不知道在您的 Perl 脚本(或 eval)中指定列附近的指定字符该怎么做。也许您尝试运行压缩脚本、二进制程序或目录作为 Perl 程序。
(F) 您尝试向 class
定义添加命名属性,但 perl 不识别请求的属性名称。
(F) 您在字符类中使用了 Perl 不识别的反斜杠字符组合。当字符类在 (?[ ])
中使用时,这是一个致命错误。
(W regexp) 您在字符类中使用了 Perl 不识别的反斜杠字符组合。该字符被理解为字面意思,但这可能会在 Perl 的未来版本中发生变化。 <-- HERE 显示了在正则表达式中发现转义符的位置。
(W misc) 您使用了 Perl 不识别的反斜杠字符组合。该字符被理解为字面意思,但这可能会在 Perl 的未来版本中发生变化。
(W regexp) 您使用了 Perl 不识别的反斜杠字符组合。这些字符被理解为字面意思,但这可能会在 Perl 的未来版本中发生变化。 <-- HERE 显示了在正则表达式中发现转义符的位置。
(F) 您尝试向 field
定义添加命名属性,但 perl 不识别请求的属性名称。
(F) 您为 kill() 函数指定了一个无法识别的信号名称。在您的 shell 中输入 kill -l
以查看系统上的有效信号名称。
(F) 您为 Perl 指定了一个非法选项。不要这样做。(如果您认为您没有这样做,请检查 #! 行,看看它是否代表您提供了错误的开关。)
(W newline) 在文件名上尝试了文件操作,并且该操作失败,可能是因为文件名包含换行符,可能是因为您忘记了使用 chomp() 将其删除。请参阅 "perlfunc 中的 chomp"。
(F) 您的机器不支持 opendir() 和 readdir()。
(F) 您的机器似乎没有实现该函数。至少 Configure 认为没有。
(F) 您使用的可执行文件版本不支持 fork。
请注意,在某些系统(如 OS/2)下,可能存在不同版本的 Perl 可执行文件,其中一些可能支持 fork,而另一些则不支持。尝试更改您调用的 Perl 的名称,例如 perl_
、perl__
等。
(F) 您的程序文件以 Unicode 字节顺序标记 (BOM) 开头,该标记声明它使用 Perl 无法读取的 Unicode 编码。
(F) 您的机器不支持 Berkeley 套接字机制,或者至少 Configure 认为不支持。
(F) 您使用了 (*...:...)
形式的模式,但没有用 )
终止该模式。请修正该模式并重试。
(F) 词法分析器在属性开头发现了一些不是简单标识符的东西,而且它也不是分号或代码块的开头。也许您过早地终止了前一个属性的参数列表。请参阅 属性。
(F) 词法分析器在解析属性列表时看到了一个左括号字符,但没有找到匹配的右括号字符。您可能需要添加(或删除)一个反斜杠字符来使您的括号平衡。请参阅 属性。
(F) 传递给 unpack("w",...) 的参数与 BER 压缩整数格式不兼容,无法转换为整数。请参阅 "pack" in perlfunc。
(F) 您使用了 (*...)
形式的模式,但没有用 )
终止该模式。请修正该模式并重试。
(F) 当这里文档标签有初始引号但缺少最终引号时,会出现此消息。也许你写了
<<"foo
而不是
<<"foo"
(F) 在正则表达式中,你有一个 \g
没有被正确的组引用跟随。在 \g{
的情况下,缺少闭合大括号;否则 \g
必须跟随一个整数。修复模式并重试。
(F) 词法分析器在预期为项的地方看到了左尖括号,因此它正在寻找相应的右尖括号,但没有找到。您可能在该行的前面遗漏了一些必要的括号,而您实际上是想使用 "小于" 符号。
(F) 你使用了 (*VERB:ARG)
形式的模式,但没有用 )
结束模式。修复模式并重试。
(F) 你使用了 (*VERB)
形式的模式,但没有用 )
结束模式。修复模式并重试。
(W untie) 当调用 untie
时,从 tie
(或 tied
)返回的对象的副本仍然有效。
(F) 你使用不正确的参数调用了 POSIX 函数。有关更多信息,请参阅 "POSIX 中的 FUNCTIONS"。
(F) 你使用不正确的参数调用了 Win32 函数。有关更多信息,请参阅 Win32。
(W syntax) 你在比较中使用了 $[
,例如
if ($[ > 5.006) {
...
}
你可能想使用 $]
而不是 $[
。$[
是用于索引数组的基数。$]
是十进制的 Perl 版本号。
(F) 第二个列出的结构不再合法。请使用第一个结构。
(W misc) 您将值赋给了左值子程序,但子程序返回的是一个即将被丢弃的临时标量,因此赋值没有效果。
(W regexp) 您使用了内部修饰符,例如 (?-o),除非从整个正则表达式中删除,否则它没有意义。
if ($string =~ /(?-o)$pattern/o) { ... }
必须写成
if ($string =~ /$pattern/) { ... }
The <-- HERE 指示正则表达式中发现问题的所在。参见 perlre。
(W syntax) 左值(例如 local($x=10)
)的本地化是合法的,但实际上 local()
目前没有效果。这在将来可能会改变,但在此期间,不鼓励使用此类代码。
(W regexp) 您使用了内部修饰符,例如 (?o),除非应用于整个正则表达式,否则它没有意义。
if ($string =~ /(?o)$pattern/) { ... }
必须写成
if ($string =~ /$pattern/o) { ... }
The <-- HERE 指示正则表达式中发现问题的所在。参见 perlre。
(W misc) const
属性除了对匿名闭包原型之外没有其他效果。您通过 attributes.pm 将其应用于子程序。这仅在匿名子程序的属性处理程序中才有用。
(W misc) 您在搜索列表与替换列表长度相同时使用了 /d 修饰符。有关 /d 修饰符的更多信息,请参见 perlop。
(W misc) 您在双引号字符串中使用了 \E,但前面没有 \U
、\L
或 \Q
。
(W regexp) 您指定了类似以下内容
qr/a{3}?/
qr/b{1,1}+/
"?"
和 "+"
没有任何效果,因为它们修改了在有选择时匹配更多或更少的内容,而通过指定匹配确切的给定数量,就没有空间留给选择。
(W scalar) 你做了一些事情,其唯一有趣的返回值是一个列表,但在标量上下文中没有副作用,而标量上下文不接受列表。
例如
my $x = sort @y;
这没什么用,perl 目前会优化掉它。
(W void) 你做了一些事情,在空上下文中没有副作用,比如一个不从代码块返回值的语句,或者一个标量逗号运算符的左侧。这通常不是因为你的愚蠢,而是因为 Perl 无法以你认为的方式解析你的程序。例如,如果你把 C 的优先级和 Python 的优先级混淆了,并说
$one, $two = 1, 2;
而你的意思是
($one, $two) = (1, 2);
另一个常见的错误是使用普通括号来构建列表引用,而应该使用方括号或花括号,例如,如果你说
$array = (1,2);
而你应该说
$array = [1,2];
方括号明确地将列表值转换为标量值,而圆括号则不会。因此,当一个带括号的列表在标量上下文中被求值时,逗号被视为 C 的逗号运算符,它会丢弃左边的参数,这不是你想要的。有关更多信息,请参阅 perlref。
对于等于 0 或 1 的数值常量,不会发出此警告,因为它们经常用于以下语句中
1 while sub_with_side_effects();
会对通常会计算为 0 或 1 的字符串常量发出警告。
(W regexp) p
修饰符一旦设置就不能关闭。尝试这样做是徒劳的。
(W) 你在没有参数的情况下使用了 use re;
。这没什么用。
(W syntax) 你使用了 push() 或 unshift() 函数,除了数组之外没有其他参数,比如 push(@x)
或 unshift(@foo)
。这通常不会对数组有任何影响,因此完全没有用。原则上,如果数组绑定到一个实现了 PUSH 方法的类,则 push(@tied_array) 可能会有所影响。如果是这样,你可以写成 push(@tied_array,())
来避免此警告。
(F) "use" 关键字在编译时被识别并执行,并且不返回任何有用的值。参见 perlmod。
(S experimental::args_array_with_signatures) 在使用签名的子例程中,发现了一个涉及 @_
参数数组的表达式。这是实验性的,因为参数数组和通过签名进行参数处理之间的交互在 Perl 的任何未来版本中都不保证保持稳定,因此应避免此类代码。
(F) 现在,如果您希望使用空行作为 here-document 的终止符,则必须使用显式引用的形式。
在 Perl 5.000 中,使用裸终止符已被弃用,并且从 Perl 5.28 开始,它是一个致命错误。
(W regexp) 您在替换中使用了 /c 修饰符。/c 修饰符目前在替换中没有意义。
(W regexp) 您在正则表达式操作数中使用了 /c 修饰符,但没有使用 /g 修饰符。目前,/c 只有在使用 /g 时才有意义。(这在将来可能会改变。)
(F) 您使用了不允许的代码点,因为它太大。Unicode 仅允许代码点最大为 0x10FFFF,但 Perl 允许更大的代码点。早期的 Perl 版本允许代码点超过 IV_MAX(在 32 位平台上为 0x7FFFFFF,在 64 位平台上为 0x7FFFFFFFFFFFFFFF),但是,这可能会在某些结构中破坏 perl 解释器,包括在某些情况下导致其挂起。
如果您的代码要在各种平台上运行,请记住,上限取决于平台。在 64 位字长上比 32 位字长要大得多。
在 Perl 5.24 中,使用超出范围的代码点已被弃用,并且在 Perl 5.28 中成为致命错误。
(S internal) 插入后 each()
的行为是未定义的;它可能会跳过项目,或者多次访问项目。考虑使用 keys()
而不是 each()
。
(F) my $x := 42
的构造曾经被解析为等同于 my $x : = 42
(将空属性列表应用于 $x
)。此构造在 5.12.0 中已被弃用,现在已成为语法错误,因此 :=
将来可以作为新运算符使用。
如果您需要空属性列表,例如在代码生成器中,请在 =
之前添加一个空格。
(W locale) 您正在使用本地化规则匹配正则表达式,并且遇到了指定的构造。此构造仅对 UTF-8 本地化有效,而当前本地化并非如此。这没有意义。Perl 将继续执行,假设 Unicode (UTF-8) 本地化,但结果可能不正确。
(F) 您是否在循环中修改了迭代数组?此错误通常由以下代码引起
@a = (3,4);
@a = () for (1,2,@a);
您不应该在迭代数组时修改它们。出于速度和效率的原因,Perl 在内部不会对迭代项进行完整的引用计数,因此在迭代过程中删除此类项会导致 Perl 看到已释放的值。
(W regexp) 您在 split
运算符的模式上使用了 /g 修饰符。由于 split
始终尝试重复匹配模式,因此 /g
没有任何效果。
(D deprecated::goto_construct) 使用 goto
从外部作用域跳转到内部作用域已被弃用,应避免使用。
这在 Perl 5.12 中已被弃用。
(D deprecated::unicode_property_name) 一些属性已被 Unicode 弃用,并可能最终从标准中删除,届时 Perl 将随之改变。在此期间,此消息将被发出以通知您。
(F) 作为一项意外功能,AUTOLOAD
子例程被视为方法(使用 @ISA
层次结构),即使要自动加载的子例程被调用为普通函数(例如 Foo::bar()
),而不是方法(例如 Foo->bar()
或 $obj->bar()
)。
这在 Perl 5.004 中被弃用,并在 Perl 5.28 中变为致命错误。
(F) 您尝试使用 printf 的一项功能,该功能只能从 C 访问。这通常意味着在 Perl 中有更好的方法来实现它。
(D deprecated::delimiter_will_be_paired) 您在 use feature 'extra_paired_delimiters'
的作用域之外使用给定字符作为字符串的起始分隔符。此字符是另一个 Unicode 字符的镜像;在该功能的作用域内,这两个字符被视为一对,用于分隔字符串。计划将该功能设置为默认值,届时这种用法将变得非法;因此会出现此警告。
目前,您可以忍受此警告,或将其关闭,但此代码在未来的 Perl 版本中将无法编译。或者,您可以打开 use feature 'extra_paired_delimiters'
并使用此字符的镜像字符作为结束字符串分隔符。
(S experimental::extra_paired_delimiters) 如果您使用 use feature 'extra_paired_delimiters'
启用的非 ASCII 镜像字符之一作为字符串分隔符,则会发出此警告。如果您想使用该功能,只需抑制警告,但请注意,这样做会冒使用实验性功能的风险,该功能可能会在未来的 Perl 版本中更改或删除。
(F) 您在使用通配符子模式作为 Unicode 属性值时,子模式中包含了非法内容。并非所有正则表达式功能在这些子模式中都是合法的,而这正是其中之一。请重写您的子模式,不要使用违规的结构。请参见 "perlunicode 中的通配符属性值"。
(W io) 文件句柄代表一个已打开的文件,当您打开文件时,它已经越过了您可能正在尝试查找的任何符号链接。该操作返回了 undef
。请使用文件名。
(W misc) 您尝试使用引用作为数组索引;这可能不是您的本意,因为引用在数值上下文中往往是巨大的数字,因此通常表明程序员错误。
如果您确实想要这样做,请显式地将您的引用转换为数字,例如:$array[0+$ref]
。但是,此警告不会针对重载对象发出,因为您可以重载数字化和字符串化运算符,然后您可能知道自己在做什么。
(F) 您尝试在包含代码点超过 0xFF 的字符串上使用字符串按位运算符(&
或 |
或 ^
或 ~
)。字符串按位运算符将其操作数视为字节字符串,而超过 0xFF 的值在这种情况下毫无意义。
某些实例在 Perl 5.28 中变为致命错误;其他实例在 perl 5.32 中变为致命错误。
(F) 您尝试在包含代码点超过 0xFF 的字符串上使用 vec
,这在此处毫无意义。
这在 Perl 5.32 中变为致命错误。
(W taint, 已弃用) 您向 system()
或 exec()
提供了多个参数,其中至少有一个被污染。这在以前是允许的,但在未来的 Perl 版本中将成为致命错误。请对您的参数进行去污染。参见 perlsec。
(F) 音素是指语言的母语使用者所感知的字符。在 Unicode(以及 Perl)中,音素实际上可能是几个相邻的字符,它们一起构成一个完整的音素。例如,可以有一个基本字符,如 "R",以及一个重音,如一个抑扬符 "^",它们在显示时看起来像是一个带有抑扬符悬停在 "R" 上的单个字符。Perl 目前允许将诸如抑扬符之类的字符用作字符串、模式等的定界符。在显示时,抑扬符看起来像是属于它左侧的字符。为了使语言能够接受音素作为定界符,我们不能允许使用本身不是音素的定界符。此外,定界符必须已经被分配(或已知永远不会被分配),以尝试使代码具有未来兼容性,否则,今天有效的代码将在当前未分配的定界符最终成为非独立音素时无法编译。由于 Unicode 永远不会分配 非字符代码点,也不分配 超过合法 Unicode 最大值的代码点,因此它们可以作为定界符,并且使用它们是合法的。
(W uninitialized) 未定义的值被用作已定义的值。它被解释为 "" 或 0,但这可能是一个错误。要抑制此警告,请为您的变量分配一个已定义的值。
为了帮助您找出哪些值未定义,Perl 将尝试告诉您未定义变量的名称(如果有)。在某些情况下,它无法做到这一点,因此它还会告诉您在什么操作中使用了未定义的值。但是请注意,Perl 会优化您的程序,并且警告中显示的操作不一定在您的程序中字面上出现。例如,"that $foo"
通常被优化为 "that " . $foo
,并且警告将引用 连接 (.)
运算符,即使您的程序中没有 .
。
(S experimental::re_strict) 当正则表达式模式在 'strict'
下编译时,不同的内容可能会在未来的 Perl 版本中以不兼容的方式发生变化。这意味着今天编译的模式可能在未来的 Perl 版本中无法编译。此警告是为了提醒您这种风险。
(F) 在正则表达式中,你说了一些类似于
(?[ [ \xBEEF ] ])
Perl 不确定你是指这个
(?[ [ \x{BEEF} ] ])
还是指这个
(?[ [ \x{BE} E F ] ])
你需要添加花括号或空格来消除歧义。
(W regexp) 命名的 Unicode 字符转义序列 (\N{...})
可能返回一个多字符序列。即使字符类应该只匹配一个输入字符,perl 也会正确匹配整个序列,除非该类被反转 ([^...]
),或者转义序列是范围的开始或结束点。对于这些情况,应该发生什么并不清楚。在这些情况下,Perl 会丢弃除返回序列的第一个字符之外的所有字符,这可能不是你想要的。
(W regexp) 扩展字符类目前无法处理评估结果超过一个字符的操作数。这些操作数将从 \p{}
的展开结果中删除。
这种情况可能发生在例如
(?[ \p{name=/KATAKANA/} ])
"KATAKANA LETTER AINU P" 是一个合法的 Unicode 名称(技术上是一个“命名序列”),但实际上是两个字符。上面的表达式只会匹配表示单个字符的 KATAKANA 的 Unicode 名称。
(W regexp) 你在正则表达式的部分中使用了 Unicode 边界 (\b{...}
或 \B{...}
),而字符集修饰符 /a
或 /aa
生效。这两个修饰符表示 ASCII 解释,这对于 Unicode 定义没有意义。生成的正则表达式将编译为边界使用所有 Unicode。正则表达式的其他部分不受影响。
(F) 使用 !~
运算符与 s///r
、tr///r
或 y///r
目前保留供将来使用,因为确切的行为尚未确定。(简单地返回修改字符串的布尔值相反通常没有特别有用。)
(S 代理) 您在不接受代理的上下文中使用了 UTF-16 代理。这些代码点,介于 U+D800 和 U+DFFF(含)之间,仅由 Unicode 用于 UTF-16。但是,Perl 在内部允许所有无符号整数代码点(高达您的平台上可用的大小限制),包括代理。但是,这些在输入或输出时会导致问题,这很可能是此消息的来源。如果您真的知道自己在做什么,可以通过 no warnings 'surrogate';
来关闭此警告。
(W misc) 在条件表达式中,您使用了 <HANDLE>、<*> (glob)、each()
或 readdir()
作为布尔值。这些结构中的每一个都可能返回一个值为“0”的值;这将使条件表达式为假,这可能不是您的本意。在条件表达式中使用这些结构时,请使用 defined
运算符测试它们的值。
(W misc) VMS 特有的警告。Perl 试图从 CLI 符号表中读取 %ENV 元素的值,并发现结果字符串超过 1024 个字符。返回值已被截断为 1024 个字符。
(W closure) 在编译期间,内部命名子程序或 eval 试图捕获当前不可用的外部词法变量。这可能由于以下两种原因之一。首先,外部词法变量可能在尚未创建的外部匿名子程序中声明。(请记住,命名子程序在编译时创建,而匿名子程序在运行时创建。)例如,
sub { my $a; sub f { $a } }
在创建 f 时,它无法捕获 $a 的当前值,因为匿名子程序尚未创建。相反,以下代码不会发出警告,因为匿名子程序现在已经创建并处于活动状态
sub { my $a; eval 'sub f { $a }' }->();
第二种情况是由 eval 访问已超出范围的变量引起的,例如,
sub f {
my $a;
sub { eval '$a' }
}
f()->();
这里,当编译 eval 中的“$a”时,f() 当前未执行,因此它的 $a 不可用于捕获。
(S misc) 在“use strict”生效的情况下,您引用了一个全局变量,您似乎认为它是从另一个模块导入的,因为另一个同名变量(通常是子程序)由该模块导出。这通常意味着您在变量前面放错了奇怪的字符。也有可能您使用了作用域已结束的“our”变量。
(F) 从 Perl 5.30 开始,此消息不再应该被引发。为了方便使用早期 Perl 版本的用户,此消息保留在此文档中。
在 Perl 5.30 及更早版本中,仅允许对编译时长度固定且已知的子表达式使用后顾。对于正向后顾,您可以使用 `\K` 正则表达式构造来获得等效的功能。请参阅 (?<=pattern) 和 \K 在 perlre 中。
从 Perl 5.18 开始,在 `i` 下存在一些不明显的 Unicode 规则,这些规则可能会以可变的方式匹配,但您可能认为它们不会匹配。例如,子字符串 `“ss”` 可以匹配单个字符 LATIN SMALL LETTER SHARP S。以下是目前影响 ASCII 字符的完整列表
ASCII
sequence Matches single letter under /i
FF U+FB00 LATIN SMALL LIGATURE FF
FFI U+FB03 LATIN SMALL LIGATURE FFI
FFL U+FB04 LATIN SMALL LIGATURE FFL
FI U+FB01 LATIN SMALL LIGATURE FI
FL U+FB02 LATIN SMALL LIGATURE FL
SS U+00DF LATIN SMALL LETTER SHARP S
U+1E9E LATIN CAPITAL LETTER SHARP S
ST U+FB06 LATIN SMALL LIGATURE ST
U+FB05 LATIN SMALL LIGATURE LONG S T
此列表可能会更改,但可能性很小。每个 ASCII 序列可以是大小写字母的任意组合。
您可以通过在后顾断言中使用带括号的字符类来避免这种情况,例如
(?<![sS]t)
(?<![fF]f[iI])
这会欺骗 Perl 不匹配连字。
对于从 5.16 开始的 Perl,如果您只关心 ASCII 匹配,另一个选择是在正则表达式中添加 `aa` 修饰符。这将排除所有这些不明显的匹配,从而消除此消息。您也可以说
use if $] ge 5.016, re => '/aa';
将 `aa` 应用于其作用域内编译的所有正则表达式。请参阅 re。
(W) 带捕获的变长正向后顾定义不明确。此警告提醒您,您正在使用一种在 Perl 的未来版本中可能会更改的构造。有关详细信息,请参阅 perlre 中正向后顾的文档。您可以使用以下方法消除此警告
no warnings 'experimental::vlb';
(W) 具有捕获功能的可变长度负向后顾不确定。此警告提醒您正在使用在 Perl 的未来版本中可能发生更改的结构。有关详细信息,请参阅 perlre 中的负向后顾文档。您可以使用以下方法消除此警告
no warnings 'experimental::vlb';
(W shadow) 在当前作用域或语句中重新声明了 "my"、"our" 或 "state" 变量,实际上消除了对先前实例的所有访问。这几乎总是打字错误。请注意,之前的变量将一直存在到作用域结束或所有对它的闭包引用被销毁为止。
(A) 您不小心通过 csh 而不是 Perl 运行了您的脚本。检查 #! 行,或者手动将您的脚本输入 Perl。
(W closure) 内部(嵌套)的 *命名* 子例程正在引用外部命名子例程中定义的词法变量。
当调用内部子例程时,它将看到外部子例程变量的值,该值是在 *第一次* 调用外部子例程之前和期间的;在这种情况下,在第一次调用外部子例程完成后,内部和外部子例程将不再共享变量的公共值。换句话说,该变量将不再共享。
此问题通常可以通过使内部子例程匿名来解决,使用 sub {}
语法。当创建引用外部子例程中变量的内部匿名子例程时,它们会自动重新绑定到这些变量的当前值。
(S printf) %vd (s)printf 格式不支持具有 alpha 部分的版本对象。
(F) 您使用了需要参数的动词模式。提供一个参数或检查您是否使用了正确的动词。
(F) 您使用了不允许带参数的动词模式。请移除参数或检查您是否使用了正确的动词。
(F) 解析器发现了一行以 <<<<<<<
、>>>>>>>
或 =======
开头。这些可能是由版本控制系统在合并操作失败后留下的冲突标记。
(P) 将 use Module n.n LIST
语句转换为等效的 BEGIN
块时,发现版本号存在内部不一致。
(W misc) 版本字符串末尾包含无效字符,这些字符将被忽略。
(W) 您向 warn() 传递了一个空字符串(等效于 warn ""
)或在没有参数的情况下调用它,并且 $@
为空。
(S) open() 执行的隐式 close() 在关闭时遇到了错误指示。这通常表示您的文件系统已用完磁盘空间。
(S io) 在文件句柄的引用计数达到零但仍处于打开状态时,在执行隐式 close() 时出现了错误,例如:
{
open my $fh, '>', $file or die "open: '$file': $!\n";
print $fh $data or die "print: $!";
} # implicit close here
由于各种错误可能只在 close() 时被检测到(例如,缓冲可能允许此示例中的 print
返回 true,即使磁盘已满),因此忽略其结果很危险。因此,当它隐式发生时,perl 将通过警告来发出错误信号。
在 5.22.0 版本之前,perl 会忽略此类错误,因此上面显示的常见习惯用法可能会导致静默数据丢失。
(S 模糊) 您在单目运算符后面写了一个看起来像二元运算符的东西,它也可以被解释为一个项或单目运算符。例如,如果您知道 rand 函数有一个默认参数 1.0,并且您写道
rand + 5;
您可能认为您写了与以下相同的东西
rand() + 5;
但实际上,您得到了
rand(+5);
所以用括号来说明您的真实意图。
(D 已弃用::智能匹配) when
依赖于智能匹配,智能匹配已被弃用。此外,它有几个可能不立即显而易见的特殊情况,并且将在 Perl 5.42 中删除。请参阅 "perlsyn 中关于 given 和 when 的实验细节" 中的解释。
(S utf8) Perl 在没有预期的情况下遇到了一个宽字符(序数 > 255)。默认情况下,此警告针对 I/O(如 print)启用。
如果此警告来自 I/O,最简单的静默方式是简单地添加 :utf8
层,例如 binmode STDOUT, ':utf8'
。另一种关闭警告的方法是添加 no warnings 'utf8';
,但这更像是作弊。通常,您应该显式地用编码标记文件句柄,请参阅 open 和 "perlfunc 中的 binmode"。
如果警告来自 I/O 以外的地方,则此诊断可能表明正在获得不正确的结果。您应该检查您的代码以确定宽字符是如何到达无法处理它们的运算的。
(W 本地化) 在单字节本地化(即非 UTF-8 本地化)中,遇到多字节字符。Perl 将此字符视为指定的 Unicode 代码点。组合非 UTF-8 本地化和 Unicode 是危险的。几乎可以肯定,某些字符将具有两种不同的表示形式。例如,在 ISO 8859-7(希腊语)本地化中,代码点 0xC3 表示大写伽马。但 0x393 也是如此。这将使字符串比较不可靠。
您可能需要弄清楚这个多字节字符是如何与您的单字节本地化混淆的(或者您可能认为您有一个 UTF-8 本地化,但 Perl 不同意)。
(F) 仅当 TEMPLATE
始终匹配从模板本身可以确定的相同数量的打包字节时,(un)pack 模板中的计数才能被 [TEMPLATE]
替换。如果它包含任何代码 @、/、U、u、w 或 *-length,则这是不可能的。重新设计模板。
(W 语法) @ISA
可能包含拼写错误或从未加载的包名,这会导致 Perl 选择意外的父类方法来解析方法调用。如果这是故意的,你可以执行类似的操作
@Missing::Package::ISA = ();
来消除警告,否则你应该更正包名,或确保在方法调用之前加载该包。
(S 杂项) 某些操作对负数参数没有意义。会发出警告,并且不会执行该操作。
(W closed) 你正在写入的文件句柄在之前某个时间点被关闭了。请检查你的控制流程。
(S utf8) 在读取不同编码时,Perl 会尝试将所有内容映射到 Unicode 字符。你读取的字节在此编码中是非法的。例如
utf8 "\xE4" does not map to Unicode
如果你尝试将带分音符的拉丁字母 a (ä) 作为 UTF-8 读取。
(F) 你有一个 (un)pack 模板,它指定了在要 (un)pack 的字符串开头之前的相对位置。请参阅 "perlfunc 中的 pack"。
(F) 你有一个 unpack 模板,它指定了在要解包的字符串末尾之后的相对位置。请参阅 "perlfunc 中的 pack"。
(F) 而且你可能永远不会禁用,因为你可能没有内核源代码,而且你的供应商可能不在乎你想要什么。在任何有 SET-ID 脚本的地方都存在漏洞,要关闭它,你需要从你尝试运行的脚本中删除 SET-ID 位。要实际运行 SET-ID 脚本,最好的方法是在你的脚本周围添加一个 SET-ID C 包装器。
(W 语法) 你将一个裸字分配为信号处理程序名称。不幸的是,你已经声明了一个同名的子例程,这意味着 Perl 5 会尝试在执行赋值时调用该子例程,这可能不是你想要的。(如果这是你想要的,请在前面加上 &。)
(F) 当尝试初始化哈希的随机种子时,Perl 无法从你的系统中获取任何随机性。这通常表明存在非常严重的问题。
(F) 命名的 Unicode 字符转义序列 (\N{...}
) 可能会返回一个零长度序列。这种转义序列被用在扩展字符类中,即 (?[...])
,或者在 use re 'strict'
下,这是不允许的。请检查是否使用了正确的转义序列,以及是否在作用域内使用了正确的 charnames 处理程序。 <-- HERE 显示了在正则表达式中发现问题的具体位置。