【问题标题】:Warning Message using the -e operator as the condition of a WHILE loop使用 -e 运算符作为 WHILE 循环条件的警告消息
【发布时间】:2023-03-20 21:08:01
【问题描述】:

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

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

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

根据我的研究:“-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 } 

【问题讨论】:

  • 你是对的,当undef 值与1 进行比较时会弹出警告。由于这样的构造没有意义,您可以until (-e $finFlag) {..} 或@zdim 写的内容。
  • -e 如果文件存在则返回真值,如果发生错误(包括文件不存在)则返回 undef

标签: perl


【解决方案1】:

Perl 中许多运算符的“真/假”返回的全部意义,-e 当然包括在内,是它不需要进一步测试。你只需要

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

!=equality operator 比较它的参数数字,因此当它使用undef(或'',或任何字符串)时会发出警告。这正是当文件不存在时所发生的情况 -e 然后确实返回 undef,就像其他文件测试一样。

【讨论】:

    【解决方案2】:

    -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"); 
    } 
    

    【讨论】:

      猜你喜欢
      • 2015-01-05
      • 2018-06-05
      • 1970-01-01
      • 2015-03-02
      • 2017-10-13
      • 1970-01-01
      • 1970-01-01
      • 2014-06-06
      • 1970-01-01
      相关资源
      最近更新 更多