0

詳しく説明しましょう。

私はperlプログラムを持っているとしましょう

(これは恥知らずに perl http://perldoc.perl.org/perlfaq8.html#How-can-I-open-a-pipe-both-to-and-from-a-command%3fからコピーおよび編集されたものです )

 use IPC::Open3;

 use Symbol qw(gensym);   

 use IO::File;
 local *CATCHOUT = IO::File->new_tmpfile;
 local *CATCHERR = IO::File->new_tmpfile;

 my $pid = open3(gensym, ">&CATCHOUT", ">&CATCHERR", "ping -t localhost");

 #waitpid($pid, 0);   

seek $_, 0, 0 for \*CATCHOUT, \*CATCHERR;

 while( <CATCHOUT> ) {

print $_;
}

しかし、上記のプログラムの問題は、この場合、プログラム ping.exe に属する STDOUT の一種の readtoEnd() になり、すべてを一度に読み取れるようになることです。

しかし、私ができるようにしたいのは、STDOUT に書き出されているときに STDOUT を読み取ることです。

waitforpid() を削除すると、プログラムはすぐに終了するため、どちらも役に立ちません。

それは可能ですか?もしそうなら、正しい方向に向けてください。

更新:ドラッツ!!!! 私は逃した | シンボル...これは、出力をpingからperlスクリプトにパイプするために不可欠です!!!

4

2 に答える 2

3
use IPC::Open3 qw( open3 );

open(local *CHILD_STDIN, '<', '/dev/null') or die $!;

my $pid = open3(
   '<&CHILD_STDIN',
   my $child stdout,
   '>&STDERR',
   'ping', '-t', 'localhost',
);

while (<$child_stdout>) {
   chomp;
   print("Got: <<<$_>>>\n");
}

waitpid($pid, 0);

しかし、それは次のように書くことができます

open(my $ping_fh, '-|', 'ping', '-t', 'localhost') or die $!;

while (<$ping_fh>) {
   chomp;
   print("Got: <<<$_>>>\n");
}

close($ping_fh);

これは、適切な使用法を示しているだけです。これらが機能しない場合、それは無関係の問題ですping。端末に接続されていないときに IO をバッファリングしています。疑似 tty を使用してだますことができます。

于 2013-01-23T09:34:39.063 に答える
2

perl の長所 (または短所) の 1 つは、物事を行う方法が複数あることです。これは機能します:

perl -e 'open(F,"ping localhost|"); while(<F>) { s/ms/Milliseconds/; print $_; }'

s/ms/Milliseconds/ を入力して、データが読み取られて変更されていることを示すだけです Open3 のどこが間違っているのか正確にはわかりません

于 2013-01-23T09:11:07.377 に答える