4

エラーメッセージ「ヌル操作での初期化されていない値の使用」はPerlで何を意味しますか?

私はこれを広範囲にグーグルで検索し、人々がこのフォームのエラーについて議論している多くのページを見つけました. ただし、検索しても、これが示すエラー状態を理解できませんでした。注意: このエラーを示す共有できるソース コードはありません。これは、「Test::More」で実行しているときにテスト スクリプトでのみ発生し、大量の XS コードが含まれるためです。このエラー メッセージが何を意味するのかを知りたいと思います。

4

1 に答える 1

2

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 の内部の専門家がたむろしている同様の場所に尋ねたほうがよいと思います。

于 2013-02-15T07:03:04.373 に答える