Использование нескольких форматов
Использование нескольких форматов
Как мы уже знаем, форматы Perl позволяют без каких-либо усилий создавать верхние колонтитулы — следует только объявить формат с суффиксом _ТОР. Для создания полноценного документа не мешало бы еще иметь возможность создавать нижние колонтитулы страницы и печатать, например, в конце заказа общую стоимость. К сожалению, такой возможности Perl не предоставляет, но он позволяет переключать вывод с одного формата на другой и в специальной переменной хранит строку, которую печатает перед переходом на новую страницу. А это и позволит нам создать и напечатать и нижний колонтитул, и общую стоимость заказа.
Но прежде мы еще немного поговорим о специальных переменных Perl, которые используются для управления форматом. В переменной $~ хранится имя формата, который используется при выводе функцией write о без параметра:
write; # Эквивалентно оператору write STDOUT;
По умолчанию в ней хранится имя формата STDOUT, но и вывод функцией write о без параметра происходит на стандартное устройство вывода STDOUT. (Мы помним, что имя формата должно совпадать с именем дескриптора файла в вызове функции write о, а именно такая ситуация по умолчанию и реализуется.) Если мы изменим значение переменной $~ на имя другого формата, то вывод в стандартный файл функцией write о без параметра будет осуществляться в соответствии с указанным форматом, который, конечно, должен быть объявлен в программе. Например, следующий оператор write выводит на стандартное устройство вывода в соответствии с форматом NEW:
$- = NEW; write/format NEW =
Таким образом, меняя значение переменной $~, можно переключать вывод с одного формата на другой. Этим другим форматом как раз и может быть формат общей стоимости заказа.
Пусть в файле books содержится информация о заказанных книжным магазином книг. В конце отчета по заказу нам теперь необходимо напечатать общую стоимость книг. Решение показано в программе примера 8.2.
#! peri -w
open BOOKS, "<books"; # Открытие файла на чтение
$number = 1;
$total = 0;
while (<BOOKS>) {
($author, $title, $pub, $year, $price) = split(':'); # Разбиение строки
t по символу ':'
write; # Форматный вывод строки $total += $price; t Подсчет общей суммы
}
$~ = TOTAL; # Переключение формата
write; # Вывод по формату итоговой строки
format STDOUTJTOP =
Заказ № @#
$ number Автор Название Издатель Год Цена
format STDOUT = '
Л <«««««««««««« | @»»»»>» | @М!11М I @t### I @###.##р.
$author, $title, $pub, $year, $price
A «««««««««<««« | | | | ~~
$author
format TOTAL =
Итого: @###.##р. $total
В этой программе после форматной печати содержимого файла books осуществляется переключение на другой формат, по которому выводится строка с общей суммой заказа, подсчитанной в переменной $totai. Полученный с помощью этой программы заказ показан ниже
Заказ № I Автор Название Издатель Год Цена
В.Долженков Ю.Колесников I Excel 2000 I BHV | 1999 I 90.00р.
А.Матросов А.Сергеев I HTML 4.0 I BHV | 1999 | 70.00р.
М.Чаунин I I II
Т.Кристиансен Н.Торкингтон I Perl I Питер | 2000 | 100.00р.
Итого: 260.00р.
В завершение разговора о создании отчетов в Perl мы модифицируем программу примера 8.1, приспособив ее для печати отчета на основании информации о книгах из файла books, в котором в записи о книгах добавлено еще одно поле, содержащее краткую аннотацию книги:
В.Долженков Ю.Колесников:Excel 2000:BHV:1999:90:Аннотация книги
Отчет, формируемый этой программой (пример 8.3), также печатает нижний колонтитул на каждой странице. Для этого мы воспользуемся специальной переменной $ л ь, содержимое которой Perl печатает перед переходом на новую страницу во время форматного вывода. При этом следует уменьшить на количество строк, заданных в этой переменной, количество строк на странице, хранящееся в специальной переменной $=, иначе строки из переменной $ л ь попадут не в конец текущей страницы, а будут напечатаны на следующей странице, не создав никакого нижнего колонтитула.
#! peri -w
open FILE, "<books" or die $!;
open REPORT, "xreport" or die $!;
select REPORT; $~ •= STDOUT; $= = 24;
Sltime = localtime;
$-L = •("=" x 73) . "\n". "Книготорговая база \"БЕСЫ\"". (" " x 24)."$ltime\n\f";
$count = 0;
while(<FILE>) { .
($author, $title, $pub, $year, $price, $annot) = split(':');
$count++;
write ;
}
close(REPORT); format STDOUT_TOP =
Книги на складе @»»>»
; "стр. ".$%
Автор Название Издатель Год Цена Аннотация ________
format STDOUT =
@| Л «««««« /ч «««««« @<««« @### @##.##р. Л «««««««««
$count.".", $author, $title, $pub, $year, $price, $annot
Л «««««« л «««««« А «««««««««
$author, $title, $annot
Вывод отчета осуществляется в файл с именем report. Обратите внимание на задание переменной $ /4 L. В ней используется переменная $itime, в которой хранится текущая дата, полученная обращением к функции localtime. Одна страница отчета будет выглядеть следующим образом:
Книги на складе . стр. t Автор _______ Название ____ Издатель Год Цена Аннотация ________
1. В.Долженков Excel 2000 BHV 1999 90.00р. Книга является
Ю.Колесников справочным пособием
по MS Excel 2000. В ней рассматриваются следующие основные темы - настройка интерфейса и его основные элементы.
2. А.Матросов HTML 4.0 BHV 1999 70.00р. Представлен весь А.Сергеев спектр технологий М.Чаунин создания Web-документов (начиная от простейших -
статических - и до документов на основе
динамического HTML), включая форматирование текста, создание списков. Книготорговая база "БЕСЫ" Sat Mar 18 19:01:37 2000
Замечание |
|
Представленные в этой главе отчеты являются снятыми копиями экрана монитора, вывод на который осуществляется с использованием моноширинного шрифта. Если вывод осуществляется на принтер, то чтобы отчеты выглядели так, как они должны выглядеть, следует также использовать моноширинный шрифт, например Courier. Если используется пропорциональный шрифт, принятый на многих принтерах по умолчанию, то сформированные сценарием Perl отчеты "поползут", так как в в этих шрифтах каждый символ имеет собственную ширину, тогда как в моноширинных все символы имеют одинаковую ширину. |