8

Perlのパイプからバッファリングされていないデータを読み取ろうとしています。たとえば、以下のプログラムでは:

open FILE,"-|","iostat -dx 10 5";
$old=select FILE;
$|=1;
select $old;
$|=1;

foreach $i (<FILE>) {
  print "GOT: $i\n";
}

iostatは10秒ごと(5回)にデータを吐き出します。あなたはこのプログラムが同じことをすることを期待するでしょう。ただし、代わりに50秒間(つまり10x5)ハングしているように見え、その後すべてのデータを吐き出します。

EOFを完全に待たずに、利用可能なデータを(バッファなしで)返すにはどうすればよいですか?

PS私はWindowsでこれについて多くの言及を見てきました-私はLinuxでこれを行っています。

4

4 に答える 4

5
#!/usr/bin/env perl

use strict;
use warnings;



open(PIPE, "iostat -dx 10 1 |")       || die "couldn't start pipe: $!";

while (my $line = <PIPE>) {
    print "Got line number $. from pipe: $line";
}

close(PIPE)                           || die "couldn't close pipe: $! $?";
于 2012-03-09T17:48:01.257 に答える
1

linuxコマンドではなくPerlスクリプトで待機しても問題がない場合は、これでうまくいくはずです。コマンドの実行が完了する前に、LinuxがPerlスクリプトに制御を戻すことはないと思います。

#!/usr/bin/perl -w
my $j=0;
while($j!=5)
{
    open FILE,"-|","iostat -dx 10 1";
    $old=select FILE;
    $|=1;
    select $old;
    $|=1;

    foreach $i (<FILE>)
    {
        print "GOT: $i";
    }
    $j++;
    sleep(5);
}
于 2012-03-09T17:22:12.887 に答える
1

私は私のために働いている以下のコードを持っています

#!/usr/bin/perl
use strict;
use warnings;
open FILE,"-|","iostat -dx 10 5";

while (my $old=<FILE>)
{
  print "GOT: $old\n";
}
于 2012-03-09T17:38:39.240 に答える
1

これまでの解決策は、バッファリング解除(Windows ActiveState Perl 5.10)に関しては機能しませんでした。

http://perldoc.perl.org/PerlIO.htmlによると、「バッファリングされていないストリームを取得するには、オープンコールでバッファリングされていないレイヤ(例:unix)を指定します:」。

それで

open(PIPE, '-|:unix', 'iostat -dx 10 1') or die "couldn't start pipe: $!";

while (my $line = <PIPE>) {
    print "Got $line";
}

close(PIPE);

私の場合はうまくいきました。

于 2013-02-08T20:46:54.100 に答える