在Perl中,错误消息“在null操作中使用未初始化的值”是什么意思?
我已经广泛搜索了这个,发现了很多页面,人们讨论了这种形式的错误.然而,尽管我的搜索,我一直无法理解这表明什么错误条件.请注意:我没有可以共享的源代码来演示此错误,因为它仅在“Test :: More”下运行时发生在测试脚本中,并且涉及大量的XS代码.我想知道这个错误消息可能意味着什么.
最佳答案 在
perldoc perldiag
中查找“使用未初始化的值”.
>使用未初始化的值%s
(W未初始化)使用未定义的值,就像它已经定义一样.它被解释为“”或0,但也许这是一个错误.要禁止此警告,请为变量分配定义的值.
为了帮助您找出未定义的内容,perl将尝试告诉您未定义的变量(如果有)的名称.在某些情况下,它无法执行此操作,因此它还会告诉您使用未定义值的操作.但是,请注意,perl会优化您的程序,并且警告中显示的操作可能不一定会出现在您的程序中.例如,“$foo”通常被优化为“那个”. $foo,警告将引用连接(.)运算符,即使没有.在你的程序中.
有趣的部分是弄清楚’无效操作’的含义.它不是那么简单:
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中找到对“null操作”的引用. null操作似乎是操作码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内部的大师们出去玩的类似地方.