То, как применяются поледержатели при описании формата, можно увидеть из следующего примера:
format STDOUT =
Учетная карточка пользователя N @0###
$number
---------------------------------------------------------
Фамилия @<<<<<<<<<<<<<< | Login @<<<<<<<
$last_name, $login
Имя @<<<<<<<<<<< | Группа @<<<<<<<<<<<<<<<<<
$first_name, $group
Отчество @<<<<<<<<<<<<<<<<<< |
$middle_name
E-mail @<<<<<<<<<<<<<<<<<< | Телефон @>>>>>>>>>
$email, $phone
Ограничение дискового пространства @####.## Мегабайт
$quota
---------------------------------------------------------
Дата регистрации @# @<<<<<<<<< @### года
{$day,
$month_name,$year}
.
Из примера понятно, что формат отчета записывается в виде, максимально похожем на представление страницы отчета на экране или на бумаге. Каждому полю в строке шаблонов должно соответствовать скалярное значение в строке аргументов. Имена переменных в строке аргументов для наглядности часто располагаются под соответствующими поледержателями в предыдущей строке шаблонов, хотя это совсем не обязательно. Список переменных может находиться на нескольких строках аргументов (как это сделано в описании последней строки формата); в этом случае он должен заключаться в фигурные скобки. Имейте в виду, что скалярные переменные и массивы в строке аргументов разворачиваются в единый список скаляров, из которого по порядку берутся значения для заполнения полей.
Для форматированного вывода отчетов применяется функция write(), которая оформляет очередную порцию данных в соответствии с форматом отчета и выводит их в указанный выходной поток. Обращение к функции write() иногда называют вызовом формата. В качестве аргумента функции write() может передаваться файловый манипулятор выходного потока. Вызванная без аргументов, она направляет отчет в текущий выходной поток. Перед обращением к ней нужно заполнить новыми данными переменные, перечисленные в строках аргументов текущего формата. Обычно write() вызывается в цикле для вывода в отчет очередной строки. По историческим причинам для заполнения полей отчета часто используются глобальные переменные. Лексические переменные, объявленные с помощью my(), доступны в формате только тогда, когда формат и лексические переменные объявлены в одной области видимости. Подробно об областях видимости переменных будет рассказано в лекции 12.
Если для выходного потока описан формат начала страницы отчета, то перед выводом строк отчета функцией write() в начале каждой страницы автоматически размещаются данные шапки страницы в соответствии с форматом начала страницы. Программа для вывода данных по формату, заданному в предыдущем примере, может выглядеть таким образом:
# данные в записи входного файла разделены запятыми
open my $in, '<', 'users.txt' or die;
while (my $line = <$in>) {
local ($last_name, $first_name, $middle_name,
$login, $group, $email, $phone, $quota, $number,
$day, $month_name, $year) = split ',', $line;
# данные для отчета помещены в переменные
write STDOUT; # данные выводятся в STDOUT по формату
}
close $in or die;
# здесь располагается описание формата...
В результате выполнения этой программы в поток STDOUT будет выведен отчет, состоящий вот из таких карточек:
Учетная карточка пользователя N 00001
---------------------------------------------------------
Фамилия Wall | Login larry
Имя Larry | Группа root
Отчество |