Анимация
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

в данном случае управляющее выражение проверяется на истинность (по тем же правилам, что и всегда). Если оно истинно, то вычисляется выражение. Это приблизительно эквивалентно конструкции

if {управляющее выражение) { выражение;

Однако в данном случае дополнительные знаки препинания не нужны, оператор читается справа налево, а выражение должно быть простым (т.е. не может быть блоком операторов). Во многих случаях, однако, такая инвертированная запись оказывается наиболее естественным способом задания условия. Например, вот как можно выйти из цикла при возникновении определенного условия:

LIIJE: while (<STDIN>) {

last LINE if /"From: /;

Видите, насколько проще такая запись? Более того, вы даже можете прочитать ее на нормальном языке: "последняя строка, если она начинается со слова From".

Кроме описанной выше, существуют и другие формы с модификаторами:

выраж2 unless выраж1; # как unless (выраж!) { выраж2; } выраж2 while выраж1; # как while (выраж!) { выраж2; ] выраж2 until выраж1; # как until (выраж!) ( выраж2; )

Во всех этих формах сначала вычисляется выраж!, а затем в зависи.мости от результата что-то делается или не делается с выраж2.

Например, вот как можно найти первую по порядку степень числа 2, которая больше заданного числа:

chomp($n = <STDIN>) ;

$1=1; # исходное предположение

$1 *= 2 until $1 > $п; # вычислять, пока не будет найдена

Как видите, мы опять добиваемся ясности и убираем лишнее.

Эти формы нельзя вкладывать одну в другую: нельзя сказать выражЗ while выраж2 if выраж!. Это объясняется тем, что форма выраж2 if выраж! - уже не выражение, а полноценный оператор; после оператора модификатор ставить нельзя.



Операции && и \\ как управляющие структуры

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

Вам часто приходится сталкиваться с концепцией "если это, тогда то". Мы уже видели две подобные формы:

if {это) ( то: ) # один способ то if это; # другой способ

Вот третья (хотите верьте, хотите нет - но есть и другие):

это && то;

Почему она работает? Разве это не операция "логическое И"? Давайте посмотрим, что происходит, когда это принимает значения "истина" или "ложь".

• Если это - истина, то значение всего выражения все равно не известно, потому что оно зависит от значения элемента то. Поэтому нухсно вычислить то.

• Если это - ложь, то все выражение будет ложным и нет никакого смысла смотреть на то. Поскольку вычислять то смысла нет, его можно пропустить.

Как раз это и делает Perl - вычисляет то лишь в том случае, если это истинно, что делает данную форму эквивалентной двум предыдущим.

Аналогичным образом "логическое ИЛИ" работает, как оператор unless (или модификатор unless). Вы можете заменить

unless {это) { то; )

это \\ то;

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

Какую же из этих форм использовать? Это зависит от вашего настроения (иногда), от того, насколько велики части выражения, наконец, от того, нужно ли вам заключать выражения в круглые скобки из-за конфликтов приоритетов. Возьмите программы своих коллег и посмотрите, что они делают. В них, вероятно, вы обнаружите влияние каждого из этих факторов. Ларри предлагает ставить самую важную часть выражения первой, чтобы акцентировать на ней внимание.



Упражнения

Ответы к упражнениям приведены в приложении А.

1. Модифицируйте упражнение из предыдущей главы так, чтобы операция повторялась до тех пор, пока в качестве одного из значений не будет введено слово end. (Совет: используйте бесконечный цикл, а затем выполните оператор last, если любое из значений равно end.)

2. Перепищите упражнение из главы 4 (суммирование чисел до появления числа 999), используя цикл с выходом из середины. (Совет: используйте "голый" блок с оператором redo в конце, чтобы получить бесконечный цикл, и оператор last в середине, выполняющийся при выполнении определенных условий.)



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