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