電子書籍の厳選無料作品が豊富!

今現在Perlの勉強をしているところなのですが、詰まってしまったのでアドバイスをいただきたいです。あるPerlプログラムで作成したファイルを、そのプログラム内でパイプ処理し、その結果を再びそのプログラム内で利用したいと考えています。例えば以下のようなプログラムPは作成可能でしょうか、可能であればその方法を教えていただきたいです。サンプルコードなどがあれば幸いです。

プログラムPの概要
あるファイルを作成する→そのファイルを別のプログラムで実行(結果は○か×を出力)→結果が○であれば再びファイルを作成する、結果が×であればプログラム終了

A 回答 (2件)

表示がくずれるので、空白2文字を全角空白にしていることに注意



use strict;
use warnings;
use autodie;
use IPC::Open3;

open3( my $std_in, my $std_out, my $std_err, 'tr', 'a-z', 'A-Z' )
  or die "open3";

print {$std_in} "hoge hoge\n";
close $std_in;

while (my $line = <$std_out>) {
  print 'Parent : ', $line;
}
close $std_out;

---
$ perl -w pipe_response.pl
Parent : HOGE HOGE
    • good
    • 0

パイプ処理というのは複数のプロセスを標準入力と標準出力で結びつけるものですから、「そのプログラム内でパイプ処理し」という表現は何か変です。

どのプログラムからの出力をどのプログラムが入力として受け取るのかを明確にしましょう。

「結果として○か×を出力する別のプログラム」をQと呼ぶことにします。Qは引数に指定されたファイルFを読み込み、標準出力に結果を出力します。その結果をPで読み取りたいなら、
open(QPROC, "Q F |");
while (<QPROC>) { # Qからの出力を読み込む
 … # 読み込んだ結果を処理する
}
close(QPROC);
という感じでいいはずです。

Qが引数に指定されたファイルを読み込むのではなく、標準入力にファイルFの内容を与えたい場合は上記のopen()のところを
open(QPROC, "Q < F |");
とします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!