Управляющая конструкция for

Управляющая конструкция Perl for напоминает стандартные конструкции циклов из других языков, таких как C. Она выглядит так:

for (инициализация; проверка; приращение) {
тело;
тело;
}

Но Perl рассматривает эту конструкцию как замаскированный цикл while следующего вида:

инициализация;
while (проверка) {
тело;
тело;
приращение;
}

Несомненно, самым типичным применением циклов for являются cчетные итеративные вычисления:

for ($i = 1; $i <= 10; $i++) { # Отсчет от 1 до 10
print "I can count to $i!\n";
}

Встретив такой заголовок, вы поймете суть происходящего в первой строке и без чтения комментария. Перед началом цикла управляющей переменной $i задается значение 1. Далее замаскированный цикл while выполняется, пока переменная $i остается меньшей либо равной 10. Между итерациями выполняется приращение управляющей переменной, которое в данном примере имеет форму инкремента; управляющая переменная ($i) увеличивается на 1. Итак, при первом проходе цикла переменная $i равна 1. Так как она остается меньшей либо равной 10, программа выводит сообщение.




Хотя приращение указано в начале цикла, логически оно выполняется в конце итерации, после вывода сообщения. Таким образом, переменная $i становится равной 2; это значение меньше либо равно 10, поэтому сообщение выводится снова, а переменная $i увеличивается до 3. Новое значение также меньше либо равно 10, и т. д. Вскоре программа выведет сообщение о том, что она умеет считать до 9. Переменная $i увеличивается до 10. Новое значение по-прежнему меньше либо равно 10, поэтому цикл выполняется в последний раз, а программа сообщает, что она умеет считать до 10. Наконец, переменная $i увеличивается в последний раз до 11; это значение больше 10.

Управление передается за пределы цикла, и выполнение основной программы продолжается. Увидев заголовок цикла, любой опытный программист сразу скажет: «Ага, в этом цикле $i увеличивается от 1 до 10». Обратите внимание: после завершения цикла управляющая переменная сохраняет «последнее» значение. В нашем примере она добралась до 11. Цикл for чрезвычайно гибок; с его помощью можно организовать весьма разнообразные вычисления. Например, переменная может уменьшаться от 10 до 1:

for ($i = 10; $i >= 1; $i--) {
print "I can count down to $i\n";
}
А этот цикл считает от –150 до 1000 с приращением 3:1
for ($i = -150; $i <= 1000; $i += 3) {
print "$i\n";
}

Более того, любая из трех управляющих частей (инициализация, проверка и приращение) может отсутствовать; впрочем заголовок все равно должен содержать две точки с запятой.


В следующем (довольно необычном) примере проверка представляет собой операцию замены, а секция приращения пуста:

for ($_ = "bedrock"; s/(.)//; ) { # Продолжать, пока s///
# применяется успешно
print "One character is: $1\n";
}

На месте условия (в подразумеваемом цикле while) находится операции замены, которая возвращает true в случае успеха. При первой итерации замена удалит букву b из bedrock. Каждая последующая итерация будет сопровождаться удалением очередного символа. Когда в строке не останется ни одного символа, очередная попытка замены завершится неудачей и цикл завершится. Если выражение проверки (между двумя точками с запятой) пусто, оно автоматически считается истинным, что приводит к бесконечному циклу. Не создавайте бесконечные циклы, не предусмотрев возможности выхода из них. О том, как это делается, будет рассказано далее в этой главе.

for (;;) {
print "It's an infinite loop!\n";
}

Если вам действительно понадобится бесконечный цикл1, запишите его в форме while; этот способ больше соответствует стилю программирования на Perl:

while (1) {
print "It's another infinite loop!\n";
}

Хотя программисту C первый способ покажется более знакомым, даже начинающему программисту Perl известно, что значение 1 всегда истинно.


Он сразу поймет, что в программе намеренно создается бесконечный цикл, поэтому вторая запись предпочтительнее. Perl достаточно умен, чтобы распознать константное выражение и исключить его из цикла в ходе оптимизации, так что эффективность не пострадает.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Perl на эту тему:
Автоинкремент и автодекремент
Значение автоинкремента
Значение ускоренного логического оператора
Логические операторы
Метки блоков