perldoc perldiag
「初期化されていない値の使用」を調べてください。
Use of uninitialized value%s
(W uninitialized) 未定義の値が既に定義されているかのように使用されました。"" または 0 として解釈されましたが、間違っている可能性があります。この警告を抑制するには、変数に定義済みの値を割り当てます。
何が未定義であったかを理解するのを助けるために、perl は (もしあれば) 未定義であった変数の名前を教えようとします。場合によってはこれを行うことができないため、未定義の値を使用した操作も通知します。ただし、perl はプログラムを最適化し、警告に表示された操作がプログラムにそのまま表示されるとは限らないことに注意してください。たとえば、「that $foo」は通常、「that」に最適化されます。$foo であり、. がない場合でも、警告は連結 (.) 演算子を参照します。あなたのプログラムで。
興味深い部分は、「in null 操作」が何を意味するかを解明することです。次のように単純ではありません。
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 操作はオペコード 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 の内部の専門家がたむろしている同様の場所に尋ねたほうがよいと思います。