?? perl10.htm
字號:
<html><!-- #BeginTemplate "/Templates/index.dwt" --><head><meta http-equiv=Content-Type content="text/html; charset=gb_2312-80"><title>ChinaPerl</title>
<LINK rel=stylesheet href=mystyle.css type=text/css>
</head><body>
<table border=0 cellspacing=0 bgcolor=#80FFFF width=100%>
<tr>
<td align=left rowspan=2 width=150>
<div align="center"><img src=image/perl.gif height=85 width="85"></div>
</td>
<td align=center><img src=image/perl.gif height=85 width="85"></td>
</tr><tr>
<td colspan=2 align=center> </td>
</tr></table>
<table border=0 width=100% height=400 cellspacing=0 cellpadding=0>
<tr>
<td width=20% valign=top bgcolor="#dddddd">
<table border=0 width=100% cellpadding=0><tr><td width=5%></td>
<td width=95%>
<p align=center>Perl 5教程<br>
<a target=_blank href=http://flamephoenix.126.com>by flamephoenix</a><a href="http://perl.yesky.net"><br>
<font color="red">修訂 by RNY<br>
</font></a>2000-08-30</p>
<p align=center><a href="index.htm">目錄</a></p>
<p align=center>第一部分 Perl語言</p>
<p><a href=perl1.htm>第一章 概述</a></p>
<p><a href=perl2.htm>第二章 簡單變量</a></p>
<p><a href=perl3.htm>第三章 操作符</a></p>
<p><a href=perl4.htm>第四章 列表和數組變量</a></p>
<p><a href=perl5.htm>第五章 文件讀寫</a></p>
<p><a href=perl6.htm>第六章 模式匹配</a></p>
<p><a href=perl7.htm>第七章 控制結構</a></p>
<p><a href=perl8.htm>第八章 子程序</a></p>
<p><a href=perl9.htm>第九章 關聯數組(哈希表)</a></p>
<p><a href=perl10.htm>第十章 格式化輸出</a></p>
<p><a href=perl11.htm>第十一章 文件系統</a></p>
<p><a href=perl12.htm>第十二章 引用(指針)</a></p>
<p><a href=perl13.htm>第十三章 面向對象編程</a></p>
<p><a href=perl14.htm>第十四章 包和模塊</a></p>
<p><a href=func.htm>附錄一 函數集</a></p>
<p align=center>第二部分 Perl的CGI應用</p>
<p><a href=cgi1.htm>第一章 cgilib例</a></p>
<p><a href=cgi2.htm>第二章 動態創建圖像</a></p>
<p><a href=cgi3.htm>第三章 計數器的編寫方法</a></p>
<p><a href=cgi4.htm>第四章 Web Server設置</a></p>
第五章、...<br></td></tr></table></td>
<td width=80% valign=top>
<div align="center"></div>
<table border=0 width=100% cellpadding=0>
<tr bgcolor="#00FF80">
<td colspan="2">
<div align="center"> Perl教程 | <a href="perl5manual.zip">下載全文</a>
| <a target=_blank href=http://www.turbolinux.com.cn/cgi-bin/linux/wwwthreads.pl?action=list&Board=perl>Perl論壇</a>
| <a href="http://perl.yesky.net">推薦站點</a> | 關于我們 </div>
</td>
</tr>
<tr>
<td colspan="2"><!-- #BeginEditable "body" -->
<p align=center>第十章 格式化輸出</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>
我們已經見過用print函數將原始的未格式化的文本輸出到文件,本章講述如何用函數write和打印格式來生成格式化的輸出。<br>
<a name=1>一、定義打印格式</a><br>
定義打印格式的關鍵字為format,語法為:<br>
<blockquote>format formatname =<br>
lines_of_output<br>
.</blockquote>
打印格式名formatname的命名規則與一般變量相同。結束行為一個句號,此行不能有任何其它字符,包括空格,句號必須是該行第一個字符。<br>
打印格式的定義象子程序一樣可以放在任何地方,甚至可以放在條件語句中,但是最好把它們集中放在程序的開頭或結尾。<br>
<a name=2>二、顯示打印格式</a><br>
打印格式的顯示有兩步:<br>
1、將系統變量$~設成所要使用的格式<br>
2、調用函數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>
結果輸出如下:<br>
<blockquote>$ program<br>
===================================<br>
Here is the text I want to display.<br>
===================================<br>
$</blockquote>
如果不用$~指定打印格式,Perl解釋器就假定要使用的格式名與要寫入的文件變量同名,在本例中,如果不指定使用MYFORMAT,則Perl解釋器試圖使用名為STDOUT的打印格式。<br>
<a name=3></a>三、在打印格式中顯示值<br>
我們使用打印格式的主要原因當然是格式化存貯在簡單變量或數組變量中的值從而生成可讀性好的輸出,這一目的用“值域”來實現。每個值域指定一個值,如變量或表達式,調用write函數時,該值就以值域指定的格式顯示。<br>
<a name=3.1></a>1、通用的打印格式<br>
打印格式的一個缺點是定義中包含了變量名,例如:<br>
<blockquote>format MYFORMAT =<br>
==========================================================<br>
The winning number is @<<<<<<!<br>
$winnum<br>
==========================================================<br>
.</blockquote>
當調用write輸出此格式時,必須記著它使用了變量$winnum。用子程序和局域變量就可以創建更通用的打印格式。下例從STDIN輸入一個文件并輸出五個出現頻率最高的字母及出現次數。<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>
運行結果如下:<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>
在上例中,你可能已經注意到子程序write_letter調用write輸出字母及其出現次數,即使格式定義在子程序外部仍能正常工作。在第17行中將字母及其出現次數傳遞給該子程序,在子程序中,打印格式使用局域變量$letter和$value,這樣保證了在foreach循環中每次輸出當前的字母和值。<br>
然而要注意的是,使用my定義的局域變量要求格式定義在子程序內部,否則就不會輸出,因此,用write輸出的局域變量一定要用local定義。(local和my詳見《子程序》一章)<br>
注:Perl4中沒有my函數,故不會有此問題。<br>
<a name=3.3>3、選擇值域格式</a><br>
我們已經知道了打印格式和write函數怎么工作,現在來看看值域的格式,見下表:<br>
<p>
<table border=1 align=center>
<tr>
<td>格式</td>
<td>值域含義</td>
</tr>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -