write() は、format で指定した書式(フォーマット)に従って、変数の値を書き出します。write() と format はファイルハンドの名前で関連付けられます。フォーマットは2行で1組みで、最初の行が @<<< などの書式指定を、次の行が $size などの変数を指定します。フォーマットはドット(.)で終わります。@<<< は左寄せ、@||| は中寄せ、@>>> は右寄せを意味します。
# 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 を用いると、プリンタ印字の際の改ページが可能になります。
# ページヘッダを指定する 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 の値は表示の度に破壊されるので注意してください。
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 に変更することができます。
# 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);