Perl格式化输出

这篇博客介绍了Perl的格式化输出功能,包括如何使用format关键字定义输出模板,以及write函数的应用。内容涵盖默认格式、格式行语法、值域格式和格式变量,并通过实例演示了如何定向输出到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

格式化输出是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)。



  • #!/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”这样的错误,说明也有作用域的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值