アプリ版:「スタンプのみでお礼する」機能のリリースについて

子プロセスで"-|"でopenして、そこに標準出力で/usr/bin/grepの実行結果を出力し、そのデータを取得したいです。
$pid = open(FIFO, "-|")をした時点で、$pidにはプロセスIDが入っています(0以外)。
0のときは子プロセスが起動しているのでgrepを実行し、0以外であれば標準出力の内容を取得するというロジックでいいと考えたのですが、一度もgrepが実行されません。
また、grepをexecしているのですが、その第二引数を何にしていいのかも模索中です。
どこをどのように修正したらいいでしょうか。
よろしくお願いします。

die "openエラー: $!" unless defined ($pid = open(FIFO, "-|"));
if(!$pid) {
exec('/usr/bin/grep', '-isl', $search, @list) or die "grepエラー: $!";
} else {
while (<FIFO>) {
print $_;
}
close FIFO;
}

【環境】
WindowsXP Professional(SP2)
Apache2.2
ActivePerl v5.8.8

A 回答 (2件)

質問の例では双方向のやり取りは必要ないので、


#1の tacosan さんの回答の通りで
open my $fd, "grep -isl '$search' @list"or die $!;

とでもすればよいのではないかと。

ついでにいうと、このパターンの場合、Unixのような
fork & exec が必要なので、ActivePerlでは
期待通りに動きません。

というかopenのところで
'-' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

となると思うんですが。

ついでのついでで、三引数バージョンの open ならActivePerlでもいけます。

open my $fifo, "-|", 'grep -e use *.pl' or die;
#open(my $fifo, '-|') || exec 'grep', '-e', 'use', '*.pl';
#↑こっちはダメ
while (<$fifo>) {
print;
}

もし
Perlの標準出力からデータを送る→
プログラムで処理してその標準出力に送る→
Perlで受け取る
ということをやりたいのなら、

IPC::open2 とか IPC::open3 とかつかってください。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
画面で操作して結果を見ているので、openのエラーをうまく拾えていないのかもしれません。そこはログを見てみようと思います。
最終的にはUnix上で動かすので、そのあたりも加味して、IPC::open2、IPC::open3も含めもう一度見直してみようと思います。

お礼日時:2007/09/03 17:25

事情はわからないんですけど, open で直接 grep してはいけないんでしょうか?

    • good
    • 0
この回答へのお礼

回答ありがとうございます。
できるだけ元のソースを活かそうと思ったので、このようになっています。
状況としては、直接grepしても問題ないと思います(が、自信ありません…)。

お礼日時:2007/09/03 17:17

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