Повышение степени модульности
В Perl существует понятие подпрограммы , имеющей параметры и возвращаемые значения. Подпрограмма определяется в программе один раз, но использоваться может многократно путем вызова ее из любого места программы.Создадим для нашей программы подпрограмму good_word , которая будет принимать имя и вариант секретного слова и возвращать значение истина , если пароль введен правильно, и ложь , если слово набрано неправильно.
sub good_word {
my($somename,$someguess) = @_; # назвать параметры
$somename =~ s/\W.*//;
$somename =~ tr/A-Z/a-z/; # перевести все символы в
# нижний регистр
if ($somename eq "alex") {
return 1;
} elsif (($words{$somename} || "groucho") eq $someguess) {
return 1;
} else {
return 0;
}
}Определение подпрограммы состоит из зарезервированного слова sub , за которым идет имя подпрограммы и блок ее кода. Это определение может стоять в программе где угодно, но чаще всего его помещают в конец.
Первая строка в данном определении - операция присваивания, с помощью которой значения двух параметров подпрограммы копируются в две локальные переменные с именами $somename и $someguess (директива my определяет их как локальные для блока, в который они входят (в данном случае для всей подпрограммы), а параметры первоначально хранятся в специальном локальном массиве с именем @_ .)
Оператор if-elseif-else позволяет определить, является ли введенный пользователем вариант пароля ( $someguess ) верным для имени ( $somename ). Имя Alex не должно попасть в эту подпрограмму, но даже если и попадет, то любой вариант его ввода будет принят как правильный.
Для того чтобы подпрограмма немедленно возвращала в вызвавшую ее программу указанное в подпрограмме значение, можно пользоваться оператором возврата return . В отсутствие явного оператора возвращаемым значением является последнее выражение, вычисленное в подпрограмме.
Проверка в части elseif выглядит довольно сложной:
($words{$somename} || "groucho") eq $someguess
Первый элемент в круглых скобках обеспечивает проведение уже знакомого нам хэш-поиска, в результате которого отыскивается некоторое значение в массиве %words на основании ключа $somename . Если поик в хэшэ даст некоторое значение (это значит, что ключ $somename находится в хэшэ), то оно и будет являться значением данного выражения. Если ключ найден не был, то используется строка groucho ( || эквивалент ИЛИ ).
Полученное значение мы сравниваем пользователя. Если результат сравнения положителен, возвращается единица, в противном случае нуль.
Теперь свяжем все новые строки с остальной частью программы:
%words = qw (
fred camel
barney llama
betty alpaca
wilma alpaca
);
print "Как Вас зовут? ";
$name = <STDIN>;
chomp($name);
if ($name =~/^alex\b/i) {
print "Привет, Alex! Рад тебя видеть!\n";
} else {
print "Привет, $name!\n"; #обычное приветствие
print "Секретное слово? ";
$guess = <STDIN>;
chomp($guess);
while (! good_word( $name, $guess)) {
print "Неверно, попробуйте еще раз. Секретное слово? ";
$guess = <STDIN>;
chomp($guess);
}
print "Угадали!\n";
}[ … здесь вставляется определение подпрограммы good_word …]
В цикле while при вызове подпрограммы good_word ей передаются два параметра, $name и $guess . Значение $somename устанавливается равным первому параметру, $someguess второму.
Значение, возвращаемое подпрограммой, логически инвертируется префиксной операцией ! (логическое НЕ ). Результат этой операции управляет циклом while . Можно читать такую запись как до тех пор, пока слово угадано неверно … .
<< Предыдущая страница Содержание Наверх Следующая страница >>
2000,
"Язык Perl. Создание CGI-скриптов на Perl."
. Использованы материалы книг:
Маслов
В.В.
Основы программирования на языке Perl
- М.: Радио и связь, Горячая линия - Телеком. 1999. - 144 c.: - ISBN
5-256-01356-4; Рэндал Шварц, Том Кристиансен
Изучаем Perl
: Пер. с англ. - К.:
Издательская группа BHV, 1998 - 320 c.: - ISBN 5-7315-0031-2.
Все пожелания - авторам:
Алексею Машьянову
,
Александру Яковлеву
.