Perl - 格式



Perl 使用称为“格式”的编写模板来输出报表。要使用 Perl 的格式功能,首先必须定义一个格式,然后才能使用该格式来编写格式化数据。

定义格式

以下是定义 Perl 格式的语法:

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

这里 FormatName 表示格式的名称。fieldline 是数据应如何格式化的特定方式。values 行表示将输入字段行的值。您用一个句点结束格式。

下一个 fieldline 可以包含任何文本或字段占位符。字段占位符保留用于稍后放置在那里的数据的空间。字段占位符具有以下格式:

@<<<<

此字段占位符左对齐,字段空间为 5。您必须计算 @ 符号和 < 符号以了解字段中的空格数。其他字段占位符包括:

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

格式示例如下:

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

在此示例中,$name 将以左对齐的方式写入 22 个字符的空间内,然后 age 将写入两个空格。

使用格式

为了调用此格式声明,我们将使用 write 关键字:

write EMPLOYEE;

问题是格式名称通常是打开的文件句柄的名称,write 语句会将输出发送到此文件句柄。由于我们希望数据发送到 STDOUT,因此我们必须将 EMPLOYEE 与 STDOUT 文件句柄关联。但是,首先,我们必须确保 STDOUT 是我们选择的文件句柄,使用 select() 函数。

select(STDOUT);

然后,我们将通过使用特殊变量 $~ 或 $FORMAT_NAME 将 EMPLOYEE 与 STDOUT 关联,如下所示设置新的格式名称:

$~ = "EMPLOYEE";

当我们现在执行 write() 时,数据将发送到 STDOUT。请记住:如果您要将报表写入任何其他文件句柄而不是 STDOUT,则可以使用 select() 函数选择该文件句柄,其余逻辑将保持不变。

让我们以以下示例为例。这里我们硬编码了值,仅用于演示用法。在实际使用中,您将从文件或数据库中读取值以生成实际报表,并且您可能需要再次将最终报表写入文件。

#!/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 变量:

#!/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 变量以及标题,如下所示:

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 包含当前标题格式的名称,但没有相应的机制可以自动对页脚执行相同操作。如果您有一个固定大小的页脚,则可以在每次 write() 之前检查变量 $- 或 $FORMAT_LINES_LEFT 并使用如下定义的另一个格式在必要时自行打印页脚:

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

有关与格式相关的完整变量集,请参阅 Perl 特殊变量 部分。

广告