版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012299594/article/details/81814345
格式化输出是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”这样的错误,说明也有作用域的问题。