六、格式化長字符串 我們已經學過值域@*可以輸出多行文本,但它完全將字符串原樣輸出,不加以格式化。在Perl中對長字符串(包含換行)進行格式化的值域定義很簡單,只需把打頭的@字符換成^就行了,這種文本格式化中,Perl解釋器在一行中放置盡可能多的單詞。每當輸出一行文本,被輸出的子串就從變量中刪除,再次在域值中使用該變量就把剩下的字符串繼續按格式輸出。當內容已輸出完畢,該變量就成了空串,再輸出就會輸出空行,為避免輸出空行,可以在值域格式行首加一個~字符。見下例:
1 : #!/usr/local/bin/perl 2 : 3 : @quotation = ; 4 : $quotation = join("", @quotation); 5 : $~ = "QUOTATION"; 6 : write; 7 : 8 : format QUOTATION = 9 : Quotation for the day: 10: ----------------------------- 11: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 12: $quotation 13: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 14: $quotation 15: ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 16: $quotation 17: ----------------------------- 18: . 運行結果如下:
$ program Any sufficiently advanced programming language is indistinguishable from magic. ^D Quotation for the day: ----------------------------- Any sufficiently advanced programming language is indistinguishable from magic. ----------------------------- $ 如果把打印格式中行首的~字符去掉,上面的輸出結果中就會多一行空行。很明顯,當字符串長度不明確時,這種用法很不方便,原因就在于它指明了輸出的行數上限,超過這一上限的字符就不會被輸出,解決方法很簡單,就是在域值格式行首加兩個~字符,這樣就會持續按格式輸出文本直到輸出完畢,用此方法把上述程序改寫如下:
1 : #!/usr/local/bin/perl 2 : 3 : @quotation = ; 4 : $quotation = join("", @quotation); 5 : $~ = "QUOTATION"; 6 : write; 7 : 8 : format QUOTATION = 9 : Quotation for the day: 10: ----------------------------- 11: ~~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 12: $quotation 13: ----------------------------- 14: . 這樣運行結果相同。 七、用printf格式化輸出 還有一種容易掌握和使用的格式化輸出函數,那就是printf,它與C語言中的printf基本上是相同的。printf有兩個參數,一個是字符串,其中含有一個或多個域值形式,另一個是與各域值相對應的變量值按一定格式替換,如: printf("The number I want to print is %d.\n", $number); 各種域值形式如下表:
域值 含義 %c 單個字符 %d 十進制整數 %e 科學計數法形式的浮點數 %f 普通形式(定點)浮點數 %g 緊縮形式浮點數 %o 八進制整數 %s 字符串 %u 無符號整數 % 十六進制整數
一些使用細節如下:
1、在格式d、o、u或x中,如果整數值較大或可能較大,可加個l字符,意為長整型,如%ld。 2、%字符后加正整數表示該域的最小寬度,如果輸出結果寬度不足,則向右對齊,前面用空格補足,如果該正整數以數字0打頭,則補足字符為0。若%字符后為負整數,則結果向右對齊。 3、浮點數域值(%c、%f和%g)中可以指定小數點前后的寬度,如%8.3f意為總寬度為8個字符,小數點后(即小數部分)為3個字符,多出的小數部分四舍五入。 4、在整數、字符或字符串的值域中使用如上的小數形式n.m,整數部分n為總寬度,小數部分m為輸出結果的最大寬度,這樣就保證了輸出結果前至少有n-m個空格。
|