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 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特殊变量部分.