代码之家  ›  专栏  ›  技术社区  ›  Zaid

有条件存在文件测试存在的缺陷吗?

  •  2
  • Zaid  · 技术社区  · 14 年前

    我最近遇到一行有趣的代码,它会一直等到某个特定的文件出现:

    sleep 1 until -e $file;
    

    虽然从表面上看,这条线做了人们所期望的事情,但我还是忍不住觉得有些东西不在这里;写下以下内容似乎更自然:

    while (1) {
    
        sleep 1;
        last if -e $file;
    }
    

    文件测试运算符是否仅用于 if unless ? 并且在 while 条件句?

    2 回复  |  直到 14 年前
        1
  •  3
  •   Eric Strom    14 年前

    在一段时间内使用文件测试运算符与true没有区别( while )对一段时间的错误( until )循环,或者用 if / unless ,与Perl中的其他内容也没有区别。

    while循环唯一神奇的例子是 ... while <$handle>; while (<$handle>) {...} 哪一套 $_ 在定义下一行时。使用while false是没有意义的( 直到 )裸柄环。

    这个 a until b 构造是简单的 a while not b .

    转换 sleep 1 until -e $file; 变成一个 虽然 循环,您将使用以下命令:

    sleep 1 while not -e $file;
    

    然后可以将其展开为块形式:

    while (not -e $file) {sleep 1}
    

    或作为一个无限 虽然 内部逃生:

    while (1) {
       last if -e $file;
       sleep 1;
    }
    

    所有这些形式都是等价的。

    回答您的其余问题时,大多数文件系统应该可以在检查之间保持1秒睡眠,但是如果进程没有紧急等待文件,您可以通过多种方式选择较大的数字。另外,如果您使用的设备的文件系统比较慢(存储在闪存中或通过慢速网络),您可能还需要尝试较大的值。

    作为 ysth 一般来说,当语句形式是返回的构造的最后一个元素时,下面的细枝末节返回的语句形式与块形式不同: do {...} , sub {...} , do FILE ,评估。。。

        2
  •  2
  •   Benoit    14 年前

    即使文件存在,你更自然的方式也会在开始睡觉。

    while(not -e $file) { sleep 1; }
    

    在我看来更好,这正是 sleep 1 until -e $file; 但在我看来更容易理解。

    推荐文章