在Perl中错误消息“在null操作中使用未初始化的值”是什么意思?

在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

如果你查看o​​pcode.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内部的大师们出去玩的类似地方.

点赞