Учебники

Perl — форматы

Perl использует шаблон письма, называемый «формат», для вывода отчетов. Чтобы использовать функцию форматирования Perl, вы должны сначала определить формат, а затем вы можете использовать этот формат для записи отформатированных данных.

Определить формат

Ниже приведен синтаксис для определения формата Perl:

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

Здесь FormatName представляет название формата. Поле представляет собой определенный способ, данные должны быть отформатированы. Строки значений представляют значения, которые будут введены в строку поля. Вы заканчиваете формат с одним периодом.

Следующая полевая строка может содержать любой текст или держатели полей. Владельцы полей содержат место для данных, которые будут размещены там позже. Полевой держатель имеет формат —

@<<<<

Этот держатель поля выровнен по левому краю с пробелом поля 5. Вы должны посчитать знак @ и знак <, чтобы узнать количество пробелов в поле. Другие владельцы поля включают в себя —

@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder

Примерный формат будет —

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

В этом примере $ name будет записано как выравнивание по левому краю в пределах 22 пробелов, а после этого возраста будет записано в двух пробелах.

Использование формата

Чтобы вызвать это объявление формата, мы использовали бы ключевое слово write

write EMPLOYEE;

Проблема заключается в том, что именем формата обычно является имя дескриптора открытого файла, и оператор write отправит выходные данные в этот дескриптор файла. Поскольку мы хотим, чтобы данные отправлялись в STDOUT, мы должны связать EMPLOYEE с дескриптором файла STDOUT. Сначала, однако, мы должны убедиться, что STDOUT — наш дескриптор выбранного файла, используя функцию select ().

select(STDOUT);

Затем мы связали бы EMPLOYEE с STDOUT, установив имя нового формата с STDOUT, используя специальную переменную $ ~ или $ FORMAT_NAME следующим образом:

$~ = "EMPLOYEE";

Когда мы сейчас делаем write (), данные будут отправлены в STDOUT. Помните: если вы собираетесь написать свой отчет в любом другом дескрипторе файла вместо STDOUT, тогда вы можете использовать функцию select (), чтобы выбрать этот дескриптор файла, а остальная логика останется прежней.

Давайте возьмем следующий пример. Здесь у нас есть жестко закодированные значения только для демонстрации использования. При фактическом использовании вы будете считывать значения из файла или базы данных для создания реальных отчетов, и вам может потребоваться снова записать окончательный отчет в файл.

Live Demo

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

select(STDOUT);
$~ = EMPLOYEE;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n) {
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

При выполнении это даст следующий результат —

===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Определить заголовок отчета

Все выглядит хорошо. Но вам будет интересно добавить заголовок в ваш отчет. Этот заголовок будет напечатан в верхней части каждой страницы. Это очень просто сделать. Помимо определения шаблона вам нужно будет определить заголовок и назначить его переменной $ ^ или $ FORMAT_TOP_NAME —

Live Demo

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n) {
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

Теперь ваш отчет будет выглядеть так:

===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Определить пагинацию

Что делать, если ваш отчет занимает более одной страницы? У вас есть решение для этого, просто используйте $% или $ FORMAT_PAGE_NUMBER vairable вместе с заголовком следующим образом:

format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
===================================                               
.

Теперь ваш вывод будет выглядеть следующим образом —

===================================
Name                    Age Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Количество строк на странице

Вы можете установить количество строк на странице, используя специальную переменную $ = (или $ FORMAT_LINES_PER_PAGE), по умолчанию $ = будет 60.

Определить нижний колонтитул отчета

Хотя $ ^ или $ FORMAT_TOP_NAME содержит имя текущего формата заголовка, не существует соответствующего механизма, который автоматически делал бы то же самое для нижнего колонтитула. Если у вас есть нижний колонтитул фиксированного размера, вы можете получить нижние колонтитулы, проверяя переменную $ — или $ FORMAT_LINES_LEFT перед каждой записью () и, при необходимости, печатать нижний колонтитул самостоятельно, используя другой формат, определенный следующим образом:

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

Полный набор переменных, связанных с форматированием, см. В разделе « Специальные переменные Perl ».