Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 [ 14 ] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

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

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

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

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

whil(* {Si<15) {

last if ($i==5);

>

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

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

3,4. Нахож пар сел

: for{$i=0; $i<100; {

2: for(Sj=0; Sj<100; 5J++1 {

3: if <i?i * $j 140) {

print "Произведение $i и $j равно 140\n"! last;

4: 5: 6 7

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

for <$i=0; $i<100; {

next if (not $i % 2); print "Число =$i вечетно\п";

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



Метки

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

HYBLOCK: {

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

OUTER: хрг ) {

INNER: le ($er) {

операторы;

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

только для того, чтобы закончить выполнение внешнего цикла из внутреннего! Однако данную задачу можно решить значительно проще. Судите сами:

OUTERS Si<100; {

for($j=0; $j<100; $j++) { if ($i * Sj == 140) { print "Произоение $i и $j равно 140\n" ; lastOUTE;

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

найденных ею множителей, произведение которых равно 140.

Выход из Perl

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



print -Завершение работы программы.\пj exit 0;

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

Упражнение по нахождению простых чисел

Какой же учебник по программированию обходится без подобного упражнения? В этом упражнении мы рассмотрим небольшую программу, которая находит и распечатывает простые числа. Как известно, простое число делится только на 1 и на само себя, например: число 2 - простое, 3 - простое, а 4 - составное (делится на 1, 4 и 2). Существует бесконечное множество простых чисел и их нахождение требует довольно

большого количества вычислений.

Наберите в текстовом редакторе программу, приведенную в листинге 3.5, и сохраните ее под именем primes. Не нумеруйте строки. Сделайте файл выполняемым, следуя инструкциям, приведенным в конце 1-го занятия.

После этого попытайтесь запустить программу, набрав в командной строке: perl primes

5. зй гзгра! г гэрс ел

\: 2: 3: 4: 5: 6: 7:

16: 17:

19: 20: 21:

*!/usr/bin/perl -W

Smaxprimes=20; t Нвсбждаю наши тшыю гн>е 20 грхпьк чисел $value=l;

$count=0;

while($coiint < $тнфглпвз) { $vaLue++;

$catpositO; OJIER: for($i=2; Si<$value; $i++) { • for{$j=$i; $j<$value; $j++) { if {{Sj*$i)==Svalue) { $composite=l; last OUTE,-

(1 $a3rpcsite) $count++;

pint alie гросто",-

>



0 1 2 3 4 5 6 7 8 9 10 11 12 13 [ 14 ] 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122