Посмотрите на 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 вывешивают.
Я предполагаю, что вы спрашиваете о «нулевой» части конкретно, не так ли? – ikegami
Я бы ожидал «Использование неинициализированного значения в записи подпрограммы» для предупреждения от XS. Я не знаю, почему это говорит «пустота». – ikegami
@ikegami - да, я очень конкретно пытаюсь понять, что означает это точное сообщение об ошибке, сформулированное точно так же, как в заголовке. – user18597