Perl格式化输出

格式化输出是Perl一大特点,毕竟擅长于文本数据处理。

format模板

Perl支持用format关键字来定义格式化输出的模板,然后使用write按指定模板输出数据。基本语法如下:

format FORMATNAME =
fieldline
value1, value2, value3
fieldline
value1, value2, value3
.

=pod
FORMATNAME:格式化模板名称
fieldline:一个格式行,用来定义一个输出行的格式,以@或^开头
value1..:数据行,向前面一个格式行插入变量value
.:结束符号
=cut

格式行语法

  • 以@或^开头
  • @、^后的<,>,|长度决定了字段的长度,如果变量超出定义的长度将被截断
  • <, >, |还分别表示左对齐,右对齐,居中对齐
  • ^用于多行文本填充

值域格式

@###.### 表示固定精度数字,一共8个zifu字符宽,小数点前4位,后面3位

格式变量

$~($FORMAT_NAME) :当前格式名字

$^($FORMAT_TOP_NAME):当前表头格式

$=($FORMAT_LINES_PER_PAGE):每页中的行数

$|   ($FORMAT_AUTOFLUSH) :是否自动刷新输出缓冲区存储

$%( $FORMAT_PAGE_NUMBER):设置页码

默认format

默认format是STDOUT。

  1 #!/usr/bin/perl -w
  2 write;
[root@izuf682lz6444cynn96up0z ~]# ./formatOutput1.pl 
Undefined format "STDOUT" called at ./formatOutput1.pl line 2.

Demo

  1 #!/usr/bin/perl -w
  2 format STUDENT =
  3 ===================================
  4 @<<<<<<<<<<<<< @<<<<<<<<<<
  5 $name, $score
  6 ===================================
  7 .
  8 
  9 format STUDENT_TOP =
 10 ===================================
 11 Name           Score      Page@<
 12                               $%
 13 ===================================
 14 .
 15 
 16 select(STDOUT);
 17 $~ = STUDENT;
 18 $^ = STUDENT_TOP;
 19 
 20 @stuName = ('hunk', 'jack', 'lucy');
 21 @stuScore = (80, 70 , 60);
 22 
 23 $i = 0;
 24 foreach (@stuName){
 25     $name = $_;
 26     $score = $stuScore[$i++];
 27     write;
 28 }
[root@izuf682lz6444cynn96up0z ~]# ./formatOutput2.pl 
===================================
Name           Score      Page1
===================================
===================================
hunk           80
===================================
===================================
jack           70
===================================
===================================
lucy           60
===================================

定向输出到文件

默认输出是标准输出(STDOUT)也可以输出到指定文件。

方法1

用select改变输出文件句柄(默认是STDOUT)。

 1 #!/usr/bin/perl -w
  2 format STUDENT =
  3 ==========================
  4 @<<<<<<<<<<<<< @<<<<<<<<<<
  5 $name, $score
  6 ==========================
  7 .
  8 
  9 format STUDENT_TOP =
 10 ==========================
 11 Name           Score
 12 ==========================
 13 .
 14 
 17 @stuName = ('hunk', 'jack', 'lucy');
 18 @stuScore = (80, 70 , 60);
 19 
 20 if(open(HANDLE, ">tmp")){
 21     select(HANDLE);
 22     $~ = STUDENT;
 23     $^ = STUDENT_TOP;
 24     $i = 0;
 25     foreach (@stuName){
 26         $name = $_;
 27         $score = $stuScore[$i++];
 28         write; 
 29     }   
 30     close HANDLE;
 31 }  
[root@izuf682lz6444cynn96up0z ~]# ./formatOutput.pl 
[root@izuf682lz6444cynn96up0z ~]# cat tmp 
==========================
Name           Score
==========================
==========================
hunk           80
==========================
==========================
jack           70
==========================
==========================
lucy           60
==========================

方法2

执行write时指定输出的文件handle,用这种方式,指定文件handle的名字必须和format模板的名字相同。

  1 #!/usr/bin/perl -w
  2 format STUDENT =
  3 ==========================
  4 @<<<<<<<<<<<<< @<<<<<<<<<<
  5 $name, $score
  6 ==========================
  7 .
  8 
  9 format STUDENT_TOP =
 10 ==========================
 11 Name           Score
 12 ==========================
 13 .
 14 
 15 @stuName = ('hunk', 'jack', 'lucy');
 16 @stuScore = (80, 70 , 60);
 17 
 18 if(open(STUDENT, ">tmp")){
 19     $~ = STUDENT;
 20     $^ = STUDENT_TOP;
 21     $i = 0;
 22     foreach (@stuName){
 23         $name = $_;
 24         $score = $stuScore[$i++];
 25         write STUDENT;
 26     }
 27     close STUDENT;
 28 }
[root@izuf682lz6444cynn96up0z ~]# ./formatOutput.pl 
[root@izuf682lz6444cynn96up0z ~]# cat tmp 
==========================
Name           Score
==========================
==========================
hunk           80
==========================
==========================
jack           70
==========================
==========================
lucy           60
==========================

注意

$~ = STUDENT;和$^ = STUDENT_TOP;必须写在if语{}内。否则会出现“Undefined format "HANDLE" called”这样的错误,说明也有作用域的问题。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值