Форматы
Пусть в файле 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