Изучаем Perl


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



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

1. Вот один из способов решения этой задачи:

print "What temperature is it? ";

chomp($temperature °° <STDIN>);

if ($temperature > 72) {

print "Too hot!\n";

} else (

print "Too cold!\n";

>

Первая строка приглашает ввести температуру. Вторая строка принимает введенное значение температуры. Оператор if в последних пяти строках выбирает для вывода одно из двух сообщений в зависимости от значения переменной $temperature.

2. Вот один из способов решения этой задачи:

print "What temperature is it? ";

chomp($temperature = <STDIN>) ;

if ($temperature > 75) (

print "Too hot!\n";

} elsif ($temperature < 68) (

print "Too cold!\n";

) else {

print "Just right!\n";

1

Здесь мы модифицировали программу, введя трехвариантный выбор. Сначала температура сравнивается со значением 75, затем со значением 68. Обратите внимание: при каждом запуске программы будет выполняться только один из трех вариантов.

3. Вот один из способов решения этой задачи:

print "Enter a number (999 to quit): ";

chomp($n = <STDIN>) ;

while ($n != 999) f

$sum += $n;

print "Enter another number (999 to quit): ";

chomp($n = <STDIN>);

1 print "the sum is $sum\n";

Первая строка приглашает ввести первое число. Вторая строка считывает это число с терминала. Цикл while продолжает выполняться до тех пор, пока число не станет равным 999.

Операция += накапливает числа в переменной $sum. Обратите внимание:

начальное значение этой переменной — undef, что очень хорошо для сумматора, потому что первое прибавляемое значение будет фактически прибавляться к нулю (помните, что при использовании в качестве числа undef равно нулю).

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

После выхода из цикла программа выводит накопленные результаты.

Если сразу же ввести 999, то значение переменной $sum будет равно не нулю, а пустой строке — т.е. значению undef в строковом контексте. Если вы хотите, чтобы программа в этом случае выводила нуль, нужно в начале программы инициализировать значение $s urn операцией $ sum = 0.

4. Вот один из способов решения этой задачи:

print "Enter some strings, end with "D:\n";

@strings = <STDIN>;

while (Ostrings) (

print pop @strings;

}

Сначала программа запрашивает строки. Эти строки сохраняются в переменной-массиве @strings (по одной на элемент).

Управляющее выражение цикла while — Sstrings. Это управляющее выражение ищет только одно значение ("истина" или "ложь"), поэтому вычисляет выражение в скалярном контексте. Имя массива (такое как @ strings) при использовании в скалярном контексте представляет собой количество элементов, находящихся в массиве в текущий момент. Поскольку массив не пуст, это число не равно нулю и, следовательно, имеет значение "истина". Эта идиома очень широко используется в Perl, она соответствует указанию "делать это, пока массив не пуст".

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

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

5. Вот один из способов решения этой задачи без использования списка:

for ($number = 0; $number <= 32; $number++) {

$square = $number * $number;

printf "%5g %8g\n", $number, $square;

}

А вот как можно решить задачу с помощью списка:

foreach $number (0..32) (

$square = $number * $number;

printf "%5g %8g\n", $number, $square;

}

В обоих решениях применяются циклы с использованием операторов for и foreach. Тела этих циклов идентичны, потому что в обоих решениях значение переменной $ number при каждой итерации изменяется от 0 до 32.

В первом решении использован традиционный С-подобный оператор for. Первое выражение устанавливает переменную $number в 0, второе проверяет, меньше ли $number, чем 32, а третье инкрементирует $number при каждой итерации.

Во втором решении использован оператор foreach, подобный аналогичному оператору C-shell. С помощью конструктора списка создается список из 33 элементов (от 0 до 32). Затем переменной $number поочередно присваиваются значения, равные этим элементам.









Начало  Назад  Вперед