Короткие Файл считывается оператором <>
, поэтому без него это только задание, таким образом, бесконечный цикл.
В while (...) { ... }
проверяет состояние внутри ()
и если это верно выполняет тело в блоке {}
. Он продолжает делать это до тех пор, пока условие в ()
не будет оценено как ложное (обычно 0
, '0'
, ''
или undef
). Это то, что оператор <>
обеспечивает, например, таким образом, мы имеем идиом
while (my $line = <$file_handle>) { ... }
Оператор <>
считывает строку на каждую итерацию из ресурса, который $file_handle
связан с и когда она достигает окончание срока файла он возвращает undef
, поэтому цикл завершается, и выполнение программы продолжается после следующего цикла после цикла. Оператор алмаза <>
является формой оператора для функции readline
. См. I/O Operators in perlop. Для этого необходимо, чтобы $file_handle
был действительным ресурсом, который может извлекать данные.
Без оператора <>
ничего не читается нигде, но есть только задание. Код делает следующее. Он копирует переменную $file_handle
в переменную $line
. Возвращаемое значение этой операции в Perl - это значение, которое заканчивается в $line
, и если это «истинное» значение, тогда выполняется тело { ... }
. $file_handle
явно оценивает значение «true», иначе тело цикла не будет выполняться ни разу, и программа продолжит работу. Таким образом, верно и $line
. Поэтому, если $file_handle
не изменяется в теле {...}
цикла, условие всегда верно.
Затем все, что находится в теле, продолжает выполняться без причины для завершения цикла, и поэтому оно никогда не возвращает управление программе. Это бесконечный цикл, а программа появляется, чтобы висеть.
Обратите внимание, что это иногда используется намеренно, и вы можете увидеть код как
while (1) {
# Compute what is needed
# Recalculate the condition for when to stop
last if $condition_to_terminate;
}
Этот подход может быть рискованным, хотя, так как условие может становиться все более и более сложным, и ошибка может проникнуть в, в этом случае мы заканчиваем бесконечным циклом. Как правило, более четкие способы управления циклами.
Совершенно другой пример представляет собой цикл события, где важно, чтобы войти в бесконечный цикл, так что мы можем ждать события каких-то, на котором отсчитываются определенное действие. Вот как работает графический интерфейс, например, и ряд других систем.
Без '<>' вы делаете копию '$ file_handle' в' $ line' –