stones.gif (8081 байт)

Как получить список секретных слов

Допустим, мы хотим получить отчет обо всех секретных словах, используемых в текущий момент, с указанием их "возраста". Сперва давайте получим все наши секретные слова, воспользовавшись для этого частью кода из подпрограммы init_words () :

while ( defined($filename = glob("*.secret")) ) {
   open (WORDSLIST, $filename) || die "Не могу открыть wordlist: $!";
   if (-M WORDSLIST <= 7.0) {
      while ($name = <WORDSLIST>) {
         chomp ($name);
         $word = <WORDSLIST>;
         chomp ($word);
         ###отсюда начинается новый код
      }
   }
}
close (WORDSLIST) || die "Не могу закрыть wordlist: $!"

К моменту достижения того места программы, где дан комментарий "отсюда начнется новый код", мы знаем три вещи: имя файла (содержится в переменной $ filename ), чье-то имя (в переменной $name ) и секретное слово этого человека (содержится в $word ). Здесь и нужно использовать имеющиеся в Perl инструменты формирования отчетов. Для этого где-то в программе мы должны определить используемый формат (обычно это делается в конце, как и для подпрограмм):

format STDOUT=
@<<<<<<<<<<<<<<<  @<<<<<<<<   @<<<<<<<<<<<
$filename, $name, $word

Определение формата начинается строкой format STDOUT= , а завершается точкой. Две строки между первой строкой и точкой — это сам формат. Первая строка формата — это строка определения полей, в которой задается число, длина и тип полей. В этом формате у нас три поля. Строка, следующая за строкой определения полей — это всегда строка значений полей. Строка значений содержит список выражений, которые будут вычисляться при использовании формата; результаты вычисления этих выражений вставляются в поля, определенные в предыдущей строке.

Вызывается определенный таким образом формат функцией write , например:

#! /usr/bin/perl
while ( defined($filename = glob("*.secret")) ) {
   open (WORDSLIST, $filename) || die "Не могу открыть wordlist: $!";
   if (-M WORDSLIST <= 7.0) {
      while ($name=<WORDSLIST>) {
         chomp ($name);
         $word = <WORDSLIST>;
         chomp ($word);
         write;    #вызвать format STDOUT в STDOUT
      }
   }
   close (WORDSLIST) || die "Не могу закрыть wordlist: $!";
}
format STDOUT =
@<<<<<<<<<<< @<<<<< @<<<<<<<<
$filename, $name, $word
.

Когда вызывается формат, Perl вычисляет выражения, имеющиеся в строке значений, и генерирует строку, которую передает в дескриптор файла STDOUT . Поскольку write вызывается один раз при каждом проходе цикла, мы получим ряд строк (под одной строке для каждого секретного слова); итоговый текст будет разбит на столбцы.

Для того чтобы дать столбцам названия, нужно просто ввести формат начала страницы:

format STDOUT_TOP =
Page @<<
$%
 
Имя файла    Имя         Слово
========== ======= =====
.

Этот формат называется formatSTDOUT_TOP ; он будет использоваться при первом вызове формата STDOUT , а затем через каждые 60 строк, выведенных в STDOUT . Заголовки столбцов позиционируются точно по столбцам формата STDOUT , поэтому все выглядит аккуратно.

В первой строке заголовка стоит неизменяемый текст ( Page ) и трехзначный определитель поля. Следующая строка — строка значений полей, в данном случае она содержит выражение. Это выражение является переменной $% , в которой содержится число выведенных страниц.

Третья строка формата пуста. А поскольку она не содержит никаких полей, то следующая за ней строка тоже пустая; она копируется прямо на вывод, вследствие чего между идущими ниже номером страницы и заголовками столбцов появляется пустая строка.

Последние две строки формата также не содержат никаких полей, поэтому они копируются на вывод в том виде, в каком записаны. Таким образом, этот формат обеспечивает создание четырех строк, одна из которых меняется от страницы к странице.

<< Предыдущая страница Содержание Наверх Создание CGI-скриптов на 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.
Все пожелания - авторам: Алексею Машьянову , Александру Яковлеву .