Go to the first, previous, next, last section, table of contents.

フォーマット

write 演算子で使う出力レコードフォーマットは以下のように宣言する。

format NAME =
FORMLIST
.

NAME を省略すると、`STDOUT' が定義される。 FORMLIST は複数行からなり、行はそれぞれ 3 種類のどれかである。

  1. コメント
  2. 1 出力行のフォーマットを示す `picture' 行。
  3. `picture' 行に値を与える引数行。

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.


Go to the first, previous, next, last section, table of contents.