2013-02-15 2 views
4

Что означает сообщение об ошибке «Использование неинициализированного значения в нулевой операции» в Perl?В чем смысл сообщения об ошибке «Использование неинициализированного значения в нулевой операции» в Perl?

Я нашел это много и нашел много страниц, на которых люди обсуждали ошибку этой формы. Однако, несмотря на мои поиски, я не мог понять, что это означает. Обратите внимание: у меня нет исходного кода, который я могу предоставить, который демонстрирует эту ошибку, поскольку он встречается только в тестовом скрипте при работе под «Test :: More» и включает в себя большое количество кода XS. Я хотел бы получить представление о том, что может означать это сообщение об ошибке.

+0

Я предполагаю, что вы спрашиваете о «нулевой» части конкретно, не так ли? – ikegami

+0

Я бы ожидал «Использование неинициализированного значения в записи подпрограммы» для предупреждения от XS. Я не знаю, почему это говорит «пустота». – ikegami

+0

@ikegami - да, я очень конкретно пытаюсь понять, что означает это точное сообщение об ошибке, сформулированное точно так же, как в заголовке. – user18597

ответ

2

Посмотрите на perldoc perldiag на "Использование неинициализированного значения".

  • Use of uninitialized value%s

    (Вт неинициализированным) Неопределенное значение было использовано, как если бы она была уже определена. Это было интерпретировано как «" или 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. Нулевая операция, как представляется, OpCode 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

Я считаю, что он спрашивает о «нулевом». Кодировщик XS точно знает, что означает общая форма сообщения. Вы должны удалить свой ответ, чтобы побудить людей с законным ответом на чтение вопроса. – ikegami

+0

Я хотел бы поблагодарить вас Джонатан Леффлер за усилия, которые вы предприняли, чтобы ответить на этот вопрос, в том числе просматривая исходный код Perl. Однако, честная истина заключается в том, что я все еще довольно озадачен. Я думаю, что ваше предложение попробовать Perl Monks является действительным и полезным. – user18597

+0

http://perldoc.perl.org/perlguts.html#Compile-pass-2:-context-propagation – snailplane

Смежные вопросы