Перенос списка секретных слов в отдельный файл
Поместим список слов в файл, а затем, чтобы ввести список в программу, просто прочитаем файл. Для этого нужно создать канал ввода-вывода, который называется дескриптором файла . Любая 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.
<< Предыдущая страница Содержание Наверх Следующая страница >>
2000,
"Язык Perl. Создание CGI-скриптов на Perl."
. Использованы материалы книг:
Маслов
В.В.
Основы программирования на языке Perl
- М.: Радио и связь, Горячая линия - Телеком. 1999. - 144 c.: - ISBN
5-256-01356-4; Рэндал Шварц, Том Кристиансен
Изучаем Perl
: Пер. с англ. - К.:
Издательская группа BHV, 1998 - 320 c.: - ISBN 5-7315-0031-2.
Все пожелания - авторам:
Алексею Машьянову
,
Александру Яковлеву
.