2017-09-28 5 views
1

警告と厳密な警告を使用しています。 ActivePerl(ベンダー限定)バージョン5.8.0ビルド806警告メッセージWHILEループの条件として-e演算子を使用しています。

D:¥NIGHTLY¥SamJudNighlty_ABS.pl行589(数字の下にあるコードスニペット)で数値ne(!=)で未初期化値を使用する。

実際には、この構文がコードで頻繁に使用されるため、複数の行にこの警告が表示されます。このコードを継承し、それをクリーンアップしようとしています。これが問題であるかどうかはわかりませんが、それにフォローアップしたいと思っています。

私が研究してきたものから

:「ファイルが存在しない場合は 『』真と偽のため、または未定義値の-eリターン1

587 $finFlag = $NightlyFlagPath . "\\FIN\\DONE"; 
588   
589 while((-e $finFlag) != 1) 
590 { 
591 sleep(120); 
592 print(PROGRESSFILE "\nWaiting for the Fin Nightly to finish" . getPCTime5()); 
593 } 
+0

あなたは正しい、と 'undef'値が '1'と比較されるポップを警告しています。そのような構造は意味をなさないので、 'until(-e $ finFlag){..}'や@zdimが書いたことができます。 –

+0

'-e'は、ファイルが存在する場合は真の値を返し、エラーが発生した場合は(ファイルが存在しない場合は)' undef'を返します。 – ikegami

答えて

4

の全体のポイント。」真/偽「Perlでの多くのオペレータのリターンは、-eは確かに含まれ、それがさらにいずれかをテストする必要がないことである。あなただけ

while (not -e $finFlag) { ... } 

!=equality operatorコンパが必要引数を数値的にとすると、undef(または''、または任意の文字列)を扱うときの警告が表示されます。 -eからファイルが存在しない場合はどうなりますか。実際には他のファイルテストと同様にundefが返されます。

+1

@ PerlDuck Oups ...ありがとう – zdim

0

-eは、ファイルが存在する場合は真の値を返し、エラーが発生した場合はundefを返します(ファイルが存在しない場合を含む)。

数値比較でundefを使用しているため、警告が表示されます。代わりに論理演算を使用してください。

修正:ファイルが存在する場合は永遠しかし

while (!-e $finFlag) { 
    sleep(120); 
    print(PROGRESSFILE "Waiting for the Fin Nightly to finish " . getPCTime5() . "\n"); 
} 

、その意志ループを、何かが(例えばアクセス権の問題など)、それについての情報を得ることからあなたを防ぐことができます。以下は、その問題を解決します

while (1) { 
    last if -e $finFlag; 
    die("Can't stat \"$finFlag\": $!\n") if !$!{ENOENT}; 

    sleep(120); 
    print(PROGRESSFILE "Waiting for the Fin Nightly to finish " . getPCTime5() . "\n"); 
} 

少し明確:

while (1) { 
    last if stat($finFlag); 
    die("Can't stat \"$finFlag\": $!\n") if !$!{ENOENT}; 

    sleep(120); 
    print(PROGRESSFILE "Waiting for the Fin Nightly to finish " . getPCTime5() . "\n"); 
} 
関連する問題