Perl格式化输出用法解析

开发 架构
Perl语言有很多值得学习的地方,本文就向大家简单介绍一下Perl格式化输出的概念,希望通过本文的介绍你一会让你有所收获。

在学习Perl的过程中,Perl格式化输出问题经常会遇到,我们已经见过用print函数将原始的未格式化的文本输出到文件,本章讲述如何用函数write和打印格式来生成格式化的输出。

Perl格式化输出

一、输出到其它文件

缺省地,函数write将结果输出到标准输出文件STDOUT,我们也可以使它将结果输出到任意其它的文件中。最简单的方法就是把文件变量作为参数传递给write,如:
write(MYFILE);
这样,write就用缺省的名为MYFILE的打印格式输出到文件MYFILE中,但是这样就不能用$~变量来改变所使用的打印格式。系统变量$~只对缺省文件变量起作用,我们可以改变缺省文件变量,改变$~,再调用write,例如:
select(MYFILE);
$~="MYFORMAT";
write;

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

 

  1. subwrite_to_stdout{  
  2. local($savefile,$saveformat);  
  3. $savefile=select(STDOUT);  
  4. $saveformat=$~;  
  5. $~="MYFORMAT";  
  6. write;  
  7. $~=$saveformat;  
  8. select($savefile);  
  9. }  
  10.  

 

二、Perl格式化输出之分页

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

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

◆我们也可以通过改变系统变量$^改变定义页眉的打印格式名,与$~一样,$^只对当前缺省文件起作用,因此可以与select函数结合使用。
缺省情况下,每页长度为60行,可以通过改变$=来改变页长,如:
$==66;#页长设为66行

此赋值语句必须出现在第一个write语句前。
注:一般使用分页机制时不用print函数,因为当用write输出时,Perl解释器跟踪每页的当前行号。如果必须使用print而又不打乱页计数,可以调整系统变量$-。$-的含义是当前行到页末之间的行数,当$-达到零时,就开始新的一页,调整方法如:
print("Hereisalineofoutput\n");
$--=1;

三、Perl格式化输出之格式化长字符串

我们已经学过值域@*可以输出多行文本,但它完全将字符串原样输出,不加以格式化。在Perl中对长字符串(包含换行)进行格式化的值域定义很简单,只需把打头的@字符换成^就行了,这种文本格式化中,Perl解释器在一行中放置尽可能多的单词。每当输出一行文本,被输出的子串就从变量中删除,再次在域值中使用该变量就把剩下的字符串继续按格式输出。当内容已输出完毕,该变量就成了空串,再输出就会输出空行,为避免输出空行,可以在值域格式行首加一个~字符。见下例:

  1. 1:#!/usr/local/bin/perl  
  2. 2:  
  3. 3:@quotation=<STDIN>;  
  4. 4:$quotation=join("",@quotation);  
  5. 5:$~="QUOTATION";  
  6. 6:write;  
  7. 7:  
  8. 8:formatQUOTATION=  
  9. 9:Quotationfortheday:  
  10. 10:-----------------------------  
  11. 11:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
  12. 12:$quotation  
  13. 13:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
  14. 14:$quotation  
  15. 15:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
  16. 16:$quotation  
  17. 17:-----------------------------  
  18. 18:.  
  19.  

 运行结果如下:

  1. $program  
  2. Anysufficientlyadvancedprogramming  
  3. languageisindistinguishablefrommagic.  
  4. ^D  
  5. Quotationfortheday:  
  6. -----------------------------  
  7. Anysufficientlyadvancedprogramminglanguageis  
  8. indistinguishablefrommagic.  
  9. -----------------------------  
  10. $  
  11.  

 如果把打印格式中行首的~字符去掉,上面的输出结果中就会多一行空行。很明显,当字符串长度不明确时,这种用法很不方便,原因就在于它指明了输出的行数上限,超过这一上限的字符就不会被输出,解决方法很简单,就是在域值格式行首加两个~字符,这样就会持续按格式输出文本直到输出完毕,用此方法把上述程序改写如下:

  1. 1:#!/usr/local/bin/perl  
  2. 2:  
  3. 3:@quotation=<STDIN>;  
  4. 4:$quotation=join("",@quotation);  
  5. 5:$~="QUOTATION";  
  6. 6:write;  
  7. 7:  
  8. 8:formatQUOTATION=  
  9. 9:Quotationfortheday:  
  10. 10:-----------------------------  
  11. 11:~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
  12. 12:$quotation  
  13. 13:-----------------------------  
  14. 14:.  

这样运行结果相同。

四、用printfPerl格式化输出

还有一种容易掌握和使用的Perl格式化输出函数,那就是printf,它与C语言中的printf基本上是相同的。printf有两个参数,一个是字符串,其中含有一个或多个域值形式,另一个是与各域值相对应的变量值按一定格式替换,如:
printf("ThenumberIwanttoprintis%d.\n",$number);
各种域值形式如下表:

一些使用细节如下:

1、在格式d、o、u或x中,如果整数值较大或可能较大,可加个l字符,意为长整型,如%ld。
2、%字符后加正整数表示该域的最小宽度,如果输出结果宽度不足,则向右对齐,前面用空格补足,如果该正整数以数字0打头,则补足字符为0。若%字符后为负整数,则结果向右对齐。
3、浮点数域值(%c、%f和%g)中可以指定小数点前后的宽度,如%8.3f意为总宽度为8个字符,小数点后(即小数部分)为3个字符,多出的小数部分四舍五入。
4、在整数、字符或字符串的值域中使用如上的小数形式n.m,整数部分n为总宽度,小数部分m为输出结果的最大宽度,这样就保证了输出结果前至少有n-m个空格。
 

【编辑推荐】

  1. 全面认识Perl格式化输出用法
  2. Perl文件句柄概念详解
  3. 实例解析Perl守护进程用法
  4. Perl模式匹配经验总结
  5. Perl学习笔记----Perl格式化输出详解

 

 

责任编辑:佚名 来源: csdn.net
相关推荐

2010-07-21 14:25:24

Perl格式化输出

2010-07-15 11:16:25

Perl格式化输出

2010-07-16 16:00:08

Perl格式化输出

2010-07-15 11:29:25

Perl格式化输出

2010-07-16 15:23:34

Perl格式化输出

2010-07-16 14:37:26

Perl格式化输出

2024-01-08 22:03:22

python代码开发

2020-09-02 07:19:41

printf 格式化输出Unix

2010-07-13 13:49:43

Perl foreac

2023-04-11 10:37:40

bash命令printf

2010-08-03 10:46:41

Flex代码格式化

2009-09-04 12:22:41

C#日期格式化

2019-08-08 14:47:07

Linux命令行JSON

2010-07-20 09:45:04

Perl继承

2010-07-15 10:22:23

Perl控制结构

2010-07-16 16:56:01

Perl构造函数

2010-07-19 14:13:41

Perl函数

2010-07-16 08:47:53

Perl if语句

2010-07-20 15:02:20

Perl数组

2010-07-14 15:32:21

Perl转义字符
点赞
收藏

51CTO技术栈公众号