Язык программирования Perl
Шрифт:
Полный список символов, применяемых для описания полей и форматов, приводится в таблице 10.2.
Таблица 10.2. Символы, применяемые при описании полей и форматов
| Символ | Описание | Примеры использования |
|---|---|---|
| @ | начало обычного поля | @ @<< @||| @>> @## |
| ^ | начало специального поля | ^ ^<< ^||| ^>> ^## |
| < | текстовое поле с выравниванием значения влево и добавлением пробелов справа | @<<<<< ^<<< |
| | | текстовое поле с центрированием значения и добавлением пробелов с обеих сторон | @||||| ^||| |
| > | текстовое
| @>>>>> ^>>> |
| # | числовое поле с выравниванием значения вправо с добавлением пробелов слева | @#### ^### |
| 0 | (вместо первого #) числовое поле с выравниванием значения вправо и добавлением нулей слева | @0### ^0## |
| . | десятичная точка в числовом поле | @.### @0##.## |
| ... | закончить текстовое поле многоточием, чтобы показать усечение значения | @<<<<<... |
| @* | поле переменной ширины со значением, состоящим из нескольких строк | @* |
| ^* | поле переменной ширины для следующих строк многострочного значения | ^* |
| ~ | подавление вывода строки с пустыми значениями полей | ^* ~ |
| ~~ | повторять строку, пока все значения полей не станут пустыми | ~~ ^* |
| {} | группировка списка значений, который располагается на нескольких строках аргументов | {$one, $two, $three } |
| # | (первым символом в строке) строка комментария в описании формата (не может располагаться между строкой шаблонов и строкой аргументов) | # это комментарий |
| . | (единственным символом на отдельной строке) конец формата | format REPORT = описание формата . |
То, как применяются поледержатели при описании формата, можно увидеть из следующего примера:
Из примера понятно, что формат отчета записывается в виде, максимально похожем на представление страницы отчета на экране или на бумаге. Каждому полю в строке шаблонов должно соответствовать скалярное значение в строке аргументов. Имена переменных в строке аргументов для наглядности часто располагаются под соответствующими поледержателями в предыдущей строке шаблонов, хотя это совсем не обязательно. Список переменных может находиться на нескольких строках аргументов (как это сделано в описании последней строки формата); в этом случае он должен заключаться в фигурные скобки. Имейте в виду, что скалярные переменные и массивы в строке аргументов разворачиваются в единый список скаляров, из которого по порядку берутся значения для заполнения полей.
Для форматированного вывода отчетов применяется функция write, которая оформляет очередную порцию данных в соответствии с форматом отчета и выводит их в указанный выходной поток. Обращение к
функции write иногда называют вызовом формата. В качестве аргумента функции write может передаваться файловый манипулятор выходного потока. Вызванная без аргументов, она направляет отчет в текущий выходной поток. Перед обращением к ней нужно заполнить новыми данными переменные, перечисленные в строках аргументов текущего формата. Обычно write вызывается в цикле для вывода в отчет очередной строки. По историческим причинам для заполнения полей отчета часто используются глобальные переменные. Лексические переменные, объявленные с помощью my, доступны в формате только тогда, когда формат и лексические переменные объявлены в одной области видимости. Подробно об областях видимости переменных будет рассказано в лекции 12.Если для выходного потока описан формат начала страницы отчета, то перед выводом строк отчета функцией write в начале каждой страницы автоматически размещаются данные шапки страницы в соответствии с форматом начала страницы. Программа для вывода данных по формату, заданному в предыдущем примере, может выглядеть таким образом:
В результате выполнения этой программы в поток STDOUT будет выведен отчет, состоящий вот из таких карточек:
В каждую из выводимых в отчет карточек помещаются данные из одной записи входного файла.
Без указания файлового манипулятора вывод отчета функцией write и обычный вывод данных функцией print происходит в выходной поток по умолчанию (STDOUT). С помощью функции select можно назначить другой выходной поток по умолчанию. При вызове ей передается файловый манипулятор, и она переключается на новый поток, который становится текущим выходным потоком по умолчанию. Функция select возвращает имя ранее выбранного манипулятора, и это значение используется для восстановления предыдущего выходного потока. Это происходит таким образом:
При формировании сложного отчета может потребоваться возможность переключаться на разные форматы отчета. Установить для какого-либо потока определенный формат отчета можно путем присваивания имени формата переменной $~ ($FORMAT_NAME). Подобным же образом для конкретного потока устанавливается нужный формат заголовка страницы отчета: переменной $^ ($FORMAT_TOP_NAME) присваивается имя формата для шапки страницы. Это делается так:
Назначать для определенного потока формат отчета и заголовок страницы гораздо удобнее с помощью функций format_name и format_top_name из стандартного библиотечного модуля FileHandle. Это выглядит так: