write
演算子で使う出力レコードフォーマットは以下のように宣言する。
format NAME = FORMLIST .
NAME
を省略すると、`STDOUT' が定義される。
FORMLIST
は複数行からなり、行はそれぞれ 3 種類のどれかである。
picture
行は行内の値が置換される特定のフィールドを除いて
見た目そのままに出力される。
picture
フィールドは全て @
または ^
で始まる。
@
フィールド(配列を表す @
と混乱しないように)は通常の場合、
^
フィールドは複数行テキストブロックの
初歩的な filling を行うためのものである。
フィールドの長さは文字 <
>
|
で埋めることで表す。
これらはそれぞれ左寄せ、右寄せ、センタリングを指示する。
右寄せについては、#
(に .
をつけてもよい)を使って
数値フィールドであることを指定してもよい。
(@ の代わりに ^ を使うと、そのフィールドが undefined の場合ブランクになる。)
これらのフィールドに指定された値に改行が入っている場合は、
改行までのテキストのみが出力される。
特殊なフィールド @*
は複数行の値を出力するのに用いる。
これは一行にそれだけしか指定できない。
値はその次の行で指定する。
順番は picture
フィールドのものと同じにする。
値はコンマで区切らなければならない。
@
ではなく、
^
で始まる picture
フィールドは特別に扱われる。
指定する値はテキスト文字列を値として持つスカラー変数の名前でなければならない。
perl は可能なかぎりのテキストをフィールドに与え、変数の先頭からそれを取り除く。
これは次にその変数が参照された時にテキストの続きを表示するためである。
通常、テキストブロックを出力するには垂直なスタックの中にフィールドをいくつか書く。
最後のフィールドを ...
で終わることもできる。
こうすればテキストが全部入りきらない場合に ...
が出力に現れる。
変数 $:
を好みの文字のリストに変更することで
テキストを分割することが可能な文字を変えることができる。See section $: : format で文字列を分ける際の直前の文字列セット for $:
.
フォーマットされるテキストが短い場合、
^
フィールドを使うと可変長レコードができるので、
行のどこかに文字 ~
を入れることで空行の出力を抑制することができる。
(見易さを考えると、通常、可能ならば先頭に入れるべきである。)
~
は出力においてスペースに変換される。
一つ目に続けて二つ目の ~
を入れると、
行中の全フィールドがなくなるまでその行を繰り返す?。
(@
フィールドを使う場合、それに与える expression は
永遠に同じ値であるようなものにするべきではない。)
例:
# /etc/passwd ファイルのレポート format STDOUT_TOP = Passwd File Name Login Office Uid Gid Home ------------------------------------------------------------------ . format STDOUT = @<<<<<<<<<<<<<<<<<< @||||||| @<<<<<<@>>>> @>>>> @<<<<<<<<<<<<<<<<< $name, $login, $office,$uid,$gid, $home # バグレポート形式 format STDOUT_TOP = Bug Reports @<<<<<<<<<<<<<<<<<<<<<<< @||| @>>>>>>>>>>>>>>>>>>>>>>> $system, $%, $date ------------------------------------------------------------------ . format STDOUT = Subject: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< $subject Index: @<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $index, $description Priority: @<<<<<<<<<< Date: @<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $priority, $date, $description From: @<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $from, $description Assigned to: @<<<<<<<<<<<<<<<<<<<<<< ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $programmer, $description ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $description ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $description ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $description ~ ^<<<<<<<<<<<<<<<<<<<<<<<<<<<< $description ~ ^<<<<<<<<<<<<<<<<<<<<<<<... $description .
同じ出力チャンネルに対して write
を使って
出力を混在させることは可能であるが、
$-
(ページに残っている行)を自分で扱わねばならない。
See section $− : 出力チャンネルのページに残っている行数.
ほとんどが空白であるようなフィールドを出力する場合は、
レコードの間で reset
演算子を使うことを考えた方がよい。
より効率的であるだけでなく、
フィールドを増やして、初期化するのを忘れてしまうというバグを防げる。
See section reset.