4

perl では、子プロセスを実行し、そこに入力を送信し、その出力を読み取る必要があることがよくあります。これを行うためのモジュールはいくつかありますが、それらはすべて既存の変数を渡す必要があるようです。これらの変数は関数によって変更され、ファイルハンドルが含まれます。IPC::Open3の概要からの例を次に示します。

my ($wtr, $rdr, $err);
use Symbol 'gensym'; $err = gensym;
$pid = open3($wtr, $rdr, $err,
                'some cmd and args', 'optarg', ...);

このパターンを何度も繰り返さなければならないときは、特に面倒です。特に、覚えておくか調べなければならない多数の位置パラメータが含まれているためです。次のように機能する関数 (と呼びましょうmyopen3) を提供するモジュールはありますか?

my ($wtr, $rdr, $err) = myopen3('some cmd and args', 'optarg', ...);

または、関連するハンドルのハッシュまたはハッシュリファレンスを返すこともできます:

my $process = myopen3('some cmd and args', 'optarg', ...);
$process->{STDIN}->print("Some input");
my $output = $process->{STDOUT}->readline;

このような関数の利点は、ビルトインとまったく同じ方法で呼び出されるmyopen3ことです(ただし、いくつかの癖がないことを願っています)。ハッシュまたはハッシュリファレンスを返す場合、位置パラメーターと戻り値が回避されます。(また、モジュールの作成者がプロセスに関する pid やその他の情報も返すことを後で決定した場合、下位互換性を維持しながらそれを行うことができます。)system

私は実際にこれを自分で (単純な OO インターフェースで) 実装しましたが、同じことを行う CPAN モジュールが存在する場合は、自分のカスタム モジュールに依存したくありません。

私がこれまでに見つけた中で最も近いのはIPC::RunSession::Simplereaderで、メソッドでオブジェクトを返しますwriter。ただし、readerメソッドは子プロセスのSTDOUTとSTDERRをマージしますが、それらを分離するオプションが必要です。

4

1 に答える 1

5

自分で書くだけです:

sub myopen3
{
    my ($err, $in, $out);
    my $pid = open3($in, $out, $err, @_);
    return ($pid, $in, $out, $err);
}
于 2010-06-21T18:19:46.000 に答える