Есть ли какие-либо подводные камни для проверки существования файла в то время как условно? - PullRequest
2 голосов
/ 21 ноября 2010

Недавно я натолкнулся на интересную строку кода, которая ждет, пока не оживет конкретный файл:

sleep 1 until -e $file;

Хотя по номиналу строка делает то, к чему ее ожидают, я не могу не помочьчувствую, что что-то здесь не так;кажется более естественным написать следующее:

while (1) {

    sleep 1;
    last if -e $file;
}

Операторы проверки файлов предназначены для использования только с if и unless?И есть ли какие-либо потери производительности при развертывании таких операторов в пределах while условных выражений?

Ответы [ 2 ]

3 голосов
/ 21 ноября 2010

Нет разницы между использованием оператора проверки файла в цикле while-true (while) и цикла while-false (until), или разделением теста с помощью if / unless и нет разницы с чем-либо еще в Perl.

Единственный волшебный случай с циклом while - ... 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 {...}, do FILE, eval ...

2 голосов
/ 21 ноября 2010

Ваш более естественный способ, кажется, спит при запуске, даже если файл существует.

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

кажется мне лучше, что является точно синонимом sleep 1 until -e $file;, но, на мой взгляд, более понятным.

...