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


フォーマット変数

その時点でのフォーマット名は、変数 $~ ($FORMAT_NAME) に入 れられており、ページ先頭フォーマットは、$^ ($FORMAT_TOP_NAME)に入れられています。ページ番号は、$% ($FORMAT_PAGE_NUMBER)に、ページあたりの行数は $= ($FORMAT_LINES_PER_PAGE) に入っています。そのファイルハンドルに対 して出力を自動フラッシュするか否かは、$| ($OUTPUT_AUTOFLUSH) に入れられています。(先頭ページ以外の) ページ の先頭の前に出力する文字列は、$^L ($FORMAT_FORMFEED) に蓄 えられます。これらの変数は、ファイルハンドルごとに設定されますので、特定 のファイルハンドルのものを変更するには select() する必要がありま す:

select((select(OUTF),
        $~ = "My_Other_Format",
        $^ = "My_Top_Format"
       )[0]);

汚いですか?でも、普通のイディオムなので、見つけたときには驚かないでくだ さい。少なくとも以前のファイルハンドルを保持するのに一時変数を使うことが できます。(読みやすいばかりでなく、デバッガでステップ実行するときに式の 途中で、中間的な状態を用意できることになりますから、一般にはこちらの方が ずっと良いでしょう):

$ofh = select(OUTF);
$~ = "My_Other_Format";
$^ = "My_Top_Format";
select($ofh);

`English' モジュールを使えば、変数名を読むことさえできます:

use English;
$ofh = select(OUTF);
$FORMAT_NAME     = "My_Other_Format";
$FORMAT_TOP_NAME = "My_Top_Format";
select($ofh);

しかし、意味不明の select() がまだ残っています。`FileHandle' モジュールを使ってください。小文字のメソッドを使って、特殊変数をアクセス することができるようになります:

use FileHandle;
format_name     OUTF "My_Other_Format";
format_top_name OUTF "My_Top_Format";

ずっと良いでしょう !

NOTES

引数行には、( ^ フィールドに対してではなく、@ フィールドに対して) 任意 の式が許容されますから、もっと込み入った処理には、sprintf() や独 自の関数などに任せることもできます。たとえば:

format Ident =
    @<<<<<<<<<<<<<<<
    &commify($n)
.

実際に @ や ^ をフィールドに表示するには、以下のようにします:

format Ident =
I have an @ here.
        "@"
.

テキスト全体をセンタリングするには、このようになります:

format Ident =
@|||||||||||||||||||||||||||||||||||||||||||||||
        "Some text line"
.

「どんな幅であっても、右端に寄せるようにしたい。」というような要望に答え る方法は組み込まれていません。表示する場所を必ず指定する必要があります。 窮余の策としては、現在のカラム数に基づいて、その場でフォーマットを作って、 eval() することができます:

$format  = "format STDOUT = \n";
         . '^' . '<' x $cols . "\n";
         . '$entry' . "\n";
         . "\t^" . "<" x ($cols-8) . "~~\n";
         . '$entry' . "\n";
         . ".\n";
print $format if $Debugging;
eval $format;
die $@ if $@;

これは、以下のようなフォーマット文を生成します:

format STDOUT =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
$entry
        ^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<~~
$entry
.

fmt(1) のようなプログラム:

format =
^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ~~
$_
.

$/ = '';
while (<>) {
    s/\s*\n\s*/ /g;
    write;
}


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

検索式: