📄 perl10.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb_2312-80">
<title>Perl中文手册</title>
<LINK rel="stylesheet" href="mystyle.css" type="text/css">
</head>
<body>
<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></p>
<p align="center">目录</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">
<table border="0" width="100%" cellpadding="0">
<tr>
<td width="1%">
</td>
<td width="99%">
<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">三、在打印格式中显示值<br>
我们使用打印格式的主要原因当然是格式化存贮在简单变量或数组变量中的值从而生成可读性好的输出,这一目的用“值域”来实现。每个值域指定一个值,如变量或表达式,调用write函数时,该值就以值域指定的格式显示。<br>
<a name="3.1">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>
<tr>
<td>@<<<</td>
<td>左对齐输出</td>
</tr>
<tr>
<td>@>>></td>
<td>右对齐输出</td>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -