?? perl10.htm
字號(hào):
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<title>Perl教程之 格式化輸出</title>
<LINK rel="stylesheet" href="article.css" type="text/css">
</head>
<body>
<br>
<p align="center"><strong>第十章 格式化輸出</strong></p>
<p align="center"><a target="_blank" href="http://flamephoenix.126.com">by flamephoenix</a></p>
<a href="#1">一、定義打印格式</a><br>
<a href="#2">二、顯示打印格式</a><br>
<a href="#3">三、在打印格式中顯示值</a><br>
<a href="#3.1">1、通用的打印格式</a><br>
<a href="#3.2">2、格式和局域變量</a><br>
<a href="#3.3">3、選擇值域格式</a><br>
<a href="#3.4">4、輸出值域字符</a><br>
<a href="#4">四、輸出到其它文件</a><br>
<a href="#5">五、分頁</a><br>
<a href="#6">六、格式化長字符串</a><br>
<a href="#7">七、用printf格式化輸出</a><br>
<br>
我們已經(jīng)見過用print函數(shù)將原始的未格式化的文本輸出到文件,本章講述如何用函數(shù)write和打印格式來生成格式化的輸出。<br>
<a name="1>一、定義打印格式</a><br>
定義打印格式的關(guān)鍵字為format,語法為:<br>
<blockquote>
format formatname =<br>
lines_of_output<br>
.
</blockquote>
打印格式名formatname的命名規(guī)則與一般變量相同。結(jié)束行為一個(gè)句號(hào),此行不能有任何其它字符,包括空格,句號(hào)必須是該行第一個(gè)字符。<br>
打印格式的定義象子程序一樣可以放在任何地方,甚至可以放在條件語句中,但是最好把它們集中放在程序的開頭或結(jié)尾。<br>
<a name="2">二、顯示打印格式</a><br>
打印格式的顯示有兩步:<br>
1、將系統(tǒng)變量$~設(shè)成所要使用的格式<br>
2、調(diào)用函數(shù)write<br>
例如:<br>
<blockquote>
1 : #!/usr/local/bin/perl<br>
2 : <br>
3 : $~ = "MYFORMAT";<br>
4 : write;<br>
5 : <br>
6 : format MYFORMAT =<br>
7 : ===================================<br>
8 : Here is the text I want to display.<br>
9 : ===================================<br>
10: .
</blockquote>
結(jié)果輸出如下:<br>
<blockquote>
$ program<br>
===================================<br>
Here is the text I want to display.<br>
===================================<br>
$
</blockquote>
如果不用$~指定打印格式,Perl解釋器就假定要使用的格式名與要寫入的文件變量同名,在本例中,如果不指定使用MYFORMAT,則Perl解釋器試圖使用名為STDOUT的打印格式。<br>
<a name="3">三、在打印格式中顯示值<br>
我們使用打印格式的主要原因當(dāng)然是格式化存貯在簡單變量或數(shù)組變量中的值從而生成可讀性好的輸出,這一目的用“值域”來實(shí)現(xiàn)。每個(gè)值域指定一個(gè)值,如變量或表達(dá)式,調(diào)用write函數(shù)時(shí),該值就以值域指定的格式顯示。<br>
<a name="3.1">1、通用的打印格式<br>
打印格式的一個(gè)缺點(diǎn)是定義中包含了變量名,例如:<br>
<blockquote>
format MYFORMAT =<br>
==========================================================<br>
The winning number is @<<<<<<!<br>
$winnum<br>
==========================================================<br>
.
</blockquote>
當(dāng)調(diào)用write輸出此格式時(shí),必須記著它使用了變量$winnum。用子程序和局域變量就可以創(chuàng)建更通用的打印格式。下例從STDIN輸入一個(gè)文件并輸出五個(gè)出現(xiàn)頻率最高的字母及出現(xiàn)次數(shù)。<br>
<blockquote>
1 : #!/usr/local/bin/perl<br>
2 : <br>
3 : while ($line = <STDIN>) {<br>
4 : $line =~ tr/A-Z/a-z/;<br>
5 : $line =~ s/[^a-z]//g;<br>
6 : @letters = split(//, $line);<br>
7 : foreach $letter (@letters) {<br>
8 : $lettercount{$letter} += 1;<br>
9 : }<br>
10: }<br>
11: <br>
12: $~ = "WRITEHEADER";<br>
13: write;<br>
14: $count = 0;<br>
15: foreach $letter (reverse sort occurrences<br>
16: (keys(%lettercount))) {<br>
17: &write_letter($letter, $lettercount{$letter});<br>
18: last if (++$count == 5);<br>
19: }<br>
20: <br>
21: sub occurrences {<br>
22: $lettercount{$a} <=> $lettercount{$b};<br>
23: }<br>
24: sub write_letter {<br>
25: local($letter, $value) = @_;<br>
26: <br>
27: $~ = "WRITELETTER";<br>
28: write;<br>
29: }<br>
30: format WRITEHEADER =<br>
31: The five most frequently occurring letters are:<br>
32: .<br>
33: format WRITELETTER =<br>
34: @: @<<<<<<<br>
35: $letter, $value<br>
36: .
</blockquote>
運(yùn)行結(jié)果如下:<br>
<blockquote><pre>
$ 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
$
</pre></blockquote>
<a name="3.2">2、格式和局域變量</a><br>
在上例中,你可能已經(jīng)注意到子程序write_letter調(diào)用write輸出字母及其出現(xiàn)次數(shù),即使格式定義在子程序外部仍能正常工作。在第17行中將字母及其出現(xiàn)次數(shù)傳遞給該子程序,在子程序中,打印格式使用局域變量$letter和$value,這樣保證了在foreach循環(huán)中每次輸出當(dāng)前的字母和值。<br>
然而要注意的是,使用my定義的局域變量要求格式定義在子程序內(nèi)部,否則就不會(huì)輸出,因此,用write輸出的局域變量一定要用local定義。(local和my詳見《子程序》一章)<br>
注:Perl4中沒有my函數(shù),故不會(huì)有此問題。<br>
<a name="3.3">3、選擇值域格式</a><br>
我們已經(jīng)知道了打印格式和write函數(shù)怎么工作,現(xiàn)在來看看值域的格式,見下表:<br>
<p><table border="1" align="center">
<tr>
<td>格式</td>
<td>值域含義</td>
</tr>
<tr>
<td>@<<<</td>
<td>左對(duì)齊輸出</td>
</tr>
<tr>
<td>@>>></td>
<td>右對(duì)齊輸出</td>
</tr>
<tr>
<td>@|||</td>
<td>中對(duì)齊輸出</td>
</tr>
<tr>
<td>@##.## </td>
<td>固定精度數(shù)字 </td>
</tr>
<tr>
<td>@*</td>
<td>多行文本</td>
</tr>
</table></p>
每個(gè)值域的第一個(gè)字符是行填充符,當(dāng)使用@字符時(shí),不做文本格式化。對(duì)文本的格式化稍后來講。<br>
在上表中,除了多行值域@*,域?qū)挾嫉扔谄渲付ǖ陌址鸃在內(nèi)的字符個(gè)數(shù),例如:<br>
@###.##<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -