フォーマットの概要
formatを利用することで、ヘッダやフッタの設定や、テキストの右寄せ、中央揃え、左寄せなどのレイアウト、ファイルへの書き込みなどを簡単に行うことができます。
フォーマット宣言
レポートを作成するには、『ピクチャ』を定義し、出力する行の書式を1行単位で指定するのが基本です。宣言はformat、実行するには write を使用します。
フォーマット宣言
format フォーマット名 = フォーマットリスト .
出力レコードの書式は、format 宣言に続けてフォーマット名を指定します。フォーマット名を省略した際はSTDOUTが設定されます。ファイルハンドル用のデフォルトフォーマット名は、ファイルハンドルと同じになりますから、ファイルハンドルと同じフォーマット名にすると便利です。
フォーマットリストはフィールドの並びで、コメント、ピクチャ行、引数行を定義します。ピクチャ行では、出力するフィールドの幅と位置を示すシンボルを定義します。その次に引数行で、ピクチャ行で定義したシンボルの値を指定します。
簡単なフォーマット出力
$name = 'SMART!'; format STDOUT = # コメントは出力されない Welcom to @<<<<<<<<< $name . write; > Welcom to SMART!
※ format では、グローバルな変数と local()で宣言された動的スコープの変数だけが見えます。my() で宣言された字句スコープの変数は、formatと同じスコープにあるとはみなされず、使用することができません。
フォーマットリストの種類一覧
フォーマットリスト | 説明 |
---|---|
コメント | 行頭に # を置くとその行はコメントとして扱われます。 |
書式ピクチャ行 | 出力する行のフォーマットを1行単位で示します。 |
引数行 | 先行するピクチャ行に埋め込む値を示します。 |
フォーマット作成
フィールドピクチャ
レポートの作成で最も基本的なテクニックは、レポートの各フィールドを揃えることです。ここれは、フィールドを左揃え、右揃え、中央揃えにする方法を紹介します。
書式ピクチャの概要
ピクチャ行は、命令文を除いて見た目の通りに印字されます。ピクチャ行の各々のフィールドは、アットマーク( @ )やキャレット( ^ )で始まります。@ フィールドは通常のフィードで、^ フィールドが複数行に渡るテキストのブロックを作るために使われます。
フィールドの長さは、@ や ^ のあとに左寄せの左アングルブラケット( < )や、右寄せの右アングルブラケット( > )、中央寄せのパイプ文字( | )、数値フィールドのシャープ( # )をつけて、フィールドを定義します。
値がフィールドを超える場合には、切り捨てとなります。ピクチャ行では、変数の展開は行なわれません。
フィールドピクチャの一覧
フィールドピクチャ | 説明 |
---|---|
@<<<< | 行を左寄せにする。値が行の幅よりも短い場合、右側に空白が埋められる。 |
@>>>> | 行を右寄せにする。値が行の幅よりも短い場合、左側に空白が埋められる。 |
|||| | フィールドで中央揃えにする。値が行の幅よりも短い場合、値が行のほぼ中央に来るように両側に空白が埋められる。 |
@###.## | 数値フィールド(整数3桁、少数2桁) |
^<<<< | 行の内容を適切な長さで折り返しします。 |
フィールドピクチャを使ったサンプルです。
簡単なフォーマット出力
$name = "boogie"; $age = 29; format STDOUT = Hello, my name is @<<<<<<<<<< and I'm @<<< years old. $name, $age . write; # デフォルトで STDOUT に出力 > Hello, my name is boogie and I'm 29 years old.
フィールドピクチャの @<<<<<<<<<<、@<<< でそれぞれテキストを13文字と3文字のフィールドに左寄せ指示をしています。
数値フィールド
上記で紹介したフィールドピクチャとは別に、固定精度数値フィールドが用意されています。このフィールドも先頭は @ で始まりますが、その後ろにはシャープ記号( # )が続きます。また、1個のピリオド( . )を使って、小数点の位置をそろえることができます。
数値フィールドの出力テスト
my $er = 3.14159265358979; format STDOUT = Assets: @#.#### $er . write(); > 3.14
マルチラインフィールド
@ を先頭とするフィールドは、引数行で指定した値の中に改行文字を見つけると、そこでデータの挿入を終了し、残りの値を無視します。つまり、改行文字に続く文字列は常に無視されてしまいます。
複数の改行文字を含む値を差し込みたいような場合は、マルチラインフィールドというシンボルを使用します。マルチラインフィールドは、通常のフィールドシンボルと同様に @ 記号で始まり、その後に1つのアスタリスク(*)が続きます。
このフィールドを使う場合には、同じ行に別のフィールドを指定できません。
マルチラインフィールドの出力テスト
$word = "SMART!\n ---rhythmfactory"; format STDOUT = Welcom to @* $word . write; > Welcom to SMART! > ---rhythmfactory
行の折り返し
長い行をなどを適切な文字数で折り返しをしたいような場合、詰め込みフィールドというシンボルを使います。詰め込み整形フィールドは、ピクチャ行の先頭の @ をキャレット( ^ )に換えたものです。詰め込み整形フィールドを使うことによって、必要に応じてテキストを単語の切れ目で分割し、行の折り返しを行います。
行の折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads."; format STDOUT = ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word . write; > Perl 5.005_63 introduces the beginnings > of support for running multiple > interpreters concurrently in different > threads.
フィールドの先頭でチルダ( ~ )を指定すると、空行のような余分な行は出力されなくなります。~ を 2つ並べて書くと、すべてのフィールドに入れられる値が尽きてしまうまで、そのピクチャ行と引数行を繰り返して使用します。
チルダ( ~ )を使った折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads."; format STDOUT = ~~^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word . write; > Perl 5.005_63 introduces the beginnings > of support for running multiple > interpreters concurrently in different > threads.
一番最後のフィールドを ...という文字列で終わらせておくと、引数行で指定した値がフィールドに収まりきらなかったときに、文の最後に ...が付け足されて出力されます。
... を使った折り返しテスト
$word = "Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different threads."; format STDOUT = ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $word ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<... $word . write; Perl 5.005_63 introduces the beginnings of support for running multiple interpreters concurrently in different...
ページ設定
レポートにはヘッダやフッタ、ページ番号などが必要不可欠ですので、ここではそれらを表現するための方法を紹介していきます。
ヘッダ
レポートにヘッダを設定するための方法を紹介します。ヘッダとして出力したいデータのフォーマット名に _TOP をつなげることで、そのファイルハンドルはヘッダと解釈されます。
ヘッダの出力
# /etc/passwd ファイルについてのレポート open(FH, "/etc/passwd"); while (<FH>){ ($account,$passwd,$uid,$gid,$detail,$home) = split /:/,$_; write; } close FH; format STDOUT_TOP = Passwd File Account Password Uid Gid Detail Home ------------------------------------- . format STDOUT = @<<<<<<<<<< ******** @>>>> @>>>> @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< $account, $uid, $gid, $detail, $home .