第十章 格式化輸出
一、定義打印格式format formatname =打印格式名formatname的命名規(guī)則與一般變量相同。結(jié)束行為一個(gè)句號(hào),此行不能有任何其它字符,包括空格,句號(hào)必須是該行第一個(gè)字符。
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 =當(dāng)調(diào)用write輸出此格式時(shí),必須記著它使用了變量$winnum。用子程序和局域變量就可以創(chuàng)建更通用的打印格式。下例從STDIN輸入一個(gè)文件并輸出五個(gè)出現(xiàn)頻率最高的字母及出現(xiàn)次數(shù)。
==========================================================
The winning number is @<<<<<<!
$winnum
==========================================================
.
1 : #!/usr/local/bin/perl運(yùn)行結(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: .
2、格式和局域變量$ 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 $
格式 | 值域含義 |
@<<< | 左對(duì)齊輸出 |
@>>> | 右對(duì)齊輸出 |
@||| | 中對(duì)齊輸出 |
@##.## | 固定精度數(shù)字 |
@* | 多行文本 |
format SPECIAL =四、輸出到其它文件
This line contains the special character @.
"@"
.
sub write_to_stdout {五、分頁(yè)
local ($savefile, $saveformat);
$savefile = select(STDOUT);
$saveformat = $~;
$~ = "MYFORMAT";
write;
$~ = $saveformat;
select($savefile);
}
1 : #!/usr/local/bin/perl運(yùn)行結(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é)果中就會(huì)多一行空行。很明顯,當(dāng)字符串長(zhǎng)度不明確時(shí),這種用法很不方便,原因就在于它指明了輸出的行數(shù)上限,超過(guò)這一上限的字符就不會(huì)被輸出,解決方法很簡(jiǎn)單,就是在域值格式行首加兩個(gè)~字符,這樣就會(huì)持續(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這樣運(yùn)行結(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 | 單個(gè)字符 |
%d | 十進(jìn)制整數(shù) |
%e | 科學(xué)計(jì)數(shù)法形式的浮點(diǎn)數(shù) |
%f | 普通形式(定點(diǎn))浮點(diǎn)數(shù) |
%g | 緊縮形式浮點(diǎn)數(shù) |
%o | 八進(jìn)制整數(shù) |
%s | 字符串 |
%u | 無(wú)符號(hào)整數(shù) |
%x | 十六進(jìn)制整數(shù) |
1、在格式d、o、u或x中,如果整數(shù)值較大或可能較大,可加個(gè)l字符,意為長(zhǎng)整型,如%ld。
2、%字符后加正整數(shù)表示該域的最小寬度,如果輸出結(jié)果寬度不足,則向右對(duì)齊,前面用空格補(bǔ)足,如果該正整數(shù)以數(shù)字0打頭,則補(bǔ)足字符為0。若%字符后為負(fù)整數(shù),則結(jié)果向右對(duì)齊。
3、浮點(diǎn)數(shù)域值(%c、%f和%g)中可以指定小數(shù)點(diǎn)前后的寬度,如%8.3f意為總寬度為8個(gè)字符,小數(shù)點(diǎn)后(即小數(shù)部分)為3個(gè)字符,多出的小數(shù)部分四舍五入。
4、在整數(shù)、字符或字符串的值域中使用如上的小數(shù)形式n.m,整數(shù)部分n為總寬度,小數(shù)部分m為輸出結(jié)果的最大寬度,這樣就保證了輸出結(jié)果前至少有n-m個(gè)空格。