使用-e运算符作为WHILE循环的条件的警告消息

时间:2017-09-28 18:22:50

标签: perl

使用警告和严格。 ActivePerl(供应商受限)版本5.8.0 Build 806

获取此警告消息:在D:\ NIGHTLY \ SamJudNighlty_ABS.pl第589行(底部的代码段)中使用数字ne(!=)中未初始化的值。

实际上多行会收到此警告,因为此构造经常在代码中使用。继承此代码并尝试清理它。不确定这是否是一个问题,但想要跟进它。

根据我的研究结果:" -e返回1表示真实和''表示false,如果文件不存在,则为未定义的值。

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 } 

2 个答案:

答案 0 :(得分:4)

Perl中许多运算符的“真/假”返回的重点,当然包括-e,它不需要再进一步测试。你只需要

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

!= equality operator将其参数数字进行比较,从而获得undef使用时的警告(或''或任何字符串)。这正是当文件不存在时发生的事情,因为-e然后确实返回undef,就像其他文件测试一样。

答案 1 :(得分:0)

-e如果文件存在则返回true值,如果发生错误则返回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"); 
}