Perl 简明教程

Perl - Formats

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

Define a Format

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

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

此处, FormatName 表示格式的名称。 fieldline 是数据应如何格式化的特定方式。值行表示将输入到字段行中的值。你以一个句号结束格式。

接下来, fieldline 可以包含任何文本或字段持有器。字段持有器保留空间以容纳稍后将放入其中的数据。字段持有器的格式为 -

@<<<<

该字段持有器左对齐,具有 5 个字段空间。你必须计算 @ 符号和 < 符号来得知字段中的空格数。其他字段持有器包括 -

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

一个示例格式为 -

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

在此示例中,$name 将被写成 22 个字符空间内的左对齐,之后 age 将被写在两个空间中。

Using the Format

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

write EMPLOYEE;

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

select(STDOUT);

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

$~ = "EMPLOYEE";

当我们现在执行写操作时,数据将发送至 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
===================================

Define a Report Header

一切看起来都很好。但是,你可能希望向你的报告添加页眉。此页眉将打印在每页顶部。要做到这一点非常简单。除了定义模板外,你还必须定义页眉并将其分配给 $^ 或 $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
===================================

Define a Pagination

如果你的报告超过一页,该怎么办?你有个解决办法,只需按照以下步骤使用 $% 或 $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
===================================

Number of Lines on a Page

你可以使用特殊变量 $= (或 $FORMAT_LINES_PER_PAGE) 设置每页的行数,默认为 60。

而 $^ 或 $FORMAT_TOP_NAME 包含当前标题格式的名称,没有相应的机制可以自动为页脚执行相同操作。如果你有一个固定大小的页脚,可以通过在每次 write() 之前检查变量 $- 或 $FORMAT_LINES_LEFT 来获取页脚,并在需要时使用另一个定义如下格式自己打印页脚 −

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

有关与格式设置相关的变量的完整集合,请参考 Perl Special Variables 部分。