На этом шаге мы закончим рассмотрение вопросов, связанных с объявлением и использованием формата.
Прежде всего познакомимся с еще одним символом форматирования - символом "*", который позволяет выводить длинные строковые данные в нескольких строках, длина которых равна максимальной ширине вывода устройства отображения (экрана монитора или принтера). Например, если переменная $record содержит строковые данные длиной более 80 символов и вывод осуществляется на экран монитора, то следующая программа:
#! perl -w
$record = "В.Долженков Ю.Колесников:Excel 2000:BHV:1999:90:Книга является... .";
write;
format STDOUT =
@*
$record
.
Рис.1. Результат работы приложения
Достаточно часто случаются ситуации, когда отчет не помещается на одной странице. Можно печатать отчет в несколько страниц. Дело в том, что создание отчетов в Perl предполагает их вывод на принтер, а поэтому после вывода определенного количества строк функцией write() Perl автоматически выведет символ перехода на новую страницу и печать продолжится на следующей странице. По умолчанию количество строк на странице установлено равным 60. Эта величина хранится в специальной переменной $=, значение которой может быть изменено.
Итак, мы теперь знаем, что переход на новую страницу происходит автоматически, но нам хотелось бы, чтобы на каждой странице печатался верхний колонтитул, в котором отображалось бы наименование отчета и печатались номера страниц. И это возможно в Perl. Следует только задать формат со специальным именем, добавив к имени формата, по которому мы выводим информацию (в нашей программе STDOUT), суффикс _TOP. Этот формат будет выводиться каждый раз, как начинается печать новой страницы.
Изменим программу из предыдущего шага, добавив в нее следующее объявление формата:
format STDOUT_TOP = Книги на складе @>>>>>> "стр. ".$% Автор Название Издатель Год Цена ======================================================================== .
и явно зададим количество строк на странице, добавив перед циклом while оператор:
$= = 6;
Таким образом, программа примет следующий вид:
#! perl -w open BOOKS, "< books"; # Открытие файла на чтение. $= = 6; while (<BOOKS>) { # Разбиение строки по символу ' : '. ($author, $title, $pub, $year, $price) = split (':'); write; # Форматный вывод строки. } format STDOUT = @<<<<<<<<<<<<<<<<<<<<<<<<< | ^>>>>>>>>>>> | @||||||| | @#### | @###.##р. $author, $title, $pub, $year, $price | ^>>>>>>>>>>> | | |~~ $title . format STDOUT_TOP = Книги на складе @>>>>>> "стр. ".$% Автор Название Издатель Год Цена ======================================================================== .
Результат работы приложения изображен на рисунке 2:
Рис.2. Результат работы приложения
Теперь наша программа напечатает три страницы отчета, причем на каждой из них будет напечатан колонтитул.
Вернемся к объявлению формата для колонтитула. Во-первых, при его задании мы использовали выражение "стр. ".$% в строке переменных. Действительно, хотя формат и не вычисляется, но во время выполнения программы вычисляются значения переменных и все выражения строки переменных формата. Во-вторых, мы использовали специальную переменную $%, которая хранит текущий номер выводимой страницы. Это позволило нам в колонтитуле напечатать номера страниц.
На следующем шаге мы рассмотрим использование нескольких форматов.