2部 Perl言語仕様

フォーマット

フォーマットの概要

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
.

関連記事