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
===================================
Define a Report Footer
而 $^ 或 $FORMAT_TOP_NAME 包含当前标题格式的名称,没有相应的机制可以自动为页脚执行相同操作。如果你有一个固定大小的页脚,可以通过在每次 write() 之前检查变量 $- 或 $FORMAT_LINES_LEFT 来获取页脚,并在需要时使用另一个定义如下格式自己打印页脚 −
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
有关与格式设置相关的变量的完整集合,请参考 Perl Special Variables 部分。