Perl 中的错误消息“在空操作中使用未初始化的值”是什么意思?
我已经对此进行了广泛的搜索,并发现了许多人们讨论此表单错误的页面。但是,尽管我进行了搜索,但我仍然无法理解这表明什么错误情况。请注意:我没有可以共享的源代码来演示此错误,因为它仅在“Test::More”下运行时出现在测试脚本中,并且涉及大量 XS 代码。我只是想知道这个错误消息可能意味着什么。
Perl 中的错误消息“在空操作中使用未初始化的值”是什么意思?
我已经对此进行了广泛的搜索,并发现了许多人们讨论此表单错误的页面。但是,尽管我进行了搜索,但我仍然无法理解这表明什么错误情况。请注意:我没有可以共享的源代码来演示此错误,因为它仅在“Test::More”下运行时出现在测试脚本中,并且涉及大量 XS 代码。我只是想知道这个错误消息可能意味着什么。
查找perldoc perldiag
“使用未初始化的值”。
Use of uninitialized value%s
(W 未初始化)使用未定义的值,就好像它已经定义了一样。它被解释为“”或 0,但可能是一个错误。要抑制此警告,请为您的变量分配一个定义的值。
为了帮助您找出未定义的内容,perl 将尝试告诉您未定义的变量的名称(如果有的话)。在某些情况下它无法做到这一点,因此它还会告诉您在哪个操作中使用了未定义的值。但是请注意,perl 优化了您的程序,并且警告中显示的操作不一定会在您的程序中出现。例如,“that $foo”通常被优化为“that”。$foo ,警告将引用连接 (.) 运算符,即使没有 . 在你的程序中。
有趣的部分是弄清楚“in null operation”是什么意思。它不是那么简单:
my $x;
$x;
这得到:
Useless use of private variable in void context
在这个阶段,我不确定;您可以通过显示触发消息的 Perl 脚本来提供帮助。
查看 Perl 源代码(我通常避免这样做)后,有许多测试包含诸如 ( t/lib/dbmt_common.pl
) 之类的注释:
# Bug ID 20001013.009
#
# test that $hash{KEY} = undef doesn't produce the warning
# Use of uninitialized value in null operation
您还可以在 中找到对“空操作”的引用regen/opcodes
。空操作似乎是操作码 0。
# Nothing.
null null operation ck_null 0
stub stub ck_null 0
scalar scalar ck_fun s% S
# Pushy stuff.
pushmark pushmark ck_null s0
如果您查看opcode.h
,您会发现:
#ifndef DOINIT
EXTCONST char* const PL_op_name[];
#else
EXTCONST char* const PL_op_name[] = {
"null",
"stub",
"scalar",
"pushmark",
...
#ifndef DOINIT
EXTCONST char* const PL_op_desc[];
#else
EXTCONST char* const PL_op_desc[] = {
"null operation",
"stub",
"scalar",
"pushmark",
该文件cpan/Encode/lib/Encode/Encoding.pm
包含注释(在某些 POD 中):
=item -E<gt>renewed
Predefined As:
sub renewed { $_[0]->{renewed} || 0 }
Tells whether the object is renewed (and how many times). Some
modules emit C<Use of uninitialized value in null operation> warning
unless the value is numeric so return 0 for false.
我认为您最好在PerlMonks或 Perl 内部专家们常去的类似地方提问。