Perl - 格式



Perl 使用稱為“格式”的編寫模板來輸出報表。要使用 Perl 的格式功能,首先必須定義一個格式,然後才能使用該格式來編寫格式化資料。

定義格式

以下是定義 Perl 格式的語法:

format FormatName =
fieldline
value_one, value_two, value_three
fieldline
value_one, value_two
.

這裡 FormatName 表示格式的名稱。fieldline 是資料應如何格式化的特定方式。values 行表示將輸入欄位行的值。您用一個句點結束格式。

下一個 fieldline 可以包含任何文字或欄位佔位符。欄位佔位符保留用於稍後放置在那裡的資料的空間。欄位佔位符具有以下格式:

@<<<<

此欄位佔位符左對齊,欄位空間為 5。您必須計算 @ 符號和 < 符號以瞭解欄位中的空格數。其他欄位佔位符包括:

@>>>> right-justified
@|||| centered
@####.## numeric field holder
@* multiline field holder

格式示例如下:

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

在此示例中,$name 將以左對齊的方式寫入 22 個字元的空間內,然後 age 將寫入兩個空格。

使用格式

為了呼叫此格式宣告,我們將使用 write 關鍵字:

write EMPLOYEE;

問題是格式名稱通常是開啟的檔案控制代碼的名稱,write 語句會將輸出傳送到此檔案控制代碼。由於我們希望資料傳送到 STDOUT,因此我們必須將 EMPLOYEE 與 STDOUT 檔案控制代碼關聯。但是,首先,我們必須確保 STDOUT 是我們選擇的檔案控制代碼,使用 select() 函式。

select(STDOUT);

然後,我們將透過使用特殊變數 $~ 或 $FORMAT_NAME 將 EMPLOYEE 與 STDOUT 關聯,如下所示設定新的格式名稱:

$~ = "EMPLOYEE";

當我們現在執行 write() 時,資料將傳送到 STDOUT。請記住:如果您要將報表寫入任何其他檔案控制代碼而不是 STDOUT,則可以使用 select() 函式選擇該檔案控制代碼,其餘邏輯將保持不變。

讓我們以以下示例為例。這裡我們硬編碼了值,僅用於演示用法。在實際使用中,您將從檔案或資料庫中讀取值以生成實際報表,並且您可能需要再次將最終報表寫入檔案。

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

select(STDOUT);
$~ = EMPLOYEE;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n) {
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

執行後,將產生以下結果:

===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

定義報表標題

一切看起來都很好。但是您可能希望向報表中新增標題。此標題將列印在每一頁的頂部。這樣做非常簡單。除了定義模板外,您還需要定義標題並將其分配給 $^ 或 $FORMAT_TOP_NAME 變數:

#!/usr/bin/perl

format EMPLOYEE =
===================================
@<<<<<<<<<<<<<<<<<<<<<< @<< 
$name $age
@#####.##
$salary
===================================
.

format EMPLOYEE_TOP =
===================================
Name                    Age
===================================
.

select(STDOUT);
$~ = EMPLOYEE;
$^ = EMPLOYEE_TOP;

@n = ("Ali", "Raza", "Jaffer");
@a  = (20,30, 40);
@s = (2000.00, 2500.00, 4000.000);

$i = 0;
foreach (@n) {
   $name = $_;
   $age = $a[$i];
   $salary = $s[$i++];
   write;
}

現在您的報表將如下所示:

===================================
Name                    Age
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

定義分頁

如果您的報表佔用超過一頁怎麼辦?您有一個解決方案,只需使用 $% 或 $FORMAT_PAGE_NUMBER 變數以及標題,如下所示:

format EMPLOYEE_TOP =
===================================
Name                    Age Page @<
                                 $%
===================================                               
.

現在您的輸出將如下所示:

===================================
Name                    Age Page 1
===================================
===================================
Ali                     20
  2000.00
===================================
===================================
Raza                    30
  2500.00
===================================
===================================
Jaffer                  40
  4000.00
===================================

每頁的行數

您可以使用特殊變數 $=(或 $FORMAT_LINES_PER_PAGE)設定每頁的行數,預設情況下 $= 為 60。

定義報表頁尾

雖然 $^ 或 $FORMAT_TOP_NAME 包含當前標題格式的名稱,但沒有相應的機制可以自動對頁尾執行相同操作。如果您有一個固定大小的頁尾,則可以在每次 write() 之前檢查變數 $- 或 $FORMAT_LINES_LEFT 並使用如下定義的另一個格式在必要時自行列印頁尾:

format EMPLOYEE_BOTTOM =
End of Page @<
            $%
.

有關與格式相關的完整變數集,請參閱 Perl 特殊變數 部分。

廣告

© . All rights reserved.