Форматирование вывода в Perl

Perl — очень мощный язык обработки текстовых данных.

В Perl можно использовать format для определения шаблона, а затем write для вывода данных в соответствии с указанным шаблоном.

Синтаксис определения формата Perl выглядит следующим образом:

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

Пояснение параметров:

  • FormatNameИмя формата.
  • fieldlineСтрока формата, используемая для определения формата строки вывода, подобно символам, таким как @, ^, <, >, |.
  • value_one,value_two……Строки данных, используемые для вставки значений в предшествующие строки формата; все они являются переменными Perl.
  • .Символ завершения.

Ниже приведён простой пример форматирования:

Пример

#!/usr/bin/perl $text = "google example taobao"; format STDOUT = first: ^<<<<< # Выровнено по левому краю, длина символов равна 6 $text second: ^<<<<< # Выровнено по левому краю, длина символов равна 6 $text third: ^<<<< # Выровнено по левому краю, длина символов равна 5, последняя o в taobao обрезается $text . write

Выполнение приведённого выше примера даёт следующий вывод:

first: google
second: example
third: taoba

Синтаксис строки формата (строки-изображения)

  • Строки формата начинаются с @ или ^, и в этих строках не выполняется никакая подстановка переменных.
  • @-поле (не путать с символом массива @) — обычное поле.
  • Символы <, >, | после @, ^ определяют длину поля; если переменная превышает заданную длину, она будет усечена.
  • Символы <, >, | также обозначают выравнивание по левому краю, по правому краю и по центру соответственно.
  • Поля ^ используются для заполнения многострочных текстовых блоков.

Форматы полей

Форматы полей показаны в следующей таблице:

Формат Значение поля
@<<< Вывод с выравниванием по левому краю
@>>> Вывод с выравниванием по правому краю
@||| Вывод с выравниванием по центру
@##.##   Число с фиксированной точностью
@* Многострочный текст

Первый символ каждого поля — это символ заполнения строки. Когда используется символ @, форматирование текста не выполняется.

В приведённой выше таблице, за исключением многострочного поля @*, ширина поля равна количеству указанных символов, включая символ @, например:

@###.##

Указывает ширину в семь символов: четыре до десятичной точки и две после десятичной точки.

Пример приведён ниже:

Пример

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . select(STDOUT); $~ = EMPLOYEE; @n = ("Ali", "Example", "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
===================================
===================================
Example                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Переменные формата

  • $~ ($FORMAT_NAME): имя формата $^ ($FORMAT_TOP_NAME): в нём хранится имя текущего формата заголовка
  • $% ($FORMAT_PAGE_NUMBER): номер текущей страницы вывода
  • $= ($FORMAT_LINES_PER_PAGE): количество строк на странице
  • $| ($FORMAT_AUTOFLUSH): нужно ли автоматически сбрасывать буфер вывода
  • $^L ($FORMAT_FORMFEED): строка, которую нужно выводить перед заголовком на каждой странице (кроме первой), хранится в

Ниже приведён простой пример форматирования с использованием $~:

Пример

#!/usr/bin/perl $~ = "MYFORMAT"; # Укажите формат, используемый для переменной файла по умолчанию write; # Вывод формата, указанного в $~ format MYFORMAT = # Определить формат MYFORMAT ================================= Текст # Пример руководства ================================= . write;

Выполнение приведённого выше примера даёт следующий вывод:

=================================
      Text # Example
=================================
=================================
      Text # Example
=================================

Если $~ не указан, будет выведен формат с именем STDOUT:

Пример

#!/usr/bin/perl write; # Если $~ не указан, выполняется поиск формата с именем STDOUT format STDOUT= ~Текст, указанный с ~, не будет выводиться ----------------STDOUTФормат ---------------- .

Выполнение приведённого выше примера даёт следующий вывод:

----------------
  STDOUT格式
----------------

В следующем примере мы демонстрируем использование переменных $^ или $FORMAT_TOP_NAME, добавляя информацию в заголовок отчёта:

Пример

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . format EMPLOYEE_TOP = =================================== Имя Возраст =================================== . select(STDOUT); $~ = EMPLOYEE; $^ = EMPLOYEE_TOP; @n = ("Ali", "Example", "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
===================================
===================================
Example                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Мы также можем использовать $% или $FORMAT_PAGE_NUMBER, чтобы задать нумерацию страниц для отчёта:

Пример

#!/usr/bin/perl format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name, $age @#####.## $salary =================================== . # Добавить нумерацию страниц $% format EMPLOYEE_TOP = =================================== Name Age Page @< $% =================================== . select(STDOUT); $~ = EMPLOYEE; $^ = EMPLOYEE_TOP; @n = ("Ali", "Example", "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 Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Example                  30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

Вывод в другие файлы

По умолчанию функция write выводит результаты в стандартный выходной файл STDOUT. Мы также можем заставить её выводить результаты в любой другой файл. Самый простой способ — передать файловую переменную в качестве параметра в write, например:

write(MYFILE);

В приведённом выше коде write по умолчанию использует формат печати с именем MYFILE для вывода в файл MYFILE.

Однако таким образом вы не можете использовать переменную $~ для изменения используемого формата печати. Системная переменная $~ работает только с файловой переменной по умолчанию. Мы можем изменить файловую переменную по умолчанию, изменить $~, а затем вызвать write.

Пример

#!/usr/bin/perl if (open(MYFILE, ">tmp")) { $~ = "MYFORMAT"; write MYFILE; # Вывод с использованием файловой переменной. В этом случае печатается формат с тем же именем, что и переменная, то есть MYFILE. Значение, указанное в $~, игнорируется. format MYFILE = # То же имя, что и у файловой переменной= ================================ Запись в файл ================================= .close MYFILE; }

После успешного выполнения мы можем просмотреть содержимое файла tmp, как показано ниже:

$ cat tmp 
=================================
      输入到文件中
=================================

Когда мы используем select для изменения файловой переменной по умолчанию, он возвращает внутреннее представление текущей файловой переменной по умолчанию. Таким образом, мы можем создавать подпрограммы для вывода по нашему усмотрению, не влияя на другие части программы.

Пример

#!/usr/bin/perl if (open(MYFILE, ">>tmp")) { select (MYFILE); # Направить вывод print файловой переменной по умолчанию в MYFILE $~ = "OTHER"; write; # Файловая переменная по умолчанию, печатает в файл, указанный select, должна использовать формат OTHER, указанный в $~ format OTHER= ================================= Использовать определённый формат для записи в файл ================================= .close MYFILE; }

После успешного выполнения мы можем просмотреть содержимое файла tmp, как показано ниже:

$ cat tmp 
=================================
      输入到文件中
=================================
=================================
  使用定义的格式输入到文件中
=================================
Другие расширения