1

次のような perl 関数が組み込まれているか、ライブラリに含まれていますか。

run(IN_FILEHANDLE, OUT_FILEHANDLE, ERR_FILEHANDLE, $cmd);

外部コマンドを IN_FILEHANDLE から読み取り、OUT_FILEHANLE に書き込み、stderr を ERR_FILEHANDLE に取得します。

例えば

run(STDIN, STDOUT, STDERR, $cmd);

次のようになります。

system($cmd);

と:

run(IN, OUT, ERR, $cmd);

次の存在しないバージョンのようになります。

open(IN, OUT, ERR, "|$cmd|");

使いやすくopen($fh, "|$cmd");open($fh, "$cmd|");ファイルハンドルから読み書きするだけです。両方の方法で機能するものが欲しいだけです。

代わりに、オプションでスカラーへの読み取り/書き込みもできる場合のボーナスポイント。

私はopen3andをいじっていましIPC::Runたが、それらを機能させることができないようです。実際の例(おそらく say をgrep使用)をいただければ幸いです。

編集:コメントに応じて、私の現在のコード:

open3($stdin_fh, $stdout_fh, $stderr_fh, $refresh_exec); #1
print "Opened"; #2
print $stdin_fh "Input to command\n"; #3

行番号 2 に到達する前にハングするようです

と使用IPC::Run

start \@cmd_arr, $stdin_fh, $stdout_fh, $stderr_fh;
print "Opened"; #2
print $stdin_fh "Input to command\n"; #3

コマンドを実行しますが、書き込みでエラーが発生します: Can't use an undefined value as a symbol reference.

自分のコードが不完全であることはわかっていますが、400 行のコードを貼り付けたくはありません。コードをうまく切り詰めて問題を切り分けることができれば、質問する必要はありません。

open3自分がやりたいことをするかどうかさえわからないIPC::Runので、構築できる実用的なソリューションを探しています。

4

1 に答える 1

0

私は...するだろう:

  1. STD* を目的の FH にリダイレクトします。
  2. 実行するsystem($cmd);
  3. STD*を元の状態に戻します。

詳細なアプローチについては、ハリの例をご覧ください。

https://stackoverflow.com/a/1720592/1485996

localまた、STD の復元を回避するために使用することもできます。

于 2013-05-02T12:44:19.750 に答える