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

Оператор for

Еще одна конструкция Perl, предназначенная для организации цикла, - оператор for, который выглядит подозрительно похоже на оператор for языков С и Java и работает примерно так же Вот он

for ( начальное выражение, проверочное выражение, возобновляющее выражение ) { оператор 1, оператор 2, оператор 3,

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

чачальное вьражение,

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

оператор 1,

оператор 2,

onepaiop 3,

возобиовлякщее выражеиие,

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

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

for (si = 1 , $1 <= 10, $1++) ( print i/± ",

Сначала переменная $i устанавливается в I Затем эта переменная сравнивается с числом 10 Поскольку она меньше или равна 10, то выполняется тело цикла (один оператор print), а затем вычисляется возобновляющее выражение ($i++), в результате чего значение $i изменяется на 2. Поскольку эта переменная все еще меньше или равна 10, процесс повторяется до тех пор, пока в последней итерации значение 10 в $i не изменится на П Поскольку переменная $i уже не меньше и не равна 10, цикл завершается (при этом $i становится равным 11)

94 Ияупаом Perl



Оператор foreach

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

foreach $i (всписок) { оператор 1 ; оператор 2; оператор 3 ;

В отличие от C-shell, в Perl исходное значение этой скалярной переменной при выходе из цикла автоматически восстанавливается; другими словами, эта скалярная переменная локальна для данного цикла.

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

@а = (1,2,3,4,5) ; foreach $b (reverse @а) { print $b;

Эта программа выводит на экран 5 4 321. Отметим, что список, используемый в операторе foreach, может быть произвольным списочным литералом, а не просто переменной-массивом. (Это справедливо для всех конструкций Perl, которым требуется список.)

Имя скалярной переменной можно опустить. В этом случае Perl будет действовать так, как будто вы указали имя переменной $ . Вы увидите, что переменная $ используется по умолчанию во многих операциях языка Perl, поэтому ее можно рассматривать как неявную временную переменную. (Все операции, в которых по умолчанию используется $ , могут использовать и обьмную скалярную переменную.) Например, функция print выводит значение переменной если другие значения не указаны, поэтому следующий пример дает такой же результат, как и предыдущий:

(За = (1,2,3,4,5) ; foreach (reverse @а) (

print ;

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

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



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

@а = (3,5,7,9) ; foreach $опе (@а) { $опе *= 3;

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

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

Упражнения

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

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

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

3. Напишите программу, которая читает список чисел (каждое из которых записано в отдельной строке), пока не будет прочитано число 9 9 9, после чего программа выводит сумму всех этих чисел. (Ни в коем случае не прибавляйте 999!) Например, если вы вводите 1, 2, 3 и 999, программа должна ответить цифрой 6 (1+2+3).

4. Напищите программу, которая читает список строковых значений (каждое из которых занимает отдельную строку) и выводит его на экран в обратном порядке, причем без проведения над списком операции reverse. (Вспомните, что <stdin> при использовании в списочном контексте читает список строковых значений, каждое из которых занимает отдельную строку.)

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

printf "%5g ?8g\n", $а, $b

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



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