Perl - 格式化
Perl 使用一种称为"format"的书写模板来输出报告。 要使用 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;
问题是格式名通常是一个打开的文件句柄的名称,而写语句会将输出发送到这个文件句柄。 由于我们希望将数据发送到 STDOUT,我们必须将 EMPLOYEE 与 STDOUT 文件句柄相关联。 但是,首先,我们必须使用 select() 函数确保 STDOUT 是我们选择的文件句柄。
select(STDOUT);
然后,我们将通过使用特殊变量 $~ 或 $FORMAT_NAME 将新格式名称设置为 STDOUT,将 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; }
Now your report will look like −
=================================== 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 特殊变量 部分。