我最近遇到了一段有趣的代码,等待特定文件生效:
sleep 1 until -e $file;
虽然从表面上看,这条线做了人们所期望的,我不得不帮助感觉到某些东西不在这里;写下面的内容似乎更自然:
while (1) {
sleep 1;
last if -e $file;
}
文件测试运算符是否仅适用于if
和unless
?在while
条件下部署此类运算符会有任何性能损失吗?
答案 0 :(得分:3)
在while-true(while
)与while-false(until
)循环中使用文件测试运算符之间没有区别,或者使用{{1分离出测试/} if
,与Perl中的任何其他内容也没有区别。
while循环的唯一神奇案例是unless
或... while <$handle>;
,在while (<$handle>) {...}
定义时将$_
设置为下一行。使用带有裸柄的while-false(until
)循环并没有多大意义。
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 {...}
,{{1 ,eval ...
答案 1 :(得分:2)
即使文件存在,您更自然的方式似乎也会在开始时睡觉。
while(not -e $file) { sleep 1; }
对我来说似乎更好,这正是sleep 1 until -e $file;
的同义词,但在我看来更容易理解。