フォーマット

■ 書式を指定して出力する(format, write)

◆ 書式を指定して出力する

write() は、format で指定した書式(フォーマット)に従って、変数の値を書き出します。write() と format はファイルハンドの名前で関連付けられます。フォーマットは2行で1組みで、最初の行が @<<< などの書式指定を、次の行が $size などの変数を指定します。フォーマットはドット(.)で終わります。@<<< は左寄せ、@||| は中寄せ、@>>> は右寄せを意味します。

format1.pl
# STDOUT に対するフォーマットを指定する
format STDOUT =
@>>>>>> @||||| @<<<<<<<<<<<<<<<<<
$size,  $mode, $file
.

# ファイルのサイズ、モード、ファイル名を書き出す
while ($file = <*>) {
    ($mode, $size) = (stat($file))[2, 7];
    $mode = sprintf("%03o", $mode & 0777);
    write(STDOUT);
}

実行結果の例は次のようになります。

   4972  666   app1.htm
  10681  666   app2.htm
    893  666   app3.htm
   1402  666   app4.htm
◆ ヘッダとフッタの指定

ページヘッダを指定するには、ファイルハンドル名に _TOP を付加したものに対して format 定義を行います。ページフッタを指定するには、特殊変数 $^L に値を代入します。特殊変数 $= は1ページあたりの行数、$- は現在のページの残り行数、$% はページ番号を示します。\n の代わりに \f を用いると、プリンタ印字の際の改ページが可能になります。

format2.pl
# ページヘッダを指定する
format STDOUT_TOP =
===SIZE=MODE===FILE===============
.

# フォーマットを指定する
format STDOUT =
@>>>>>> @||||| @<<<<<<<<<<<<<<<<<
$size,  $mode, $file
.

# 1ページあたりの行数を 32行とする
$= = 32;

while ($file = <*>) {
    ($mode, $size) = (stat($file))[2, 7];
    $mode = sprintf("%03o", $mode & 0777);

    # ページフッタを指定する
    $^L = "                    Page $%\n";

    # 書き出す
    write(STDOUT);
}

実行結果の例を下記に示します。

===SIZE=MODE===FILE===============
   4972  666   app1.htm
  10681  666   app2.htm
    893  666   app3.htm
   1402  666   app4.htm
    :     :      :
                    Page 1

■ 複数行にまたがる書式を指定する

◆ 複数行にまたがる書式

@<<< の代わりに ^<<< を指定すると、複数行にまたがった値を出力することができます。下記の例では $subject の値が複数行にまたがって出力されます。最後を 3文字のドット(...)で終えると、文字が長すぎて表示できないときに最後が ... で省略されます。変数 $subject の値は表示の度に破壊されるので注意してください。

format3.pl
format STDOUT =
To: @<<<<<<<<<<<<<<     | ^<<<<<<<<<<<<<<<<
    $to,                  $subject
From: @<<<<<<<<<<<<     | ^<<<<<<<<<<<<<<<<...
      $from,              $subject
.

$to = 'foo@xxx.yyy.zzz';
$from = 'baa@xxx.yyy.zzz';
$subject = "How can I write multiple line format?";
write(STDOUT);

実行結果を下記に示します。

To: foo@xxx.yyy.zzz     | How can I write
From: baa@xxx.yyy.z     | multiple line...

■ 複数のフォーマットを使い分ける

◆複数のフォーマットを使い分ける

特殊変数 $^$~ は現在セレクト中の出力(通常は STDOUT)に対するフォーマットを意味します。上記のように select() でセレクト対象の出力先を変更して $^ や $~ を設定することで、ファイルハンドル OUT に対するフォーマットを OUT2_TOP や OUT2 に変更することができます。

format4.pl
# OUT1フォーマットの定義
format OUT1_TOP =
===SIZE=MODE===FILE===============
.
format OUT1 =
@>>>>>> @||||| @<<<<<<<<<<<<<<<<<
$size,  $mode, $file
.

# OUT2フォーマットの定義
format OUT2_TOP =
===SIZE=DATE===FILE===============
.
format OUT2 =
@>>>>>> @||||||||| @<<<<<<<<<<<<<<<<<
$size,  $date,     $file
.

$size = 999;
$mode = 644;
$file = "file.txt";
$date = "2002/12/31";

open(OUT, "> format4.txt");

# OUT に対応するフォーマットを OUT1, OUT1_TOP に変更する
$old = select(OUT); $^ = "OUT1_TOP"; $~ = "OUT1"; select($old);
write(OUT);

# OUT に対応するフォーマットを OUT2, OUT2_TOP に変更する
$old = select(OUT); $^ = "OUT2_TOP"; $~ = "OUT2"; select($old);
write(OUT);

close(OUT);

Copyright (C) 2002 杜甫々