4

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

我已经对此进行了广泛的搜索,并发现了许多人们讨论此表单错误的页面。但是,尽管我进行了搜索,但我仍然无法理解这表明什么错误情况。请注意:我没有可以共享的源代码来演示此错误,因为它仅在“Test::More”下运行时出现在测试脚本中,并且涉及大量 XS 代码。我只是想知道这个错误消息可能意味着什么。

4

1 回答 1

2

查找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 内部专家们常去的类似地方提问。

于 2013-02-15T07:03:04.373 回答