Поиск

Другие средства управления программой

Управлять процессом выполнения программы с помощью циклов и условных операторов достаточно удобно, но для создания программ с прозрачной структурой нужны и другие операторы управления. Действительно, в Perl имеются операторы для досрочного завершения цикла while, для пропуска определенной части цикла for, для выхода из блока условного оператора if и для выхода из программы вообще. Некоторые из перечисленных конструкций рассмотрены в этом разделе. Их использование может облегчить чтение программы.

Альтернативная запись оператора if

Оператор if может иметь другой синтаксис. Если внутри блока имеется только одно выражение, оно может предшествовать if. Так, вместо кода

if (условное __выражевие) {выражение;}

можно написать:

выражение if (условное выражение);

Ниже приведено несколько примеров подобного синтаксиса:

$correct=l if ($guess== $question) ;
print " Это не число pil" if ( $ratio != 3.14159);

Этот синтаксис в Perl используется для ясности, поскольку обычно легче читать код, в котором действие предшествует условию. Перед оператором if может быть только одно выражение, а в конце оператора обязательно должна быть точка с запятой.

Операторы управления циклами

Кроме блоков, операторов for, while, if, управляющих порядком выполнения блоков, в Perl имеются операторы для управления программой внутри самих блоков.

Одним из таких операторов является last. С его помощью можно выйти из внутреннего выполняемого блока цикла. Вот пример:

while ($i<15) {br> last if ($i==5);
$++; }

Оператор last позволяет досрочно завершить выполнение цикла while, если значение переменной $i равно 5. При этом не нужно дожидаться, пока условное выражение примет ложное значение. В случае использования вложенных циклов оператор last завершает выполнение текущего внутреннего цикла.

Приведенная в листинге 3.4 программа находит все пары чисел меньше 100, произведение которых равно 140, например 2 и 70, 4 и 35 и т. д. Делается это крайне неэффективно, но нас будет интересовать в основном использование оператора last. Как только очередная пара найдена и выведена на экран, программа выходит из внутреннего цикла с итерацией по $j. При этом внешний цикл (с инкрементом $i) продолжает выполняться и снова запускает внутренний цикл.

Кроме last, в Perl существует также оператор next. Он завершает текущую итерацию цикла и передает управление в начало цикла, например:

for ($i=0; $i<100; $i++) {
next if (not $i % 2);
print "Число =$i нечетно n";
}

Этот цикл выводит все нечетные числа в диапазоне от 0 до 100. Оператор next запускает следующую итерацию цикла, если $i содержит четное число. Выражение $i % 2 возвращает остаток от деления $i на 2, а оператор not инвертирует полученное логическое значение. Таким образом, если число четное, оператор print пропускается. Естественно, что существуют более удачные алгоритмы поиска нечетных чисел, но тогда мне пришлось бы придумать другой пример для иллюстрации оператора next.

Метки

Perl позволяет помечать блоки и некоторые операторы циклов (for или while). Для этого перед блоком или оператором помешают специальный идентификатор, который называется меткой, например:

MYBLOCK: {
}

Предыдущий блок помечен как MYBLOCK. Имена меток следуют тем же правилам, что и имена переменных, за небольшим исключением: в отличие от имен переменных, метки не должны иметь символов наподобие %, $. Важно также, чтобы имена меток не совпадали с зарезервированными словами Perl. Хорошим стилем является использование в именах меток только прописных букв. Это позволит избежать конфликтов имен с настоящими и будущими служебными словами Perl. Операторы for и while также могут быть помечены, например:

Метку можно указывать в качестве аргумента в таких операторах, как last и next. Это позволяет досрочно завершить выполнение любого блока операторов. В листинге 3.4 мы находили пары чисел, произведение которых равно 140, с использованием вложенных циклов for. А теперь представьте, что нам нужно найти только первую пару множителей. Чтобы выйти из обоих циклов после нахождения результата, потребуется сложная комбинация переменных-флагов и условных операторов. И все это только для того, чтобы закончить выполнение внешнего цикла из внутреннего! Однако данную задачу можно решить значительно проще. Судите сами:

Теперь оператору last явно указан цикл, из которого нужно выйти, — это цикл, помеченный как OUTER. В результате данная программа напечатает только первую пару найденных ею множителей, произведение которых равно 140.

Выход из Perl

Оператор exit — одно из радикальных средств управления программой. Как только Perl встречает этот оператор, программа перестает выполняться и управление возвращается операционной системе вместе со специальным кодом завершения. Значение этого кода определяет, успешно была завершена программа или нет. Более подробно коды завершения будут рассмотрены на 11-м занятии, "Взаимодействие с операционной системой". А пока достаточно знать, что код 0 означает, что все в порядке. Вот пример использования оператора exit:

if ($user_response eq 'выйти') {
print "Завершение работы программы.n';
exit 0;
}
Оператор exit обладает важным побочным действием, относящимся к действиям операционной системы. После его выполнения все открытые программой файлы закрываются, освобождается выделенная Perl память и интерпретатор Perl корректно завершает свою работу.