溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Perl中怎么格式化輸出

發(fā)布時(shí)間:2021-06-23 14:47:03 來(lái)源:億速云 閱讀:545 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

Perl中怎么格式化輸出,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

Perl格式化輸出

我們已經(jīng)見(jiàn)過(guò)用print函數(shù)將原始的未格式化的文本輸出到文件,本文講述如何用函數(shù)write和打印格式來(lái)生成格式化的輸出。

一、Perl格式化輸出中定義打印格式

定義打印格式的關(guān)鍵字為format,語(yǔ)法為:

formatformatname=
lines_of_output

打印格式名formatname的命名規(guī)則與一般變量相同。結(jié)束行為一個(gè)句號(hào),此行不能有任何其它字符,包括空格,句號(hào)必須是該行***個(gè)字符。
打印格式的定義象子程序一樣可以放在任何地方,甚至可以放在條件語(yǔ)句中,但是***把它們集中放在程序的開(kāi)頭或結(jié)尾。

二、Perl格式化輸出中顯示打印格式

打印格式的顯示有兩步:
1、將系統(tǒng)變量$~設(shè)成所要使用的格式
2、調(diào)用函數(shù)write
例如:

1:#!/usr/local/bin/Perl  2:  3:$~="MYFORMAT";  4:write;  5:  6:formatMYFORMAT=  7:===================================  8:HereisthetextIwanttodisplay.  9:===================================  10:.

結(jié)果輸出如下:

$program ===================================  HereisthetextIwanttodisplay. ===================================  $

如果不用$~指定打印格式,Perl解釋器就假定要使用的格式名與要寫(xiě)入的文件變量同名,在本例中,如果不指定使用MYFORMAT,則Perl解釋器試圖使用名為STDOUT的打印格式。

三、Perl格式化輸出在打印格式中顯示值

我們使用打印格式的主要原因當(dāng)然是格式化存貯在簡(jiǎn)單變量或數(shù)組變量中的值從而生成可讀性好的輸出,這一目的用“值域”來(lái)實(shí)現(xiàn)。每個(gè)值域指定一個(gè)值,如變量或表達(dá)式,調(diào)用write函數(shù)時(shí),該值就以值域指定的格式顯示。

1、通用的打印格式

打印格式的一個(gè)缺點(diǎn)是定義中包含了變量名,例如:

formatMYFORMAT=  ==========================================================  Thewinningnumberis@<<<<<$winnum ==========================================================

◆當(dāng)調(diào)用write輸出此格式時(shí),必須記著它使用了變量$winnum。用子程序和局域變量就可以創(chuàng)建更通用的打印格式。下例從STDIN輸入一個(gè)文件并輸出五個(gè)出現(xiàn)頻率***的字母及出現(xiàn)次數(shù)。

2、格式和局域變量

在上例中,你可能已經(jīng)注意到子程序write_letter調(diào)用write輸出字母及其出現(xiàn)次數(shù),即使格式定義在子程序外部仍能正常工作。在第17行中將字母及其出現(xiàn)次數(shù)傳遞給該子程序,在子程序中,打印格式使用局域變量$letter和$value,這樣保證了在foreach循環(huán)中每次輸出當(dāng)前的字母和值。
然而要注意的是,使用my定義的局域變量要求格式定義在子程序內(nèi)部,否則就不會(huì)輸出,因此,用write輸出的局域變量一定要用local定義。(local和my詳見(jiàn)《子程序》一章)
注:Perl4中沒(méi)有my函數(shù),故不會(huì)有此問(wèn)題。

3、選擇值域格式

我們已經(jīng)知道了打印格式和write函數(shù)怎么工作,現(xiàn)在來(lái)看看值域的格式,見(jiàn)下表:

格式值域含義
@<<<左對(duì)齊輸出
@>>>右對(duì)齊輸出
@|||中對(duì)齊輸出
@##.##固定精度數(shù)字
@*多行文本

每個(gè)值域的***個(gè)字符是行填充符,當(dāng)使用@字符時(shí),不做文本格式化。對(duì)文本的格式化稍后來(lái)講。
在上表中,除了多行值域@*,域?qū)挾嫉扔谄渲付ǖ陌址鸃在內(nèi)的字符個(gè)數(shù),例如:
@###.##
表示七個(gè)字符寬,小數(shù)點(diǎn)前四個(gè),小數(shù)點(diǎn)后兩個(gè)。

4、輸出值域字符

在打印格式里,特定字符如@、<和>被看作值域定義,那么如何將它們輸出呢?方法如下:

formatSPECIAL=
Thislinecontainsthespecialcharacter@.
"@"

四、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í),就開(kāi)始新的一頁(yè),調(diào)整方法如:
print("Hereisalineofoutput\n");
$--=1;

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI