學習筆記 詳解Perl格式化輸出
本文和大家重點討論一下Perl格式化輸出的概念,我們已經見過用print函數將原始的未格式化的文本輸出到文件,本章講述如何用函數write和打印格式來生成格式化的輸出。
Perl格式化輸出
我們已經見過用print函數將原始的未格式化的文本輸出到文件,本章講述如何用函數write和打印格式來生成格式化的輸出。
一、Perl格式化輸出之定義打印格式
定義打印格式的關鍵字為format,語法為:
formatformatname=
lines_of_output
◆打印格式名formatname的命名規則與一般變量相同。結束行為一個句號,此行不能有任何其它字符,包括空格,句號必須是該行第一個字符。
打印格式的定義象子程序一樣可以放在任何地方,甚至可以放在條件語句中,但是最好把它們集中放在程序的開頭或結尾。
二、Perl格式化輸出之顯示打印格式
打印格式的顯示有兩步:
1、將系統變量$~設成所要使用的格式
2、調用函數write
例如:
- 1:#!/usr/local/bin/perl
- 2:
- 3:$~="MYFORMAT";
- 4:write;
- 5:
- 6:formatMYFORMAT=
- 7:===================================
- 8:HereisthetextIwanttodisplay.
- 9:===================================
- 10:.
結果輸出如下:
$program
===================================
HereisthetextIwanttodisplay.
===================================
$
如果不用$~指定打印格式,Perl解釋器就假定要使用的格式名與要寫入的文件變量同名,在本例中,如果不指定使用MYFORMAT,則Perl解釋器試圖使用名為STDOUT的打印格式。
三、Perl格式化輸出之在打印格式中顯示值
我們使用打印格式的主要原因當然是格式化存貯在簡單變量或數組變量中的值從而生成可讀性好的輸出,這一目的用“值域”來實現。每個值域指定一個值,如變量或表達式,調用write函數時,該值就以值域指定的格式顯示。
1、通用的打印格式
打印格式的一個缺點是定義中包含了變量名,例如:
- formatMYFORMAT=
- ==========================================================
- Thewinningnumberis@<<<<<<!
- $winnum
- ==========================================================
◆當調用write輸出此格式時,必須記著它使用了變量$winnum。用子程序和局域變量就可以創建更通用的打印格式。
2、格式和局域變量
在上例中,你可能已經注意到子程序write_letter調用write輸出字母及其出現次數,即使格式定義在子程序外部仍能正常工作。在第17行中將字母及其出現次數傳遞給該子程序,在子程序中,打印格式使用局域變量$letter和$value,這樣保證了在foreach循環中每次輸出當前的字母和值。
然而要注意的是,使用my定義的局域變量要求格式定義在子程序內部,否則就不會輸出,因此,用write輸出的局域變量一定要用local定義。(local和my詳見《子程序》一章)
注:Perl4中沒有my函數,故不會有此問題。
3、選擇值域格式
我們已經知道了打印格式和write函數怎么工作,現在來看看值域的格式,見下表:
每個值域的第一個字符是行填充符,當使用@字符時,不做文本格式化。對文本的格式化稍后來講。
在上表中,除了多行值域@*,域寬都等于其指定的包含字符@在內的字符個數,例如:
@###.##
表示七個字符寬,小數點前四個,小數點后兩個。
4、輸出值域字符
在打印格式里,特定字符如@、<和>被看作值域定義,那么如何將它們輸出呢?方法如下:
formatSPECIAL=
Thislinecontainsthespecialcharacter@.
"@"
【編輯推薦】