- ベストアンサー
system で実行したプログラムの標準出力を変数で受け取りたい
実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
コマンドの出力結果は、コマンドをバッククォートで囲むだけで得られます。 $result = `A`; ちなみに、プログラムAの出力が複数行になる場合、 @result = `A`; とすれば行ごとのデータを受け取れ、 $result = `A`; だと各行が連結された1つの文字列として受け取れます。 また、open でパイプを使い、 open CMD_A, "A |" or die $!; while (<CMD_A>) { print $_; } close CMD_A; のように処理することもできます。
その他の回答 (1)
詳しいやり方が分からなくて申し訳ないんですが、Aを呼ぶ際の出力先 STDOUT の出力を、ファイル入力として取り込めるようにすれば可能じゃないかと思います。 こういうのを「パイプを繋ぎなおす」といいます。 そういったキーワードで調査してみてください。 たしか Perl でもできたハズです。 (でももしかしたら無理かも……(^_^;)
お礼
ありがとうございます deagle さんのおっしゃっていることの実装が leaz024 さんの open する際に パイプを付加して open する例なのかなと理解しました。 「パイプを繋ぎなおす」という観点はこれからのスクリプト作成にかなり役立ってくれそうです。 ありがとうございました。
お礼
ありがとうございます。 教えていただいたコマンド入力演算子の形での実装に目処が立ちました。 助かりました。