全面认识Perl格式化输出用法
本文和大家重点讨论一下Perl格式化输出的概念,主要包括打印格式,输出到其它文件,分页和格式化长字符串等内容,相信通过本文的介绍大家对Perl格式化输出的用法有一定的了解。
Perl格式化输出
一、打印格式
1、将系统变量$~设成所要使用的格式
2、调用函数write
如果不用$~指定打印格式,Perl解释器就假定要使用的格式名与要写入的文件变量同名。
二、在打印格式中显示值
我们使用打印格式的主要原因当然是格式化存贮在简单变量或数组变量中的值从而生成可读性好的输出,这一目的用“值域”来实现。每个值域指定一个值,如变量或表达式,调用write函数时,该值就以值域指定的格式显示。
使用my定义的局域变量要求格式定义在子程序内部,否则就不会输出,因此,用write输出的局域变量一定要用local定义。
值域格式
@<<<左对齐输出
@>>>右对齐输出
@|||中对齐输出
@##.##固定精度数字
@*多行文本
每个值域的第一个字符是行填充符,当使用@字符时,不做文本格式化。
在打印格式里,特定字符如@、<和>被看作值域定义,需用"@"方式输出字符本身。
三、输出到其它文件
缺省地,函数write将结果输出到标准输出文件STDOUT,我们也可以使它将结果输出到任意其它的文件中。最简单的方法就是把文件变量作为参数传递给write,如:
write(MYFILE);
这样,write就用缺省的名为MYFILE的打印格式输出到文件MYFILE中,但是这样就不能用$~变量来改变所使用的打印格式。系统变量$~只对缺省文件变量起作用,我们可以改变缺省文件变量,改变$~,再调用write。
当select改变缺省文件变量时,它返回当前缺省文件变量的内部表示,这样我们就可以创建子程序,按自己的想法输出,又不影响程序的其它部分。
四、分页
在输出到打印机时,可以在每页顶部输出相应的信息,这样的特殊文本叫页眉。定义页眉实际上就是定义名为filename_TOP的打印格式。
在页眉的定义中也可以包含值域,当前页码存贮在系统变量$%中。
我们也可以通过改变系统变量$^改变定义页眉的打印格式名,与$~一样,$^只对当前缺省文件起作用,因此可以与select函数结合使用。
缺省情况下,每页长度为60行,可以通过改变$=来改变页长,此赋值语句必须出现在第一个write语句前。
注:一般使用分页机制时不用print函数,因为当用write输出时,Perl解释器跟踪每页的当前行号。如果必须使用print而又不打乱页计数,可以调整系统变量$-。$-的含义是当前行到页末之间的行数,当$-达到零时,就开始新的一页。
五、格式化长字符串
我们已经学过值域@*可以输出多行文本,但它完全将字符串原样输出,不加以格式化。
在Perl中对长字符串(包含换行)进行格式化的值域定义很简单,只需把打头的@字符换成^就行了,这种文本格式化中,Perl解释器在一行中放置尽可能多的单词。每当输出一行文本,被输出的子串就从变量中删除,再次在域值中使用该变量就把剩下的字符串继续按格式输出。当内容已输出完毕,该变量就成了空串,再输出就会输出空行,为避免输出空行,可以在值域格式行首加一个~字符。
当字符串长度不明确时在域值格式行首加两个~字符,这样就会持续按格式输出文本直到输出完毕。
六、用printf格式化输出
printf与C语言中的printf基本上是相同的。printf有两个参数,一个是字符串,其中含有一个或多个域值形式,另一个是与各域值相对应的变量值按一定格式替换。
各种域值形式如下表:
%c单个字符
%d十进制整数
%e科学计数法形式的浮点数
%f普通形式(定点)浮点数
%g紧缩形式浮点数
%o八进制整数
%s字符串
%u无符号整数
%x十六进制整数
一些使用细节如下:
1、在格式d、o、u或x中,如果整数值较大或可能较大,可加个l字符,意为长整型,如%ld。
2、%字符后加正整数表示该域的最小宽度,如果输出结果宽度不足,则向右对齐,前面用空格补足,如果该正整数以数字0打头,则补足字符为0。若%字符后为负整数,则结果向右对齐。