プロセスをファイルハンドルとして使う

逆クォートを使ってコマンドからの入力を読み込む場合は、子プロセスが終了するまで、Perlプロセスは待たなければならない。並立実行する子プロセスを起動するには、コマンドの前後どちらかに縦棒を付けたものを指定する。

open DATE, "date|"; # dateコマンドの結果がDATEに送られる
open MAIL, "|mail"; # MAILに書き出したものがmailコマンドに送られる

後ろにパイプ(縦棒)を付けると入力用に、後ろにパイプを付けると出力用にオープンされる。これらをパイプオープンと呼ぶこともある。子プロセスが作れなかったらopen演算子は偽を返す。コマンドそのものが存在しなかったり、コマンドがエラーで終了した場合は、close演算子を使った時に、エラーが出る。


使い方は普通のファイルハンドルと同じ。

my $date = <DATE>;
print MAIL "hoge hoge\n";


入力用のファイルハンドルに連結したプロセスが終了すると、ファイルの終わりを返す。出力用のファイルハンドルに連結したファイルハンドルをクローズすると、Perlはプロセスが終了ステータスを返すのを待つ。終了ステータスは$?変数にセットされ、その値はsystem関数が返すものと同じ。


パイプオープンを使うと、結果が得られるたびに処理していくということができる。時間がかかるコマンドの場合は、パイプオープンを使った方が、少しずつでも結果が表示されるので、いらいらしないで済むと思う。