На этом шаге мы рассмотрим использование команды last.
Каждый цикл в программе завершается при достижении некоторого условия, определяемого самим оператором. В циклах while и for это связано с ложностью выражения-условия, а в цикле foreach с окончанием перебора всех элементов списка. Иногда возникает необходимость при возникновении некоторых условий завершить выполнение всего цикла, либо прервать выполнение операторов цикла и перейти на очередную итерации. Для подобных целей в языке Perl предусмотрены три команды last, next и redo, которые и называют командами управления циклом. На этом шаге мы рассмотрим команду last.
Ее общий вид следующий:
last ИДЕНТИФИКАТОР_МЕТКИ;
Команда last немедленно прекращает выполнение цикла, в котором она задана, и передает управление на оператор, непосредственно следующий за оператором цикла. Её целесообразно использовать для нахождения одного определенного значения в массиве.
Приведем пример использования данной команды:
@letters = (“A”..“Z”); # Массив for ($index = 0; $index < @letters; $index++) { last if $letters[$index] eq “M”; # Выход, если дошли до “М” } print $index; # Вывод индекса найденного элемента
Цикл в данном примере будет выполняться, пока перебор элементов массива $letters не достигнет элемента, содержащего символ “M”. После чего будет выполнен первый после оператора for оператор программы. В результате будет напечатано число 12 – индекс элемента, содержащего символ “M”.
Метка используется для передачи управления в случае вложенных циклов: управление передается непосредственно на оператор, следующий за оператором цикла с указанной меткой. Команда last осуществляет выход из цикла, не выполняя никаких блоков операторов continue.
CYCLE_1: while (...) { CYCLE_2: for (...) { CYCLE_3: foreach (...) { last CYCLE_2; } Операторы цикла CYCLE_2 } Операторы цикла CYCLE_1 # Сюда передает управление # оператор last CYCLE_2; }
Если в команде last указать метку CYCLE_1, то управление будет передано на первый после самого внешнего цикла оператор программы. Если в команде last задать метку CYCLE_3 (или задать ее вообще без метки), то управление будет передано на первый оператор группы Операторы цикла CYCLE_2.
На следующем шаге мы рассмотрим команду next.