Вся информация, хранящаяся в компьютерных системах, в конечном счете предназначена для людей, а людям нравится видеть ее упорядоченной и аккуратно представленной.
Внешний вид FORMAT_NAME будет выглядеть так:
format FORMAT_NAME = описание формата отчета .
Форматы не исполняются, поскольку являются описаниями, как и определения $~ (или $FORMAT_NAME при включенной прагме use English ). Если имя формата в описании не указано, подразумевается STDOUT.
Кроме основного формата, часто требуется описание отдельного формата для шапки страницы, которая будет выводиться в начале каждой страницы '_TOP'. Он описывается так:
format FORMAT_NAME_TOP = описание формата шапки отчета .
Имя текущего формата для шапки страницы, связанного с текущим выходным потоком, хранится в специальной $^ ($FORMAT_TOP_NAME). При выводе
В описании формата
format STDOUT =
1. Строка шаблонов содержит поля: @<<<<< и @###.##
'поле1', $field2
# 3. Комментарий: во 2-й строке данные для вставки в 1-ю
4. Литеральная строка выводится "как есть".
.
В комментариях и литеральных строках нет ничего особенного, самое интересное содержится в строках шаблонов, содержащих
Поле
| Поледержатель | Описания формата и преобразований |
|---|---|
| @<<<<<<<<<<< | Вывести текстовое значение в поле шириной в 12 символов. Выровнять его по левому краю, дополнив при необходимости пробелами справа до ширины поля. Слишком длинное значение усечь до ширины поля |
| @<<<<<<<<... | Аналогично предыдущему примеру, но с выведением в конце поля многоточия, если значение усечено |
| @#####.### | Вывести числовое значение в поле шириной в 9 символов, отведя 5 цифр под целую и 3 цифры - под дробную часть числа. Выровнять его по правому краю и дополнить при необходимости целую часть числа пробелами слева до ширины поля и округлить дробную часть до 3 знаков. При попытке вывести число, целая часть которого не умещается в ширину поля, заполнить поле символом '#' как признак |
| @0###.### | Так же, как в предыдущем примере, но с дополнением целой части значения ведущими нулями до ширины поля |
Полный
| Символ | Описание | Примеры использования |
|---|---|---|
| @ | начало обычного поля | @ @<< @||| @>> @## |
| ^ | начало специального поля | ^ ^<< ^||| ^>> ^## |
| < | текстовое поле с выравниванием значения влево и добавлением пробелов справа | @<<<<< ^<<< |
| | | текстовое поле с центрированием значения и добавлением пробелов с обеих сторон | @||||| ^||| |
| > | текстовое поле с выравниванием значения вправо и добавлением пробелов слева | @>>>>> ^>>> |
| # | числовое поле с выравниванием значения вправо с добавлением пробелов слева | @#### ^### |
| 0 | (вместо первого #) числовое поле с выравниванием значения вправо и добавлением нулей слева | @0### ^0## |
| . | десятичная точка в числовом поле | @.### @0##.## |
| ... | закончить текстовое поле многоточием, чтобы показать усечение значения | @<<<<<... |
| @* | поле |
@* |
| ^* | поле |
^* |
| ~ | подавление |
^* ~ |
| ~~ | повторять строку, пока все значения полей не станут пустыми | ~~ ^* |
| {} | группировка |
{$one, $two, $three } |
| # | (первым символом в строке) строка комментария в описании формата (не может располагаться между строкой шаблонов и строкой |
# это комментарий |
| . | (единственным символом на отдельной строке) конец формата |
То, как применяются поледержатели при описании формата, можно увидеть из следующего примера:
format STDOUT =
Учетная карточка пользователя N @0###
$number
---------------------------------------------------------
Фамилия @<<<<<<<<<<<<<< | Login @<<<<<<<
$last_name, $login
Имя @<<<<<<<<<<< | Группа @<<<<<<<<<<<<<<<<<
$first_name, $group
Отчество @<<<<<<<<<<<<<<<<<< |
$middle_name
E-mail @<<<<<<<<<<<<<<<<<< | Телефон @>>>>>>>>>
$email, $phone
Ограничение дискового пространства @####.## Мегабайт
$quota
---------------------------------------------------------
Дата регистрации @# @<<<<<<<<< @### года
{$day,
$month_name,$year}
.
Из примера понятно, что формат
Для , которая оформляет очередную порцию данных в соответствии с форматом иногда называют вызовом формата. В качестве может передаваться файловый вызывается в цикле для my(), доступны в формате только тогда, когда формат и лексические
Если для выходного потока описан формат начала страницы в начале каждой страницы автоматически размещаются данные шапки страницы в соответствии с форматом начала страницы. Программа для
# данные в записи входного файла разделены запятыми
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;
# здесь располагается описание формата...
В
Учетная карточка пользователя N 00001 --------------------------------------------------------- Фамилия Wall | Login larry Имя Larry | Группа root Отчество | E-mail larry@wall.org | Телефон +123456789 Ограничение дискового пространства 9876,54 Мегабайт --------------------------------------------------------- Дата регистрации 18 декабря 1987 года
В каждую из выводимых в отчет карточек помещаются данные из одной записи входного
Без указания файлового и обычный происходит в выходной поток по умолчанию (STDOUT). С помощью функции можно назначить другой выходной поток по умолчанию. При вызове ей передается файловый возвращает имя ранее выбранного
$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() после файлового .
Пока что в примерах использовались только обычные поля (
format STDOUT = обычное:'@##.##' специальное:'^####' undef, undef . write STDOUT; # вывод данных по формату в STDOUT # выведет: обычное:' 0.00' специальное:' '
Специальные текстовые поля (например, ^<<<) используются для
Есть несколько способов описать в формате данные, занимающие в
format STDOUT = Гамлет: @* $multi_line_text (У. Шекспир) . $multi_line_text = "Быть\nИли не быть?\nВот в чем вопрос."; write STDOUT;
В
Гамлет:
Быть
Или не быть?
Вот в чем вопрос.
(У. Шекспир)
Поледержатель ^* описывает в формате текстовое поле, значение которого должно выводиться на несколько строк определенной ширины. В строке
# выводимое многострочное значение
$text = "Что значит имя?\nРоза пахнет розой\n"
. "Хоть розой назови ее, хоть нет.";
write STDOUT;
# описание формата отчета
format STDOUT =
^*
$text
^*
$text
^* ~
$text
^* ~
$text
У.Шекспир, "Ромео и Джульетта"
.
Обратите внимание, что в формате для $ предусмотрены четыре строки. Причем первые две строки ^* ) будут выводиться в любом случае: даже если $ содержит только одну строку текста, вторая строка будет заполнена пробелами. Чтобы не выводить пробельных строк, в описании третьей и четвертой строк указан шаблон подавления пустых строк (одна тильда, ~), который может располагаться в любом месте строки шаблона. После выполнения приведенной программы текст будет выведен в таком виде:
Что значит имя? Роза пахнет розой Хоть розой назови ее, хоть нет. У.Шекспир, "Ромео и Джульетта"
Если заранее неизвестно минимальное количество выводимых строк, можно применить шаблон повторения многострочного поля (две ~~ ). В этом случае строка шаблона будет применяться многократно, пока не будет исчерпано многострочное значение, при этом пустые строки выводиться не будут.
format STDOUT = ^* ~~ $text У.Шекспир, "Ромео и Джульетта" .
В
Для описания в формате текстового значения, которое должно выводиться на несколько строк, применяется поледержатель следующего вида: ^<<<<<. Это специальное поле иногда называется "заполняемым полем". Оно предназначается для
my $shakespeare = 'Две равно уважаемых семьи '
. 'В Вероне, где встречают нас событья, '
. 'Ведут междоусобные бои '
. 'И не хотят унять кровопролитья.';
my $text = $shakespeare;
write STDOUT;
# описание формата вывода
format STDOUT =
~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$text
У.Шекспир, "Ромео и Джульетта"
.
В этом примере для организации неявного
Две равно уважаемых семьи В Вероне,
где встречают нас событья, Ведут
междоусобные бои И не хотят унять
кровопролитья.
У.Шекспир, "Ромео и Джульетта"
Подобным образом в отчет выводятся блоки текстовой информации: примечания, описания, адрес и т. п.
Кроме $% ($FORMAT_PAGE_NUMBER), и ее часто включают в формат $= ($FORMAT_LINES_PER_PAGE) хранится число строк на странице: по умолчанию - 60, но его можно изменить на нужное значение перед выводом $- ($FORMAT_LINES_LEFT) содержится число оставшихся на странице строк. Переменная $^L ($FORMAT_FORMFEED) хранит символ перевода страницы (formfeed
Специальная переменная $: ($FORMAT_LINE_BREAK_SEPARATOR) содержит набор символов разрыва строки, после которых строка может быть разделена при заполнении в формате специальных полей продолжения. Специальная переменная $^A ($formline() и , в котором накапливаются данные $. ($INPUT_LINE_NUMBER), в которой хранится номер прочитанной из входного
Дополнительные сведения о форматах и отчетах в
perldoc perlform
В завершение лекции приведем пример законченной программы (с образцом исходных данных), выводящей отчет о книгах по языку
open my $report, '>', '/report.txt' or die;
$old_handle = select $out; # выбрать поток для отчета
select $report;
$^ = 'HEAD';
$~ = 'REPORT';
# описание форматов для отчета
while(<DATA>) { # чтение одной записи данных
($authors, $title, $year, $nick) = split ':';
write $report; # вывод одной строки отчета
}
close $report or die;
# формат для заголовка страницы
format HEAD =
Классические книги по языку Perl
издательства O'Reilly
Лист @#
$%
---------------+--------------------+----+------------
Авторы | Заглавие |Год | Прозвище
---------------+--------------------+----+------------
.
format REPORT =
^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<|@###|@>>>>>>>>>>>
$authors, $title, $year, $nick
^<<<<<<<<<<<<<<|^<<<<<<<<<<<<<<<<<<<| | ~~
$authors, $title
---------------+--------------------+----+------------
.
__DATA__
Cozens S.:Advanced Perl Programming,2nd ed.:2005:Panther Book
Friedl J.E.F.:Mastering Regular Expressions:1997:Owls Book
...
Результатом работы этой программы будет такой отчет, размещенный в файле
Классические книги по языку Perl
издательства O'Reilly
Лист 1
---------------+--------------------+----+------------
Авторы | Заглавие |Год | Прозвище
---------------+--------------------+----+------------
Cozens S. |Advanced Perl |2005|Panther Book
|Programming,2nd ed. | |
---------------+--------------------+----+------------
Friedl J.E.F. |Mastering Regular |1997| Owls Book
|Expressions | |
---------------+--------------------+----+------------
Schwartz R.L., |Learning Perl, 4th |2005| Llama Book
Phoenix T., |ed. | |
brian d foy | | |
---------------+--------------------+----+------------
Конечно, изученные в этой лекции средства отчетов не могут сравниться с современными специализированными построителями отчетов, но во многих случаях бывает достаточно
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.