1. 创建格式化报告
一个格式的声明是以关键字format开始的,采用如下形式:
format formatName=
text
.
其中格式定义的“text”部分由3种类型的行组成:注释行、描述行和行参数。
Ø 注释行:是以一个“#”开头,并且在按格式打印时将被忽略。
Ø 描述行:则指定了格式的内容,其中包含常规文本和格式字段。常规文本就是按原样打印,而不需要作任何修改。格式字段为将要按格式输出的值指定的占位符。以一个@或^开始的字段,其后紧跟格式说明符,它指明字段的长度以及如何对齐。
Ø 参数行:制定了替代前面描述行中所述的字段的内容。一个参数行包含了一个以逗号分隔的列表。
在perl中,用write函数发起格式调用。默认的格式将使用特殊的文件句柄,而且格式的名字与此文件句柄相同。如为了使用STDOUT,指定其为使用默认格式,并且需要将这个格式命名为STDOUT。
紧跟@后面的字符内容指定了字段的格式对齐类型。“<”字符指定字段格式的左对齐类型。“>”字符指定字段格式的右对齐类型。“|”字符指定字段格式的居中对齐类型。字段的所有字符(包括@在内)指明了字段的宽度。若声明的格式字段由于宽度不够而不能容纳其值时,将导致其值被截掉。
使用格式时,请注意:对格式中使用的任何变量,它必须处在格式声明的作用域内。因此,要想在一个格式中使用my变量,那么必须在这些变量定义之后,而且在变量超出作用域之前,声明这个格式。一个子程序使用格式时,必须在该子程序内部声明这个变量,或者使用全局变量。
2. 页面顶部处理
Perl可以判断在特殊变量“$=”($FORMAT_LINES_PER_PAGE)中存储的是什么内容。每次在输出内容的开始部分时,都是输出每页的行数,并执行页眉部分。默认的页眉格式是由write函数来触发的,并且这个默认的页眉格式的名字就是当前文件句柄及在后面添加的_TOP所形成的。
按小数点对齐方式使用#符号,格式如下:
@####.##
页顶处理是由write函数自动完成的。Write函数将查看$-变量(也就是$FORMAT_LINE_LEFT变量,这个变量指定了在当前页中所余留的所有行数。),并判断在当前页中是否还有足够的空间来满足输出的需求。如果没有足够的空间,write函数将输出特殊变量$^L的值,这个变量默认为换页字符“/f”,但也可以改变为任意字串内容。换页字符“/f”表示将开始新的一页。接下来所要输出的是页眉格式。
Perl不自动提供页面底部格式,如果需要页脚可以使用如下方法。
² 减少每页的页脚部分的行数,并将页脚的文本内容放到$^L变量中。因为$^L变量将在一个新的页面开始之前输出,所以该变量文本内容将显示在前一页的底部。
² 如果页脚比较复杂,则需要监控$-变量的值,并在这个变量达到正确值时,执行必要的处理任务。
3. 多行格式字段
多行字段使用“^”字符定义,它告诉perl以字为单位打印该字段所能容纳的最多内容,若该字段余下的长度不足以打印下一个字,则不在给字段中打印这个字并将余下部分留空。格式在下次引用该变量时,将从变量中这个字开始输出。
不过,这个风格的格式将会导致write函数改变这个变量的值。如果需要在调用write函数后再使用这个值,则在调用write函数前,使用一个临时变量存储这个值。
在可能输出为空的行中使用“~”字符,当行的内容为空的时候,他们将被压缩。
在格式的最后部分可以使用“…”字符,表示实际内容将长于显示的内容,这三个圆点只有在内容溢出时才被显示。
如果不想限制输出的行数,则可以在最后一行放置“~~”,表示该行将按所指定的格式重复,直到内容全部输出完成。
对这一段内容不太理解 |
另一个灵活性较差的多行输出方式是使用“@*”字段。这个字段可以将一个变量的内容分离成多个行,并输出这个变量的全部内容。这个“@*”字段最适合以自身单独成为一行的情况。在这一行中,“@*”之前的任何文本或字段都将被输出一次,并不会因为溢出而被重复。“@*”字段将这个变量中的内容分离为等长的几行,而不考虑在该行中的其他文本的内容,所以如果在“@*”字段前有文本内容,则将导致该行结尾与其他行不一致。在“@*”字段后不应放置文本内容,否则将导致不可预期的结果。
“@*”字段可以识别“/n”和“/t”字符,并将打印出对应的结果,而“^”字段将“/n”和“/t”打印成空格。
4. 格式变量
Perl提供了一个模块,允许使用更符合逻辑的名字来替代这些内置变量:即“use English”实用化命名方法,它允许实用替代名。这些特殊变量都是每个文件句柄所特有的。若要访问的是某个文件句柄的这些变量,而不是当前的,则使用“select”函数选择这个句柄。
名字 | Use English名字 | 说明 | 默认值 |
$~ | $FORMAT_NAME | 当前格式名 | STDOUT |
$^ | $FORMAT_TOP_NAME | 当前页眉 | STDOUT_TOP |
$% | $FORMAT_PAGE_NUMBER | 当前页号 | 0 |
$= | $FORMAT_LINES_PER_PAGE | 每页输出的行数 | 60 |
$- | $FORMAT_LINES_LEFT | 当前页所余留行数 | 0 |
$: | $FORMAT_LINE_BREAK_CHARACTERS | 应开始费为多行的字符数 | -/n |
$^L | $FORMAT_FORMFEED | 文本开始输出到新页 | /n |
$. | $INPUT_LINE_NUMBER | 给读取的每一行进行编号 | 0 |
如果一个多行的写操作超出了一页的范围,则write函数将开始一个新的页面。如果要求每页所打印的行数都必须完全相同,则可以监视$-变量,并做一些额外的处理。如果格式每次都有固定的长度,可以仅检查下一个write操作是否跳过一些行,并在执行格式之前打印出所有必要数目的行。另外,确保换页格式变量$^L对每个余留德航总是包含一个新行,当完全不知道下一个write是否需要一个新的页面时,这种方法比较有效。按这种方式,当换页时,程序将填充那些被跳过的行。
当格式发生变化的时候,write函数并没有以打印的页眉作为开始,而输出的是“This is a sample text file.”。想要强制输出页眉格式,可设置余留行格式变量($-)为0。
使用$-变量时,print 语句不会自动递减$-变量的值。只有在使用write函数时才会递减。如果使用print,并希望$-的值能递减,只能自己递减这个变量。
[F1]这一段的内容不太理解!!!
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>