Опубликован: 17.08.2006 | Доступ: свободный | Студентов: 5389 / 708 | Оценка: 4.49 / 3.94 | Длительность: 20:58:00
ISBN: 978-5-9556-0078-9
Лекция 10:

Отчеты

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >

Вывод отчетов

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

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

< Лекция 9 || Лекция 10: 12345 || Лекция 11 >
Сергей Крупко
Сергей Крупко

Добрый день.

Я сейчас прохожу курс  повышения квалификации  - "Профессиональное веб-программирование". Мне нужно получить диплом по этому курсу. Я так полагаю нужно его оплатить чтобы получить диплом о повышении квалификации. Как мне оплатить этот курс?

 

Галина Башкирова
Галина Башкирова

Здравствуйте, недавно закончила курс по проф веб программиованию, мне прислали методические указания с примерами тем, однако темы там для специальности 

Системный администратор информационно-коммуникационных» систем.
Мне нужно самой найти тему? или делать по высланным темам