2

我最近遇到了一行有趣的代码,它会等到一个特定的文件开始生效:

sleep 1 until -e $file;

虽然从表面上看,这条线确实符合人们的预期,但我不禁感到这里有些不对劲。编写以下内容似乎更自然:

while (1) {

    sleep 1;
    last if -e $file;
}

文件测试运算符是否仅与ifand一起使用unless?在条件条件下部署此类运算符是否有任何性能损失while

4

2 回答 2

3

while在 while-true ( ) 与 while-false ( ) 循环中使用文件测试运算符或使用/until分隔测试之间没有区别,与 Perl 中的其他任何内容也没有区别。ifunless

while 循环唯一神奇的情况是... while <$handle>;or在定义时while (<$handle>) {...}设置$_为下一行。until将 while-false ( ) 循环与裸句柄一起使用是没有意义的。

构造a until b很简单a while not b

要转换sleep 1 until -e $file;while循环,您将使用以下内容:

sleep 1 while not -e $file;

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

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

while或者作为具有内部逃逸的无限:

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

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

回答你的问题的其余部分,大多数文件系统应该没问题,检查之间有 1 秒的睡眠,但如果进程没有紧急等待文件,你有很多方法可以选择更大的数字。此外,如果您使用的设备文件系统速度较慢(存储在闪存中或通过慢速网络),您可能还想尝试更大的值。

并且正如ysth下面的挑剔,一般来说,当语句形式是返回的构造的最后一个元素时,语句形式的返回不同于块形式:do {...}, sub {...}, do FILE, eval ...

于 2010-11-21T18:48:00.920 回答
2

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

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

对我来说似乎更好,这正是sleep 1 until -e $file;我认为的同义词,但更容易理解。

于 2010-11-21T18:39:22.470 回答