stones.gif (8081 байт)

Перенос списка секретных слов в отдельный файл

Поместим список слов в файл, а затем, чтобы ввести список в программу, просто прочитаем файл. Для этого нужно создать канал ввода-вывода, который называется дескриптором файла . Любая Perl-программа автоматически получает три дескриптора файлов, STDIN , STDOUT и STDERR , которые соответствуют трем стандартам каналам ввода-вывода в большинстве сред программирования. Нужно создать для выбранного нами файла другой дескриптор.

Поместим его в подпрограмму:

sub init_word{
   open (WORDLIST, "wordslist") || die "Не могу открыть wordlist: $!";
   while ( defined ($name = <WORDLIST>)) {
      chomp($name);
      $word = <WORDLIST>;
      chomp($word);
      $words{$name} = $word;
   }
   close (WORDLIST) || die "Не могу закрыть wordlist: $!";
}

В файле создадим такой список:

fred
camel
barney
llama
betty
alpaca
wilma
alpaca

Функция open инициализирует дескриптор файла WORDLIST , связывая его с файлом wordlist , находящемся в текущем каталоге.

При выполнении цикла while читаются строки из файла wordlist (по одной при каждом проходе цикла) и заносятся в переменную $name . По достижении конца файла операция <WORDLIST> возвращает пустую строку (проверка на пустую строку выполняется с помощью функции defined ), которая для цикла while ложь , и завершает цикл. По завершении чтения файла его дескриптор можно использовать вновь, предварительно закрыв файл с помощью функции close . На тот случай, если мы по каким-то причинам не сможем открыть или закрыть файл, мы используем функцию die , которая выводит на экран сообщение и прерывает программу. Переменная $! содержит системное сообщение об ошибке, поясняющее, почему данный системный вызов завершился неудачно.

Этот вариант программы выглядит так:

init_word() ;
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";
}
sub init_word{
   open (WORDLIST, "wordslist") || die "Не могу открыть wordlist: $!";
   while ( defined ($name = <WORDLIST>)) {
      chomp($name);
      $word = <WORDLIST>;
      chomp($word);
      $words{$name} = $word;
   }
   close (WORDLIST) || die "Не могу закрыть wordlist: $!";
}
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;
   }
}

Подробнее про функции open , close и die можно найти в соответствующей литературе по Perl.

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

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.
Все пожелания - авторам: Алексею Машьянову , Александру Яковлеву .