在有条件的情况下测试文件存在是否有任何陷阱?

时间:2010-11-21 18:31:26

标签: perl file-exists

我最近遇到了一段有趣的代码,等待特定文件生效:

sleep 1 until -e $file;

虽然从表面上看,这条线做了人们所期望的,我不得不帮助感觉到某些东西不在这里;写下面的内容似乎更自然:

while (1) {

    sleep 1;
    last if -e $file;
}

文件测试运算符是否仅适用于ifunless?在while条件下部署此类运算符会有任何性能损失吗?

2 个答案:

答案 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;的同义词,但在我看来更容易理解。