7

いくつかのコードを書きましたが、エラーが何であるかわかりません。エラーが発生しています:

mksmksmks.pl 行 63 の連結 (.) または文字列での初期化されていない値の使用

私のコードは次のとおりです。

for(my $j = 0; $j < $num2; $j++) {
  print {$out} "$destination[$j]|$IP_one_1[$j]|$IP_one_2[$j]|$reached[$j]|$IP_two_1[$j]|$IP_two_2[$j]\n";`
}
4

3 に答える 3

13

@destinationこれは、、、、@IP_one_1のいずれかの要素の1つ@IP_one_2@reached定義されていない(値が割り当てられていない)か、値が割り当てられていることを意味しますundef。ソースで未定義の値を検出(および防止)するか、後でそれらを予期して処理する必要があります。有効にしたのでwarnings(これは良いことです)、Perlは、コードが連結されている値の1つが未定義である文字列を連結しようとしていることを通知します。

次の例を考えてみましょう。

perl -wE 'my @x = (); $x[0] = "Hello "; $x[2] = "world!";  say "@x"'

この例で$x[0]は、に値があり$x[2]、値がありますが、$x[1]ありません。@x二重引用符で囲まれた構成に補間すると、として展開され[element 0 (Hello )]<space>[element 1 (undef)]<space>[element 2 (world!)]ます。要素はundef空の文字列として補間し、警告を発します。そしてもちろん、デフォルトでは、配列補間は各要素の間にスペース文字を挿入します。したがって、上記の例では、Hello <interpolation-space>(undef upgrades to empty string here)<interpolation-space>world!

調査する可能性のある例として、1つ以上のアレイの合計サイズが他のアレイとは異なる場合があります。たとえば、if@IP_one_2の要素が他の要素よりも少ない場合、またはif$num2がいずれかの配列の要素数よりも大きい場合です。

スクリプトの上部近くに以下を配置して、再度実行します。

use diagnostics;

警告と診断の下で次のワンライナーを実行すると:

$ perl -wMdiagnostics -e '$a=$a; print "$a\n"'

私は次の出力を取得しますuse diagnostics;。Perlの警告を最初に学習するときに非常に役立つツールを追加すると、同様の結果が得られます。

連結(。)での初期化されていない値$ aの使用、または-e行1(#1)での文字列

(W uninitialized)未定義の値が、すでに定義されているかのように使用されました。「」または0として解釈されましたが、間違いだった可能性があります。この警告を抑制するには、定義された値を変数に割り当てます。

何が未定義であるかを理解しやすくするために、perlは未定義の変数(存在する場合)の名前を教えようとします。場合によってはこれができないため、未定義の値を使用した操作も示されます。ただし、perlはプログラムを最適化し、警告に表示される操作が必ずしもプログラムに文字通り表示されるとは限らないことに注意してください。たとえば、「that$foo」は通常「that」に最適化されます。$ fooであり、警告は、。がない場合でも、連結(。)演算子を参照します。あなたのプログラムで。

于 2012-08-15T21:46:52.980 に答える