Perl格式化输出用法指南
本文和大家重点讨论一下Perl格式化输出的用法,我们已经见过用print函数将原始的未格式化的文本输出到文件,本文讲述如何用函数write和打印格式来生成格式化的输出。希望本文的介绍对你的学习有所帮助。
Perl格式化输出
我们已经见过用print函数将原始的未格式化的文本输出到文件,本文讲述如何用函数write和打印格式来生成格式化的输出。
一、Perl格式化输出中定义打印格式
定义打印格式的关键字为format,语法为:
formatformatname=
lines_of_output
打印格式名formatname的命名规则与一般变量相同。结束行为一个句号,此行不能有任何其它字符,包括空格,句号必须是该行第一个字符。
打印格式的定义象子程序一样可以放在任何地方,甚至可以放在条件语句中,但是最好把它们集中放在程序的开头或结尾。
二、Perl格式化输出中显示打印格式
打印格式的显示有两步:
1、将系统变量$~设成所要使用的格式
2、调用函数write
例如:
1:#!/usr/local/bin/Perl 2: 3:$~="MYFORMAT"; 4:write; 5: 6:formatMYFORMAT= 7:=================================== 8:HereisthetextIwanttodisplay. 9:=================================== 10:.
结果输出如下:
$program =================================== HereisthetextIwanttodisplay. =================================== $
如果不用$~指定打印格式,Perl解释器就假定要使用的格式名与要写入的文件变量同名,在本例中,如果不指定使用MYFORMAT,则Perl解释器试图使用名为STDOUT的打印格式。
三、Perl格式化输出在打印格式中显示值
我们使用打印格式的主要原因当然是格式化存贮在简单变量或数组变量中的值从而生成可读性好的输出,这一目的用“值域”来实现。每个值域指定一个值,如变量或表达式,调用write函数时,该值就以值域指定的格式显示。
1、通用的打印格式
打印格式的一个缺点是定义中包含了变量名,例如:
formatMYFORMAT= ========================================================== Thewinningnumberis@<<<<<$winnum ==========================================================
◆当调用write输出此格式时,必须记着它使用了变量$winnum。用子程序和局域变量就可以创建更通用的打印格式。下例从STDIN输入一个文件并输出五个出现频率最高的字母及出现次数。
2、格式和局域变量
在上例中,你可能已经注意到子程序write_letter调用write输出字母及其出现次数,即使格式定义在子程序外部仍能正常工作。在第17行中将字母及其出现次数传递给该子程序,在子程序中,打印格式使用局域变量$letter和$value,这样保证了在foreach循环中每次输出当前的字母和值。
然而要注意的是,使用my定义的局域变量要求格式定义在子程序内部,否则就不会输出,因此,用write输出的局域变量一定要用local定义。(local和my详见《子程序》一章)
注:Perl4中没有my函数,故不会有此问题。
3、选择值域格式
我们已经知道了打印格式和write函数怎么工作,现在来看看值域的格式,见下表:
格式值域含义
@<<<左对齐输出
@>>>右对齐输出
@|||中对齐输出
@##.##固定精度数字
@*多行文本
每个值域的第一个字符是行填充符,当使用@字符时,不做文本格式化。对文本的格式化稍后来讲。
在上表中,除了多行值域@*,域宽都等于其指定的包含字符@在内的字符个数,例如:
@###.##
表示七个字符宽,小数点前四个,小数点后两个。
4、输出值域字符
在打印格式里,特定字符如@、<和>被看作值域定义,那么如何将它们输出呢?方法如下:
formatSPECIAL=
Thislinecontainsthespecialcharacter@.
"@"
四、Perl格式化输出中输出到其它文件
缺省地,函数write将结果输出到标准输出文件STDOUT,我们也可以使它将结果输出到任意其它的文件中。最简单的方法就是把文件变量作为参数传递给write,如:
write(MYFILE);
这样,write就用缺省的名为MYFILE的打印格式输出到文件MYFILE中,但是这样就不能用$~变量来改变所使用的打印格式。系统变量$~只对缺省文件变量起作用,我们可以改变缺省文件变量,改变$~,再调用write,例如:
select(MYFILE);
$~="MYFORMAT";
write;
当select改变缺省文件变量时,它返回当前缺省文件变量的内部表示,这样我们就可以创建子程序,按自己的想法输出,又不影响程序的其它部分,如下:
subwrite_to_stdout{ local($savefile,$saveformat); $savefile=select(STDOUT); $saveformat=$~; $~="MYFORMAT"; write; $~=$saveformat; select($savefile); }
五、Perl格式化输出中分页
在输出到打印机时,可以在每页顶部输出相应的信息,这样的特殊文本叫页眉。定义页眉实际上就是定义名为filename_TOP的打印格式,例如给标准输出文件定义页眉如下:
formatSTDOUT_TOP=
ConsolidatedWidgetsInc.1994AnnualReport
◆在页眉的定义中也可以包含值域,页眉中经常使用的一个特殊值是当前页码,存贮在系统变量$%中,如:
formatSTDOUT_TOP=
Page@<<.
$%