Глава 1: Введение.
1.5. Прогулка по стране Perl
1.5.4. Несколько секретных слов
Давайте посмотрим, как можно модифицировать эту программу так, чтобы она принимала несколько секретных слов. Используя то, что мы уже видели, можно было бы многократно сравнивать вариант-догадку с рядом правильных ответов, хранящихся в отдельных скалярных переменных. Такой список, однако, было бы трудно корректировать или модифицировать в зависимости от дня недели и даты.
Более эффективное решение — хранить все возможные ответы в структуре данных, которая называется список, или (предпочтительнее) массив. Каждый элемент массива — это отдельная скалярная переменная, которой можно присваивать значение и затем использовать ее независимо от других. Можно также одним махом присвоить значение всему массиву. Мы имеем право присвоить значение всему массиву с именем @words так, чтобы он содержал три возможных правильных пароля:
@words = ("camel", "llarna", "alpaca");
Имена переменных-массивов начинаются с символа @, что позволяет отличать их от имен скалярных переменных. Существует еще один способ записи этой конструкции так, чтобы не нужно было ставить все эти кавычки — с помощью операции qw(), например:
@words = qw (camel llama alpaca);
Это абсолютно то же самое; операция qw работает так, как будто мы взяли в кавычки каждую из трех строк.
Присвоив значения элементам массива, мы можем обращаться к каждому из них по индексной ссылке. Так, $words [0] — это camel, $words [1] — llama, a $words [2] — alpaca. Индекс может быть и выражением, поэтому если мы присвоим $i значение 2, то элементом $words [$i] будет alpaca. (Индексные ссылки начинаются с символа $, а нес @, потому что они обозначают один элемент массива, а не весь массив.) Вернемся к нашему предыдущему примеру:
#! /usr/bin/perl -w
@words == qw (camel llama alpaca);
print "What is your name? ";
$name = <STDIN>;
chomp ($name);
if ($name eq "Randal") {
print "Hello, Randal! How good of you to be here!\n";
} else {
print "Hello, $name ! \n"; # обычное приветствие
print "What is the secret word? ";
$guess = <STDIN>;
chomp ($guess);
$i = 0; # сначала попробуем это слово
$correct = "maybe"; # догадка верна или нет?
while ($correct eq "maybe") { # продолжаем проверку
if ($words [$i] eq $guess) { # верно?
$correct = "yes"; # да!
} elsif ($i < 2) { # смотреть еще слова?
$i==$i+l; # в следующий раз посмотреть следующее слово
} else { # больше слов нет, должно быть, неверно
print "Wrong, try again. What is the secret word?";
$guess = <STDIN>;
chomp ($guess);
$i = 0; # вновь начать проверку с первого слова
}
} # конец цикла while для неверных слов
} # конец цикла "не Рэндал"
Заметьте, что мы используем скалярную переменную $correct для того, чтобы показать, все еще ищем мы правильный пароль или уже нашли его.
В этой программе показан также блок eisif оператора if-then-else. Такой конструкции нет ни в одном другом языке программирования; это сокращенная запись блока else с новым условием if, но без вложения еще одной пары фигурных скобок. Сравнение набора условий в каскадной цепочке if-elsif-elsif-elsif-else очень характерно для языка Perl. В нем нет эквивалента оператору switch языка С или оператору case языка Паскаль, но вы можете сами без особых хлопот создать такой оператор. Подробности см. в главе 2 книги Programming Perl и на странице руководства perlsyn(1) .
Назад | Вперед
Содержание (общее) | Содержание раздела | Содержание подраздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|