繁体中文
设为首页
加入收藏
当前位置:程序开发首页 >> CGI >> Perl教学 第十篇 格式化输出之三

Perl教学 第十篇 格式化输出之三

2006-12-15 08:00:00  作者:  来源:互联网  浏览次数:0  文字大小:【】【】【
简介:2、格式和局域变量 在上例中,你可能已经注意到子程序write_letter调用write输出字母及其出现次数,即使格式定义在子程序外部仍能正常工作。在第17行中将字母及其出现次数传递给该子程序,在子程序中,打印格式使...
关键字:输出 教学 Perl 第十

2、格式和局域变量

在上例中,你可能已经注意到子程序write_letter调用write输出字母及其出现次数,即使格式定义在子程序外部仍能正常工作。在第17行中将字母及其出现次数传递给该子程序,在子程序中,打印格式使用局域变量$letter和$value,这样保证了在foreach循环中每次输出当前的字母和值。

然而要注意的是,使用my定义的局域变量要求格式定义在子程序内部,否则就不会输出,因此,用write输出的局域变量一定要用local定义。(local和my详见《子程序》一章)

注:Perl4中没有my函数,故不会有此问题。

3、选择值域格式

我们已经知道了打印格式和write函数怎么工作,现在来看看值域的格式,见下表:

格式 值域含义

@<<>> 右对齐输出

@||| 中对齐输出

@##.## 固定精度数字

@* 多行文本

每个值域的第一个字符是行填充符,当使用@字符时,不做文本格式化。对文本的格式化稍后来讲。

在上表中,除了多行值域@*,域宽都等于其指定的包含字符@在内的字符个数,例如:

@###.##

表示七个字符宽,小数点前四个,小数点后两个。

4、输出值域字符

在打印格式里,特定字符如@、被看作值域定义,那么如何将它们输出呢?方法如下:

format SPECIAL =

This line contains the special character @.

"@"

.

四、输出到其它文件

缺省地,函数write将结果输出到标准输出文件STDOUT,我们也可以使它将结果输出到任意其它的文件中。最简单的方法就是把文件变量作为参数传递给write,如:

write (MYFILE);

这样,write就用缺省的名为MYFILE的打印格式输出到文件MYFILE中,但是这样就不能用$~变量来改变所使用的打印格式。系统变量$~只对缺省文件变量起作用,我们可以改变缺省文件变量,改变$~,再调用write,例如:

select (MYFILE);

$~ = "MYFORMAT";

write;

当select改变缺省文件变量时,它返回当前缺省文件变量的内部表示,这样我们就可以创建子程序,按自己的想法输出,又不影响程序的其它部分,如下:

sub write_to_stdout {

local ($savefile, $saveformat);

$savefile = select(STDOUT);

$saveformat = $~;

$~ = "MYFORMAT";

write;

$~ = $saveformat;

select($savefile);

}

五、分页

在输出到打印机时,可以在每页顶部输出相应的信息,这样的特殊文本叫页眉。定义页眉实际上就是定义名为filename_TOP的打印格式,例如给标准输出文件定义页眉如下:

format STDOUT_TOP =

Consolidated Widgets Inc. 1994 Annual Report

.

在页眉的定义中也可以包含值域,页眉中经常使用的一个特殊值是当前页码,存贮在系统变量$%中,如:

format STDOUT_TOP =

Page @<<.

$%

.

我们也可以通过改变系统变量$^改变定义页眉的打印格式名,与$~一样,$^只对当前缺省文件起作用,因此可以与select函数结合使用。

缺省情况下,每页长度为60行,可以通过改变$=来改变页长,如:

$= = 66; #页长设为66行

此赋值语句必须出现在第一个write语句前。

注:一般使用分页机制时不用print函数,因为当用write输出时,Perl解释器跟踪每页的当前行号。如果必须使用print而又不打乱页计数,可以调整系统变量$-。$-的含义是当前行到页末之间的行数,当$-达到零时,就开始新的一页,调整方法如:

print ("Here is a line of output\n");

$- -= 1;

责任编辑:admin
相关文章