E-mail larry@wall.org | Телефон +123456789
Ограничение дискового пространства 9876,54 Мегабайт
---------------------------------------------------------
Дата регистрации 18 декабря 1987 года
В каждую из выводимых в отчет карточек помещаются данные из одной записи входного файла.
Без указания файлового манипулятора вывод отчета функцией write() и обычный вывод данных функцией print() происходит в выходной поток по умолчанию (STDOUT). С помощью функции select() можно назначить другой выходной поток по умолчанию. При вызове ей передается файловый манипулятор, и она переключается на новый поток, который становится текущим выходным потоком по умолчанию. Функция select() возвращает имя ранее выбранного манипулятора, и это значение используется для восстановления предыдущего выходного потока. Это происходит таким образом:
$old_handle = # сохранить файловый манипулятор
select $new_handle; # переключиться на новый поток
write; # вывести в новый поток
select $old_handle; # восстановить предыдущий поток
При формировании сложного отчета может потребоваться возможность переключаться на разные форматы отчета. Установить для какого-либо потока определенный формат отчета можно путем присваивания имени формата переменной $~ ($FORMAT_NAME). Подобным же образом для конкретного потока устанавливается нужный формат заголовка страницы отчета: переменной $^ ($FORMAT_TOP_NAME) присваивается имя формата для шапки страницы. Это делается так:
$old_handle = select $out; # выбрать поток для отчета
$^ = 'REPORT_TOP'; # назначить формат для шапки отчета
$~ = 'REPORT'; # назначить формат для отчета
write $out; # вывести в $out по формату REPORT
select $old_handle; # вернуться к предыдущему потоку
Назначать для определенного потока формат отчета и заголовок страницы гораздо удобнее с помощью функций format_name() и format_top_name() из стандартного библиотечного модуля FileHandle. Это выглядит так:
use FileHandle; # подключить модуль работы с файлами
# назначить для потока $report формат отчета REPORT
format_name $report REPORT;
# назначить для потока $report формат заголовка PAGE
format_top_name $report PAGE;
# используя назначенные форматы,
write $report; # вывести строку отчета в $report
Обратите внимание, что при обращении к функциям format_name() и format_top_name() после файлового манипулятора не ставится запятая, так же как при вызове функции print().
Пока что в примерах использовались только обычные поля (regular fields), которые описываются поледержателями, начинающимися с символа @. Поледержатели, описание которых начинается с символа ^, представляют так называемые специальные поля (special fields), обладающие возможностью дополнительной обработки данных. Так, специальные числовые поля (например, ^###), содержащие неопределенное значение (undef), заполняются пробелами. Обычные числовые поля (например, @###) в этом случае выводят нули. Это демонстрирует следующий пример:
format STDOUT =
обычное:'@##.##' специальное:'^####'
undef, undef
.
write STDOUT; # вывод данных по формату в STDOUT
# выведет: обычное:' 0.00' специальное:' '
Специальные текстовые поля (например, ^<<<) используются для вывода в отчет данных, располагающихся на нескольких строках.
Есть несколько способов описать в формате данные, занимающие в отчете несколько строк. Если нужно поместить на странице отчета многострочное текстовое значение, то можно воспользоваться поледержателем @*, который просто выведет значение полностью, сохраняя имеющиеся в нем все символы перевода строки, кроме последнего. Например, так делается в этой программе:
format STDOUT =
Гамлет:
@*
$multi_line_text
(У. Шекспир)
.
$multi_line_text = "Быть\nИли не быть?\nВот в чем вопрос.";
write STDOUT;
В результате ее выполнения будет выведено известное высказывание с сохранением его разбивки на несколько строк:
Гамлет:
Быть
Или не быть?
Вот в чем вопрос.
(У. Шекспир)
Поледержатель ^* описывает в формате текстовое поле, значение которого должно выводиться на несколько строк определенной ширины. В строке аргументов такому полю должно соответствовать имя переменной: скаляра, элемента массива или хэша. Когда значение этой переменной помещается в поле отчета, из переменной извлекается часть текстового значения до первого разделителя строк. Если переменная употребляется в формате несколько раз, то ее значение уменьшается на число извлеченных символов при каждом обращении к ней. Вот как это выглядит на примере: