perl で外部コマンドと双方向通信

perl スクリプトからコマンドの入力にデータを流して、そのコマンドの出力を(ファィルを経由せずに)スクリプトに取り込みたい場合どうするかというお話。要するにこんなふうにしたい:

        print
[perl] --->>---[command]--+  
   |                      |  
   +-------<<-------------+   
           <>

こんな感じにするといいみたい。

                            <>
                [perl] IN --<<--------------+
[perl]-(fork)<                              |
                [perl] OUT -->>--[command]--+
                           print

コードはこんなの。

if (open(IN, "-|")) {
    # fork して子プロセスの標準出力を IN に繋ぐ
    $output = <IN>;
} else {
    # 子プロセス。コマンドの標準入力に OUT を繋ぐ
    open(OUT, "| command");
    print OUT $input;
    close(OUT); # 必ず閉じて
    exit(); # 終了
}

コマンドに渡すデータによっては、こんなのが簡単:

$output = `echo -n $input | command`;

だけど、$input に特殊文字が混じりうる場合はエスケープが面倒。