Изучаем Perl

975b8bba

Оператор last


Выполняя некоторые из предыдущих упражнений, вы, возможно, иногда думали: "Если бы в моем распоряжении был С-оператор break, все было бы нормально". Даже если такая мысль и не приходила вам в голову — все равно позвольте мне рассказать о Perl-операторе для преждевременного выхода из цикла last.

Оператор last обеспечивает выход из самого внутреннего блока цикла, в котором расположен этот оператор*, передавая управление оператору, следующему непосредственно за этим блоком. Например:

while (что-то) ( что-то;

ЧТО-ТО! ЧТО-ТО;

if (условие) {

что-то или другое;

что-то или другое;

last; # выход из цикла while }

еще что-то/ еще что-то;

}

# last передает управление в эту точку программы

* Конструкция типа do (} while/until с точки зрения операторов next, last и redo циклом не считается.

если условие истинно, то выполняются строки что-то_или_другое, после чего оператор last завершает цикл while.



Оператор last учитывает только блоки, образующие цикл, а не блоки, необходимые для построения определенных синтаксических конструкций. Это значит, что блоки для операторов if и else, равно как и для конструкций do {} while/until, "не считаются"; учитываются только блоки, которые образуют циклы for, foreach, while, until и "голые" блоки. ("Голый" блок — это блок, не являющийся частью более крупной конструкции, например цикла, подпрограммы, оператора if/then/else.)

Допустим, мы хотим посмотреть, было ли почтовое сообщение, сохраненное в файле, послано пользователем merlyn. Такое сообщение могло выглядеть следующим образом:

From: merlyn@stonehenge.com (Randal L. Schwartz)

To: stevet@ora.com

Date: Ol-DEC-96 08:16:24 PM -0700

Subject: A sample mail message

Here's the body of the mail message. And here is some more.

Нам нужно было бы найти в этом сообщении строку, которая начинается словом From:, а затем посмотреть, не содержит ли эта строка регистрационное имя merlyn.

Это можно было бы сделать так:

while (<STDIN>) ( # читать входные строки

if (/^From: /) ( # начинается ли строка со слова From:? Если да... if (/merlyn/) ( # то сообщение от merlyn!

print "Email from Randal! It's about time!\n";

}

last; # дальше искать строки From: не нужно, поэтому выйти } # конец цикла "if from:" if (/^5/) ( # пустая строка?

last; # если да, больше строки не проверять > } # конец цикла while

Найдя строку, которая начинается со слова From:, мы выходим из цикла, потому что хотим видеть только первую такую строку. Кроме того, поскольку заголовок почтового сообщения заканчивается на первой пустой строке, мы можем выйти и из основного цикла.



Содержание раздела