Formats
Perl使用称为“格式”的书写模板来输出报告。 要使用Perl的格式功能,您必须首先定义格式,然后您可以使用该格式来编写格式化数据。
定义格式
以下是定义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个字符空间内写为左对齐,并且在该年龄之后将写入两个空格。
使用格式
为了调用这种格式声明,我们将使用write关键字 -
write EMPLOYEE;
问题是格式名称通常是打开文件句柄的名称,而write语句将输出发送到此文件句柄。 由于我们希望将数据发送到STDOUT,因此我们必须将EMPLOYEE与STDOUT文件句柄相关联。 首先,我们必须使用select()函数确保STDOUT是我们选择的文件句柄。
select(STDOUT);
然后我们将EMPLOYEE与STDOUT联系起来,方法是使用特殊变量$〜或$ FORMAT_NAME将新格式名称设置为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 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包含当前标题格式的名称,但没有相应的机制可以自动为页脚执行相同的操作。 如果你有一个固定大小的页脚,你可以通过在每次write()之前检查变量$ - 或$ FORMAT_LINES_LEFT来获取页脚,并在必要时使用另一种格式打印页脚,如下所示 -
format EMPLOYEE_BOTTOM =
End of Page @<
$%
.
有关与格式化相关的一整套变量,请参阅Perl特殊变量部分。