stones.gif (8081 байт)

Повышение степени модульности

В 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 . Можно читать такую запись как до тех пор, пока слово угадано неверно … .

<< Предыдущая страница Содержание Наверх Следующая страница >>

stones.gif (8081 байт)
2000, "Язык Perl. Создание CGI-скриптов на Perl." . Использованы материалы книг: Маслов В.В. Основы программирования на языке Perl - М.: Радио и связь, Горячая линия - Телеком. 1999. - 144 c.: - ISBN 5-256-01356-4; Рэндал Шварц, Том Кристиансен Изучаем Perl : Пер. с англ. - К.: Издательская группа BHV, 1998 - 320 c.: - ISBN 5-7315-0031-2.
Все пожелания - авторам: Алексею Машьянову , Александру Яковлеву .