第十章 格式化輸出
一、定義打印格式format formatname =打印格式名formatname的命名規(guī)則與一般變量相同。結(jié)束行為一個句號,此行不能有任何其它字符,包括空格,句號必須是該行第一個字符。
lines_of_output
.
1 : #!/usr/local/bin/perl結(jié)果輸出如下:
2 :
3 : $~ = "MYFORMAT";
4 : write;
5 :
6 : format MYFORMAT =
7 : ===================================
8 : Here is the text I want to display.
9 : ===================================
10: .
$ program如果不用$~指定打印格式,Perl解釋器就假定要使用的格式名與要寫入的文件變量同名,在本例中,如果不指定使用MYFORMAT,則Perl解釋器試圖使用名為STDOUT的打印格式。
===================================
Here is the text I want to display.
===================================
$
format MYFORMAT =當調(diào)用write輸出此格式時,必須記著它使用了變量$winnum。用子程序和局域變量就可以創(chuàng)建更通用的打印格式。下例從STDIN輸入一個文件并輸出五個出現(xiàn)頻率最高的字母及出現(xiàn)次數(shù)。
==========================================================
The winning number is @<<<<<<!
$winnum
==========================================================
.
1 : #!/usr/local/bin/perl運行結(jié)果如下:
2 :
3 : while ($line =) {
4 : $line =~ tr/A-Z/a-z/;
5 : $line =~ s/[^a-z]//g;
6 : @letters = split(//, $line);
7 : foreach $letter (@letters) {
8 : $lettercount{$letter} += 1;
9 : }
10: }
11:
12: $~ = "WRITEHEADER";
13: write;
14: $count = 0;
15: foreach $letter (reverse sort occurrences
16: (keys(%lettercount))) {
17: &write_letter($letter, $lettercount{$letter});
18: last if (++$count == 5);
19: }
20:
21: sub occurrences {
22: $lettercount{$a} <=> $lettercount{$b};
23: }
24: sub write_letter {
25: local($letter, $value) = @_;
26:
27: $~ = "WRITELETTER";
28: write;
29: }
30: format WRITEHEADER =
31: The five most frequently occurring letters are:
32: .
33: format WRITELETTER =
34: @: @<<<<<<
35: $letter, $value
36: .
$ program
This is a test file.
This test file contains some input.
The quick brown fox jumped over the lazy dog.
^D
The five most frequently occurring letters are:
t: 10
e: 9
i: 8
s: 7
o: 6
$
2、格式和局域變量| 格式 | 值域含義 |
| @<<< | 左對齊輸出 |
| @>>> | 右對齊輸出 |
| @||| | 中對齊輸出 |
| @##.## | 固定精度數(shù)字 |
| @* | 多行文本 |
format SPECIAL =四、輸出到其它文件
This line contains the special character @.
"@"
.
sub write_to_stdout {五、分頁
local ($savefile, $saveformat);
$savefile = select(STDOUT);
$saveformat = $~;
$~ = "MYFORMAT";
write;
$~ = $saveformat;
select($savefile);
}
1 : #!/usr/local/bin/perl運行結(jié)果如下:
2 :
3 : @quotation = <STDIN>;
4 : $quotation = join("", @quotation);
5 : $~ = "QUOTATION";
6 : write;
7 :
8 : format QUOTATION =
9 : Quotation for the day:
10: -----------------------------
11: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
12: $quotation
13: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
14: $quotation
15: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
16: $quotation
17: -----------------------------
18: .
$ program如果把打印格式中行首的~字符去掉,上面的輸出結(jié)果中就會多一行空行。很明顯,當字符串長度不明確時,這種用法很不方便,原因就在于它指明了輸出的行數(shù)上限,超過這一上限的字符就不會被輸出,解決方法很簡單,就是在域值格式行首加兩個~字符,這樣就會持續(xù)按格式輸出文本直到輸出完畢,用此方法把上述程序改寫如下:
Any sufficiently advanced programming
language is indistinguishable from magic.
^D
Quotation for the day:
-----------------------------
Any sufficiently advanced programming language is
indistinguishable from magic.
-----------------------------
$
1 : #!/usr/local/bin/perl這樣運行結(jié)果相同。
2 :
3 : @quotation = <STDIN>;
4 : $quotation = join("", @quotation);
5 : $~ = "QUOTATION";
6 : write;
7 :
8 : format QUOTATION =
9 : Quotation for the day:
10: -----------------------------
11: ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
12: $quotation
13: -----------------------------
14: .
| 域值 | 含義 |
| %c | 單個字符 |
| %d | 十進制整數(shù) |
| %e | 科學計數(shù)法形式的浮點數(shù) |
| %f | 普通形式(定點)浮點數(shù) |
| %g | 緊縮形式浮點數(shù) |
| %o | 八進制整數(shù) |
| %s | 字符串 |
| %u | 無符號整數(shù) |
| %x | 十六進制整數(shù) |
1、在格式d、o、u或x中,如果整數(shù)值較大或可能較大,可加個l字符,意為長整型,如%ld。
2、%字符后加正整數(shù)表示該域的最小寬度,如果輸出結(jié)果寬度不足,則向右對齊,前面用空格補足,如果該正整數(shù)以數(shù)字0打頭,則補足字符為0。若%字符后為負整數(shù),則結(jié)果向右對齊。
3、浮點數(shù)域值(%c、%f和%g)中可以指定小數(shù)點前后的寬度,如%8.3f意為總寬度為8個字符,小數(shù)點后(即小數(shù)部分)為3個字符,多出的小數(shù)部分四舍五入。
4、在整數(shù)、字符或字符串的值域中使用如上的小數(shù)形式n.m,整數(shù)部分n為總寬度,小數(shù)部分m為輸出結(jié)果的最大寬度,這樣就保證了輸出結(jié)果前至少有n-m個空格。