- Perl 基础
- Perl - 首页
- Perl - 简介
- Perl - 环境
- Perl - 语法概述
- Perl - 数据类型
- Perl - 变量
- Perl - 标量
- Perl - 数组
- Perl - 哈希表
- Perl - IF...ELSE
- Perl - 循环
- Perl - 运算符
- Perl - 日期和时间
- Perl - 子程序
- Perl - 引用
- Perl - 格式
- Perl - 文件 I/O
- Perl - 目录
- Perl - 错误处理
- Perl - 特殊变量
- Perl - 编码规范
- Perl - 正则表达式
- Perl - 发送邮件
- Perl 高级
- Perl - 套接字编程
- Perl - 面向对象
- Perl - 数据库访问
- Perl - CGI 编程
- Perl - 包和模块
- Perl - 进程管理
- Perl - 嵌入式文档
- Perl - 函数引用
- Perl 有用资源
- Perl - 常见问题解答
- Perl - 快速指南
- Perl - 有用资源
- Perl - 讨论
Perl - 格式
Perl 使用称为“格式”的编写模板来输出报表。要使用 Perl 的格式功能,首先必须定义一个格式,然后才能使用该格式来编写格式化数据。
定义格式
以下是定义 Perl 格式的语法:
format FormatName = fieldline value_one, value_two, value_three fieldline value_one, value_two .
这里 FormatName 表示格式的名称。fieldline 是数据应如何格式化的特定方式。values 行表示将输入字段行的值。您用一个句点结束格式。
下一个 fieldline 可以包含任何文本或字段占位符。字段占位符保留用于稍后放置在那里的数据的空间。字段占位符具有以下格式:
@<<<<
此字段占位符左对齐,字段空间为 5。您必须计算 @ 符号和 < 符号以了解字段中的空格数。其他字段占位符包括:
@>>>> right-justified @|||| centered @####.## numeric field holder @* multiline field holder
格式示例如下:
format EMPLOYEE = =================================== @<<<<<<<<<<<<<<<<<<<<<< @<< $name $age @#####.## $salary =================================== .
在此示例中,$name 将以左对齐的方式写入 22 个字符的空间内,然后 age 将写入两个空格。
使用格式
为了调用此格式声明,我们将使用 write 关键字:
write EMPLOYEE;
问题是格式名称通常是打开的文件句柄的名称,write 语句会将输出发送到此文件句柄。由于我们希望数据发送到 STDOUT,因此我们必须将 EMPLOYEE 与 STDOUT 文件句柄关联。但是,首先,我们必须确保 STDOUT 是我们选择的文件句柄,使用 select() 函数。
select(STDOUT);
然后,我们将通过使用特殊变量 $~ 或 $FORMAT_NAME 将 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; }
现在您的报表将如下所示:
=================================== 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 特殊变量 部分。