我最近遇到了一行有趣的代码,它会等到一个特定的文件开始生效:
sleep 1 until -e $file;
虽然从表面上看,这条线确实符合人们的预期,但我不禁感到这里有些不对劲。编写以下内容似乎更自然:
while (1) {
sleep 1;
last if -e $file;
}
文件测试运算符是否仅与if
and一起使用unless
?在条件条件下部署此类运算符是否有任何性能损失while
?
我最近遇到了一行有趣的代码,它会等到一个特定的文件开始生效:
sleep 1 until -e $file;
虽然从表面上看,这条线确实符合人们的预期,但我不禁感到这里有些不对劲。编写以下内容似乎更自然:
while (1) {
sleep 1;
last if -e $file;
}
文件测试运算符是否仅与if
and一起使用unless
?在条件条件下部署此类运算符是否有任何性能损失while
?
while
在 while-true ( ) 与 while-false ( ) 循环中使用文件测试运算符或使用/until
分隔测试之间没有区别,与 Perl 中的其他任何内容也没有区别。if
unless
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 ...
即使文件存在,您更自然的方式似乎在开始时也会睡觉。
while(not -e $file) { sleep 1; }
对我来说似乎更好,这正是sleep 1 until -e $file;
我认为的同义词,但更容易理解。