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


フォーマット文

Perl は、単純なレポートやチャートを作成するお手伝いができます。これを簡 単にするために、Perl では、印字された時にどのように見えるかに近い形で、 コードの中で出力ページをレイアウトできます。Perl はまた、1ページに何行入 るか、現在何ページめか、いつページヘッダを出力するかといったことのめんど うをみてくれます。使用されるキーワードは FORTRAN から持ってきたもので、 宣言に format 文を用い、実行に write() を使います。 See section 組み込み関数,で formlinewrite の項を参照してくだ さい。幸い、レイアウトは BASIC の PRINT USING 文のようなものより読みやす いものです。安上がりな nroff(1) と考えてください。

フォーマットは、パッケージやサブルーティンと同じく、実行文ではなく、宣言 文ですから、プログラムのどこにおいてもかまいません。(しかしながら、普通 は1か所にまとめておいた方が良いでしょう。)フォーマットは Perl の他の「型」 とは別に名前空間がとられます。このことは、`Foo' という名前の関数を 持っているとき、それは、`Foo' という名前のフォーマットを持っている のとは違うということです。しかし、あるファイルハンドルに対して付随するフォー マットのデフォルトの名前は、そのファイルハンドルの名前と同じものです。つ まり、STDOUT に対するデフォルトのデフォルトのフォーマットは `STDOUT' であり、ファイルハンドル TEMP に対するデフォルトのフォーマッ ト名は `TEMP' だということです。これらは同じように見えますが、違う ものです。

出力レコードのフォーマットは以下のように宣言します:

format NAME =
FORMLIST
.

NAME を指定しないと、`STDOUT' というフォーマットが定義されま す。FORMLIST は行の並びからなり、それぞれの行は次の 3 つのどれかになりま す:

  1. コメント。行頭に # を置くとその行はコメントとして扱われます。
  2. ピクチャ行。出力する行のフォーマットを 1 行単位で示します。
  3. 引数行。先行するピクチャ行に埋め込む値を示します。

ピクチャ行は、ある種のフィールドが、その行に値を埋め込むのに使われる他は、 まったく見た目の通りに印字されます。ピクチャ行の各々のフィールドは、"@" や "^" で始まるようになっています。ピクチャ行では、いかなる形でも変数の 展開は行なわれません。"@" フィールド (配列の "@" と混同しないこと) は、 通常のフィードで、"^" フィールドが複数行に渡るテキストのブロックを作るた めに使われます。フィールドの長さは、"@" や "^" のあとに "<" や ">" や "|" を必要な数だけ並べることで表わし、それぞれ、左づめ、右づめ、センタリ ングを表わします。もし、値がフィールドをはみだす場合には、切り捨てられて しまいます。

右づめの別の形式として、数値フィールドを示す、"#" (と "." も可) を使うこ ともできます。この方法で、小数点の位置を揃えることができます。こういった フィールドに与えられる値に改行が含まれていると、その改行までのテキストが 印字されます。もう1つ "@*" というフィールドを使うと、値の切捨てを行なわ ずに、複数行にわたって印字するために使用するようにできます。このフィール ドを使う場合には、同じ行に別のフィールドを指定できません。

各フィールドへの値は、次の行に、ピクチャフィールドと同じ順番で指定します。 値を示す式は、コンマで区切られている必要があります。式はすべて、その行が 評価される前に、リストコンテキストで評価されますので、1つのリスト式が複 数のリスト要素を作るようにもできます。式は、中括弧で括って、複数行にする こともできます。もし、そのようにするときは、最初の行の最初のトークンを、 開き中括弧にしなければなりません。

"@" ではなく、"^" で始まるピクチャフィールドは、特別な扱いを受けます。 "#" を使ったフィールドでは、値が未定義の場合に、空白となります。他のタイ プのフィールドでは、"^" はある種の充填モードになります。値として指定でき るものは、任意の式ではなく、テキスト文字列が入ったスカラ変数名でなければ なりません。Perl はそのフィールドに入るだけのテキストを詰め込んで、変数 内の文字列の先頭から、その分を切り落とします。次にその変数が参照されると きには、残りの部分のテキストが印字できることになります。(そうです、この ことは変数自身が write() の実行中に変更され、もとには戻らないとい うことです。)普通は、テキストを矩形に表示するように、フィールドを縦に積 むような形で使われます。一番最後のフィールドを "..." という文字列で終わ らせておくと、表示するテキストがその最後のフィールドにも収まりきらなかっ たときに、そのまま "..." が出力されます。$: (English モジュール使 用時は $FORMAT_LINE_BREAK_CHARACTERS)という変数に文字列を設定する と、出力する文字列の中に、この変数内に設定した文字列中の 1 字が見つかっ たときに改行するようになります。

"^" フィールドを使うと可変長のレコードが作れます。フォーマットされるテキ ストが短ければ、行のどこかに "~" をおくことで空行の出力をサプレスするこ とができます。出力時には、"~" は空白に変換されます。"~" を2つ並べて書く と、すべてのフィールドに入れられる値が尽きてしまうまで、そのピクチャ行と 引数行を繰り返して使用します。(もし、"@" タイプのフィールドを使うならば、 与える式は永久に同じ値を出すことの無いようにしないといけません。)

ページ先頭フォーマットの処理はデフォルトでは、現在のファイルハンドル名に `_TOP' をつなげた名前のフォーマットで行なわれます。これは、各々のペー ジの先頭で使われます。See section 組み込み関数,の write() の項を参照し てください。

例:

# /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
.

同じ出力チャネルに print()write() を混ぜて使うことも可 能ですが、$- ($FORMAT_LINES_LEFT) を自分で調整する必要があ ります。


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

検索式: