Цикл позволяет исполнить некоторый блок операций определённое кол-во раз. В языке 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. Но это я так... на всякий случай :)