Шаг 7 - Циклы

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Горностаев Сергей aka Deadcat - 05.02.2004