Цикл позволяет исполнить некоторый блок операций определённое кол-во раз. В языке Perl четыре оператора циклов и три оператора управления циклом.
Цикл while выполняет свой блок операторов до тех пор, пока выражение в скобках истинно. Давайте рассмотрим пример
#!/usr/bin/perl -w $x=0; while($x<100) { print "$x\n"; $x++; }
В скобках происходит сравнение $x<100 и если оно истинно, то выполняется блок операторов заключённый в фигурные скобки {...}. В нашем случае пока переменная $x меньше 100, она выводится на экран и увеличивается на единицу.
Цикл until аналогичен while, но выполняется до тех пор, пока не выполняется условие в скобках. Т.е. пример, приведённый выше, можно переписать так:
#!/usr/bin/perl -w $x=0; until($x==100) { print "$x\n"; $x++; }
Цикл for немного сложнее. Перед началом цикла выполняется первое выражение в скобках, если истинно второе выражение, то выполняется блок, а затем третее выражение.
#!/usr/bin/perl -w for($x=0; $x<100; $x++) { print "$x\n"; }
Как видите цикл стал короче на две строки засчёт того, что инициализация переменной и увеличение её на еденицу при каждом проходе цикла происходит в скобках.
Цикл foreach присваевает переменной элемент массива, выполняет блок операторов и переходит к следующему элементу массива.
#!/usr/bin/perl -w @days = ('Sun','Mon','Tue','Wed','Thu','Fri','Sat'); foreach $i (@days) { print "$i \n"; }
Переменную ($i) можно не использовать. Тогда присвоение будет происходить в переменную $_. Как мы могли уже это видеть в примере из 4-го шага:
foreach(keys(%ENV)) { $val = $ENV{$_}; print "$_=\"$val\"\n"; }
Как вы помните, функция keys() возвращает все ключи хэша в виде массива. Первый элемент массива присваивается переменной $_, в теле цикла её используют, чтобы получить значение элемента хэша ($val = $ENV{$_}) и вывести на экран. После чего начинается новый проход цикла уже со вторым ключом. И так пока ключи, а значит и вообще элементы хэша не кончатся.
Как я уже говорил, операторов управления циклом тоже три - это next, last и redo. Первый начинает новый проход по циклу:
for($x=0; $x<5; $x++) { print "$x\n"; next; print "Я никогда не выполнюсь\n"; }
last немедленно прерывает цикл:
for($x=0; $x<5; $x++) { print "$x\n"; last; print "Я никогда не выполнюсь\n"; }
redo начинает новое выполнение блока операторов, не вычисляя значений в скобках:
for($x=0; $x<5; $x++) { print "$x\n"; redo; }
В последнем случае мы получили бесконечный цикл. Остановить его можно нажав CTRL+C. Но это я так... на всякий случай :)