Циклы и ветвления
Perl поддерживает операторы циклов for, while и do с небольшими отличиями от их реализации в языке С. Существенным отличием служит то, что Perl требует использования инструкций блоками, заключенными в фигурные скобки. Кроме того, как вы познакомитесь , далее, Perl расширяет конструкцию цикла, что6ы обеспечить ее некоторые новые формы. В следующих примерах циклы for, while и do работают аналогичным образом на языках С и Perl:
for($i = 0; $i< 100;$i++) { printf("%d\n", $i) ; } while ($i > 0) { printf("%d\n", $i-); } do { printf("%d\n", $i++); } while ($i < 0);
Конструкция циклов на языке С отлична от конструкции на языке Perl еще и в том, что Perl не содержит оператора break, а оператор continue выполняет совершенно иную функцию. К счастью, Perl обеспечивает некоторые новые, более гибкие и более интуитивно понятные конструкции:
last - выход из цикла (как оператор С break)
next - начать новую итерацию (как оператор С continue)
redo - повторить текущую итерацию
Для понимания конструкций циклов на языке Perl, необходимо разобраться с использованием блока continue. Рассмотрим следующий цикл while, который содержит блок continue:
$i = 100; while ($i > 0) { print $i; } continue {$i-}
Вы можете представлять себе блок continue как третье выражение в цикле for, которое выполняется на каждой итерации. Аналогичным образом Perl выполняет блок continue в конце каждой итерации. Однако, как вы узнаете далее, блок continue обеспечивает скрипту более полный контроль над процессом, чем обеспечиваетцикл for. Когда цикл на языке Perl использует оператор next, блок continue все равно выполняется, если только он существует. Однако если цикл использует оператор redo, блок continue не исполняется.
Мeтки
В скрипте Perl метки просто означают имя, соответствующее некоему положению внутри скрипта. Имена меток оканчиваются двоеточием (например, outerloop:). Используя оператор goto, скрипт может осуществлять переходы на метку. Дополнительно могут использоваться операторы last, next и redo, для перехода к метке. Следующий код иллюстрирует использование оператора last для перехода на метку:
outerloop: while ($i > 0) { while ($j > 0) { #Здесь какой-нибудь другой процесс if ($needToAboutLoop) { last outerloop; } } }
В этом случае инструкция содержит ветвь last для перехода наметку outerloop и окончания выполнения цикла.
Цикл UNTIL
Еще одной конструкцией цикла в языке Perl является цикл until, который является противоположностью циклу while. Как выпомните, в цикле while инструкции выполняются до тех пор, пока выполняется заданное условие. В цикле until, напротив, инструкции выполняются до тех пор, пока не будет выполнено условие.
Например, рассмотрим цикл while, такой, как показан на следующей странице.
while (!(expr)) { statement; }
Используя цикл until, можно создать идентичный цикл, показанный ниже:
until (expr) { statement; }
Аналогичным образом следующая конструкция do while использует оператор логического отрицания для того, чтобы выполнять цикл, пока заданное булево выражение не станет истинным:
do { statement; } while (!(expr));
Используя конструкцию do until, вы можете сформировать идентичный цикл без использования логического отрицания:
do { statement; } until (expr);
1 2 3 4
8 8 8
| |