2013-02-15 36 views
4

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

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

+0

我想你是专门问“零”部分吧? – ikegami 2013-02-15 07:10:52

+0

我期望“在子程序入口中使用未初始化的值”来获得XS的警告。我不知道它为什么会说“无效”。 – ikegami 2013-02-15 07:23:38

+0

@ikegami - 是的,我非常特别想知道这个确切的错误信息,正如在标题中那样,意味着什么。 – user18597 2013-02-15 07:42:03

回答

2

查找范围perldoc perldiag为“使用未初始化值”。

  • Use of uninitialized value%s

    (W未初始化)一个未定义的值,好像它已经被定义而使用。它被解释为“”或0,但也许这是一个错误。要抑制此警告,请为您的变量分配一个定义的值。

    为了帮助你找出什么是不确定的,PERL会尽量告诉你变量的名称(如果有的话),这是不确定的。在某些情况下,它不能做到这一点,所以它也告诉您。请注意使用何种操作未定义的值,但是,perl的优化程序ANID在警告中显示不一定在你的程序逐字显示操作。例如,“那$ 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。空操作似乎是操作码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的内部大师们的一些类似的地方。

+0

我相信他特意提到“null”。 XS编码器确实知道消息的一般形式。你应该删除你的答案,鼓励有合法答案的人阅读这个问题。 – ikegami 2013-02-15 07:08:40

+0

我想感谢Jonathon Leffler为解决这个问题所做的努力,包括查看Perl源代码。然而,诚实的事实是我仍然很困惑。我认为你的建议尝试Perl僧侣是一个有效的和有用的。 – user18597 2013-02-15 09:02:31

+0

http://perldoc.perl.org/perlguts.html#Compile-pass-2:-context-propagation – snailplane 2013-02-15 10:26:54

相关问题