Perl-formats

提供:Dev Guides
移動先:案内検索

Perl-フォーマット

Perlは、レポートを出力するために「フォーマット」と呼ばれる記述テンプレートを使用します。 Perlのフォーマット機能を使用するには、最初にフォーマットを定義する必要があり、次にそのフォーマットを使用してフォーマットされたデータを書き込むことができます。

フォーマットを定義する

以下は、Perl形式を定義するための構文です-

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

ここで、 FormatName はフォーマットの名前を表します。 fieldline は特定の方法であり、データをフォーマットする必要があります。 値行は、フィールド行に入力される値を表します。 単一のピリオドでフォーマットを終了します。

次の fieldline には、任意のテキストまたはフィールドホルダーを含めることができます。 フィールドホルダーは、後日そこに配置されるデータ用のスペースを保持します。 フィールドホルダーの形式は次のとおりです-

@<<<<

このフィールドホルダーは、フィールドスペースが5の左寄せです。 フィールド内のスペースの数を知るには、@記号と<記号を数える必要があります。 他のフィールドホルダーには次のものがあります-

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

例の形式は次のようになります-

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

この例では、$ nameは22文字のスペース内で左揃えとして書き込まれ、それ以降は2つのスペースに書き込まれます。

フォーマットを使用する

このフォーマット宣言を呼び出すには、 write キーワードを使用します-

write EMPLOYEE;

問題は、通常、形式名が開いているファイルハンドルの名前であり、書き込みステートメントがこのファイルハンドルに出力を送信することです。 データをSTDOUTに送信するため、EMPLOYEEをSTDOUTファイルハンドルに関連付ける必要があります。 ただし、最初に、select()関数を使用して、STDOUTが選択されたファイルハンドルであることを確認する必要があります。

select(STDOUT);

次に、次のように特別な変数$〜または$ FORMAT_NAMEを使用して、新しいフォーマット名をSTDOUTに設定することにより、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/perl特殊変数[Perl特殊変数]セクション。