468x60comp.hardware.ani.


| Содержание | Предисловие | В

Глава 4

    В этой главе:


Управляющие структуры

Блоки операторов

Блок операторов это последовательность операторов, заключенная в парные фигурные скобки. Блок операторов выглядит следую

(

первыи_оператор;

второй_оператор;

третий_оператор;

последний_оператор;

>

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

Синтаксически блок операторов принимается вместо любого одиночного оператора, но обратное не верно.

Завершающая точка с запятой, стоящая за последним оператором, не обязательна. Таким образом, вы можете разговаривать на языке Perl с С-акцентом (точка с запятой присутствует

if ($ready) ( $hungry++ } if ($tired) (

$sleepy = ($hungry + 1) * 2;

}

Оператор if/unless

Следующей по сложности управляющей структурой является оператор if. Эта конструкция состоит из управляющего выражения (про

if (выражение) (

оператор_1

оператор_2

оператор_3 } else {

оператор_1

оператор_2

оператор_3 }

(Если вы любите программировать на С и Java, то для вас должна быть вполне очевидной обязательность фигурных скобок. Они устра

Во время выполнения Perl-программы вычисляется управляющее выражение. Если оно истинно, то выполняется первый блок операторов в приведенном выше примере. Если выражение ложно, то выполняется вт

Что же такое "истина" и "ложь"? В Perl эти правила несколько странноваты, но, тем не менее, дают ожидаемые результаты. Управляющее выражение вычисляется как строковая

О # преобразуется в "О", поэтому "ложь"

1-1 # дает в результате 0, затем преобразуется в "О", поэтому "ложь"

1 # преобразуется в "I", поэтому "истина"

"" # пустая строка, поэтому "ложь"

"1" # не "" или "О", поэтому "истина"

"00" # не "" или "О", поэтому "истина" (это странно, поэтому будьте настороже)

"0.000" # "истина" будьте внимательны, по той же причине

undef # дает в результате "", поэтому "ложь"

* Внутренне все трактуется несколько иначе, но внешне все выполняется так, будто именно это и происходит.

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

print "how old are you? ";

$a = <STDIN>;

chomp($a) ;

if ($a < 18) (

print "So, you're not old enough to vote, eh?\n";

( else (

print "Old enough! Cool! So go vote! \n";

$voter++; # count the voters for later )

Блок else можно опустить, оставив только часть, касающуюся then:

print "how old are you? ";

$a - <STDIN>;

chomp($a) ;

if ($a < 18) (

print "So, you're not old enough to vote, eh?\n";

}

Иногда бывает удобно часть "then" опустить и оставить только else,

print "how old are you? ";

$a = <STDIN>;

chomp ($a) ;

unless ($a < 18) (

print "Old enough! Cool! So go vote!\n";

$voter++;

>

Заменить if на unless — это все равно что сказать "Если управляющее

Если у вас больше двух возможных вариантов, введите в оператор if ветвь elsif,

if (выражение один) {

оператор_1_при_истине_ один;

оператор_2 _при_истине_один;

оператор_ 3_при_истине_ один ;

} elsif (выражение_два) {

оператор_1_при_истине_два

оператор_2_при_истине_два

олератор_3_при_истине_два } elsif (варажение_три) (

оператор_1_при_истине_три

оператор_2_при_истине_три

оператор _ 3_при_истине_ три

} else ( -

оператор__ 1_при_всеи_ложных;

оператор_2_при_всех_ложных/ оператор_3_при_всех_ложных;

}

Все управляющие выражения вычисляются по очереди. Если какое-либо выражение истинно, то выполняется соответствующая ветвь, а все остальные управляющие выражения и соответствующие блоки опер

Оператор while/until

Ни один язык программирования не был бы полным без какой-нибудь формы организации цикла* (повторяющегося выполнения блока операторов). Perl

while (выражение) {

оператор_1; '

оператор_2;

оператор_3;

}

Чтобы выполнить оператор while, Perl вычисляет управляющее выражение (в данном примере

print "how old are you? " ;

$a = <STDIN>;

chomp($a) ;

while ($a > 0) {

print "At one time, you were $a years old.\n";

$a—;

}

Иногда легче сказать "до тех пор, пока что-то не станет истинным", чем "пока не это истина". Для этого случая у

until (выражение) { оператор_1;

оператор_2;

оператор_3;

} * Вот почему HTML — не язык программирования.

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

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

Оператор do {} while/until

Оператор while/until, который вы видели в предыдущем разделе, проверяет условие в начале каждого цикла, до входа в него. Е

Иногда возникает необходимость проверять условие не в начале, а в конце цикла. Для этого в Perl есть оператор do {} while,

оператор_1;

опвратор_2;

оператор_3;

} while выражение;

Perl выполняет операторы блока do. Дойдя до конца, он вычисляет выражение на предмет истинности. Если выра

Как и в обычном цикле while, условие проверки можно инвертировать, заменив do {} while на

$stops = 0;

do (

$stops++;

print "Next stop? " ;

chomp($location = <STDIN>) ;

} until $stops > 5 I I $location eq 'home';

* Ну, не совсем чтобы очень похож; управляющие директивы цикла, описанные в главе 9, в такой форме не работают.

Оператор for

Еще одна конструкция Perl, предназначенная для организации цикла,

for ( начальное_выражение; проверочно

оператор_1;

оператор_2;

оператор_3;

1

Если преобразовать этот оператор в те формы, которые мы рассмотрели раньше, то он станет таким:

начальное выражение;

while (проверочное выражение) {

оператор_1;

оператор_2;

оператор_3;

возобяовляющее_выраи:ение;

}

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

Следующий фрагмент программы предназначен для вывода на экран чисел от 1 до 10, после каждого из которых следу

for ($i = 1; $i <- 10; $i++) ( print "$i ";

)

Сначала переменная $i устанавливается в 1. Затем эта переменная сра

Оператор foreach

Еще одна циклическая конструкция оператор foreach. Этот о

foreach $i (@список) {

оператор_1;

оператор_2;

оператор_3;

}

В отличие от C-shell, в Perl исходное значение этой скалярной перем

Вот пример использования оператора foreach:

= (1,2,3,4,5);

foreach $b (reverse @a) { print $b;

1

Эта программа выводит на экран 54321. Отметим, что список, используемый в операторе foreach,Имя скалярной переменной можно опустить. В этом случае Perl будет действовать так, как будто вы указали имя переменной $_.

Видите, насколько использование неявной переменной $_ все упрощает? Когда вы познакомитесь с другими функциями и операциями, котор

Если список, над которым производятся циклические преобразования, состоит из реальных переменных, а не получен при помощи функции, возвращающей списочное значение, то исполь

= (3,5,7,9) ;

foreach $one (@a) { $one *= 3;

> # @а теперь равно (9,15,21,27)

Обратите внимание на то, что изменение переменной $опе привело к изменению каждого элемента массива @а.

Упражнения

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

1. Напишите программу, которая запрашивает температуру окружающего воздуха и выводит на экран слова "too hot",

2. Модифицируйте программу из предыдущего упражнения так, чтобы она выводила на экран "too hot", если температура выше

3. Напишите программу, которая читает список чисел (каждое из которых записано в отдельной строке), пока не будет прочитано число 999,4. Напишите программу, которая читает список строковых значений (каждое из которых занимает отдельную строку) и выводит его на экран в обратном порядке, причем без проведения над списком операц

5. Напишите программу, которая выводит на экран таблицу чисел от 0 до 32

printf "%5g ”8д\п", $а, $Ь

которая выводит $а как пятизначное число, а $ь как восьмизначное.




|     Назад     |  

| Содержание | Предисловие | В



Сайт создан в системе uCoz