Чтение онлайн

на главную

Жанры

Язык программирования Perl

Шохирев Михаил Васильевич

Шрифт:

Для форматированного вывода отчетов применяется функция 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

Отчество |

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' специальное:' '

Специальные текстовые поля (например, ^<<<) используются для вывода в отчет данных, располагающихся на нескольких строках.

Есть несколько способов описать в формате данные, занимающие в отчете несколько строк. Если нужно поместить на странице отчета многострочное текстовое значение, то можно воспользоваться поледержателем @*, который просто выведет значение полностью, сохраняя имеющиеся в нем все символы перевода строки, кроме последнего. Например, так делается в этой программе:

Поделиться:
Популярные книги

Корсар

Русич Антон
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
6.29
рейтинг книги
Корсар

Девяностые приближаются

Иванов Дмитрий
3. Девяностые
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Девяностые приближаются

Жена фаворита королевы. Посмешище двора

Семина Дия
Фантастика:
фэнтези
5.00
рейтинг книги
Жена фаворита королевы. Посмешище двора

(не)Бальмануг. Дочь 2

Лашина Полина
8. Мир Десяти
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(не)Бальмануг. Дочь 2

Буря империи

Сай Ярослав
6. Медорфенов
Фантастика:
аниме
фэнтези
фантастика: прочее
эпическая фантастика
5.00
рейтинг книги
Буря империи

Идеальный мир для Лекаря 13

Сапфир Олег
13. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 13

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Зеркало силы

Кас Маркус
3. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Зеркало силы

Имя нам Легион. Том 5

Дорничев Дмитрий
5. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 5

Аномальный наследник. Том 3

Тарс Элиан
2. Аномальный наследник
Фантастика:
фэнтези
7.74
рейтинг книги
Аномальный наследник. Том 3

Архил...? 4

Кожевников Павел
4. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
5.50
рейтинг книги
Архил...? 4

Хозяйка лавандовой долины

Скор Элен
2. Хозяйка своей судьбы
Любовные романы:
любовно-фантастические романы
6.25
рейтинг книги
Хозяйка лавандовой долины

Отмороженный 10.0

Гарцевич Евгений Александрович
10. Отмороженный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Отмороженный 10.0

Ваше Сиятельство 2

Моури Эрли
2. Ваше Сиятельство
Фантастика:
фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Ваше Сиятельство 2