新聞中心
在學(xué)習(xí)Perl的過(guò)程中,Perl格式化輸出問題經(jīng)常會(huì)遇到,我們已經(jīng)見過(guò)用print函數(shù)將原始的未格式化的文本輸出到文件,本章講述如何用函數(shù)write和打印格式來(lái)生成格式化的輸出。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括邛崍網(wǎng)站建設(shè)、邛崍網(wǎng)站制作、邛崍網(wǎng)頁(yè)制作以及邛崍網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邛崍網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邛崍省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
Perl格式化輸出
一、輸出到其它文件
缺省地,函數(shù)write將結(jié)果輸出到標(biāo)準(zhǔn)輸出文件STDOUT,我們也可以使它將結(jié)果輸出到任意其它的文件中。最簡(jiǎn)單的方法就是把文件變量作為參數(shù)傳遞給write,如:
write(MYFILE);
這樣,write就用缺省的名為MYFILE的打印格式輸出到文件MYFILE中,但是這樣就不能用$~變量來(lái)改變所使用的打印格式。系統(tǒng)變量$~只對(duì)缺省文件變量起作用,我們可以改變?nèi)笔∥募兞浚淖?~,再調(diào)用write,例如:
select(MYFILE);
$~="MYFORMAT";
write;
◆當(dāng)select改變?nèi)笔∥募兞繒r(shí),它返回當(dāng)前缺省文件變量的內(nèi)部表示,這樣我們就可以創(chuàng)建子程序,按自己的想法輸出,又不影響程序的其它部分,如下:
- subwrite_to_stdout{
- local($savefile,$saveformat);
- $savefile=select(STDOUT);
- $saveformat=$~;
- $~="MYFORMAT";
- write;
- $~=$saveformat;
- select($savefile);
- }
二、Perl格式化輸出之分頁(yè)
在輸出到打印機(jī)時(shí),可以在每頁(yè)頂部輸出相應(yīng)的信息,這樣的特殊文本叫頁(yè)眉。定義頁(yè)眉實(shí)際上就是定義名為filename_TOP的打印格式,例如給標(biāo)準(zhǔn)輸出文件定義頁(yè)眉如下:
formatSTDOUT_TOP=
ConsolidatedWidgetsInc.1994AnnualReport
◆在頁(yè)眉的定義中也可以包含值域,頁(yè)眉中經(jīng)常使用的一個(gè)特殊值是當(dāng)前頁(yè)碼,存貯在系統(tǒng)變量$%中,如:
formatSTDOUT_TOP=
Page@<<.
$%
◆我們也可以通過(guò)改變系統(tǒng)變量$^改變定義頁(yè)眉的打印格式名,與$~一樣,$^只對(duì)當(dāng)前缺省文件起作用,因此可以與select函數(shù)結(jié)合使用。
缺省情況下,每頁(yè)長(zhǎng)度為60行,可以通過(guò)改變$=來(lái)改變頁(yè)長(zhǎng),如:
$==66;#頁(yè)長(zhǎng)設(shè)為66行
此賦值語(yǔ)句必須出現(xiàn)在第一個(gè)write語(yǔ)句前。
注:一般使用分頁(yè)機(jī)制時(shí)不用print函數(shù),因?yàn)楫?dāng)用write輸出時(shí),Perl解釋器跟蹤每頁(yè)的當(dāng)前行號(hào)。如果必須使用print而又不打亂頁(yè)計(jì)數(shù),可以調(diào)整系統(tǒng)變量$-。$-的含義是當(dāng)前行到頁(yè)末之間的行數(shù),當(dāng)$-達(dá)到零時(shí),就開始新的一頁(yè),調(diào)整方法如:
print("Hereisalineofoutput\n");
$--=1;
三、Perl格式化輸出之格式化長(zhǎng)字符串
我們已經(jīng)學(xué)過(guò)值域@*可以輸出多行文本,但它完全將字符串原樣輸出,不加以格式化。在Perl中對(duì)長(zhǎng)字符串(包含換行)進(jìn)行格式化的值域定義很簡(jiǎn)單,只需把打頭的@字符換成^就行了,這種文本格式化中,Perl解釋器在一行中放置盡可能多的單詞。每當(dāng)輸出一行文本,被輸出的子串就從變量中刪除,再次在域值中使用該變量就把剩下的字符串繼續(xù)按格式輸出。當(dāng)內(nèi)容已輸出完畢,該變量就成了空串,再輸出就會(huì)輸出空行,為避免輸出空行,可以在值域格式行首加一個(gè)~字符。見下例:
- 1:#!/usr/local/bin/perl
- 2:
- 3:@quotation=
; - 4:$quotation=join("",@quotation);
- 5:$~="QUOTATION";
- 6:write;
- 7:
- 8:formatQUOTATION=
- 9:Quotationfortheday:
- 10:-----------------------------
- 11:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- 12:$quotation
- 13:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- 14:$quotation
- 15:~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- 16:$quotation
- 17:-----------------------------
- 18:.
運(yùn)行結(jié)果如下:
- $program
- Anysufficientlyadvancedprogramming
- languageisindistinguishablefrommagic.
- ^D
- Quotationfortheday:
- -----------------------------
- Anysufficientlyadvancedprogramminglanguageis
- indistinguishablefrommagic.
- -----------------------------
- $
如果把打印格式中行首的~字符去掉,上面的輸出結(jié)果中就會(huì)多一行空行。很明顯,當(dāng)字符串長(zhǎng)度不明確時(shí),這種用法很不方便,原因就在于它指明了輸出的行數(shù)上限,超過(guò)這一上限的字符就不會(huì)被輸出,解決方法很簡(jiǎn)單,就是在域值格式行首加兩個(gè)~字符,這樣就會(huì)持續(xù)按格式輸出文本直到輸出完畢,用此方法把上述程序改寫如下:
- 1:#!/usr/local/bin/perl
- 2:
- 3:@quotation=
; - 4:$quotation=join("",@quotation);
- 5:$~="QUOTATION";
- 6:write;
- 7:
- 8:formatQUOTATION=
- 9:Quotationfortheday:
- 10:-----------------------------
- 11:~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- 12:$quotation
- 13:-----------------------------
- 14:.
這樣運(yùn)行結(jié)果相同。
四、用printfPerl格式化輸出
還有一種容易掌握和使用的Perl格式化輸出函數(shù),那就是printf,它與C語(yǔ)言中的printf基本上是相同的。printf有兩個(gè)參數(shù),一個(gè)是字符串,其中含有一個(gè)或多個(gè)域值形式,另一個(gè)是與各域值相對(duì)應(yīng)的變量值按一定格式替換,如:
printf("ThenumberIwanttoprintis%d.\n",$number);
各種域值形式如下表:
一些使用細(xì)節(jié)如下:
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è)空格。
分享題目:Perl格式化輸出用法解析
本文路徑:http://www.dlmjj.cn/article/cddppod.html


咨詢
建站咨詢
