我想在不等待执行结束的情况下实时修改程序的输出。
例如我有这个程序: speak.pl
#!/usr/bin/env perl
use 5.010;
use Time::HiRes qw( usleep );
for(1..10) {
say "I am counting: $_";
usleep(100000);
}
这一个: wrapper.pl :
#!/usr/bin/env perl
print "You are saying: $_\n" while(<>);
执行此命令时:
./speak.pl | ./wrapper.pl
不幸的是,在 speak.pl 终止执行之前没有任何事情发生。有没有办法在执行期间修改 speak.pl 的输出数据?
我也试过传递一个中间文件:
./speak.pl > tmp & ./read.pl tmp
有了这个:
#!/usr/bin/env perl
use 5.010;
use File::Tail;
my $file=File::Tail->new(name=>$ARGV[0], maxinterval=>300, adjustafter=>7);
while (defined(my $line=$file->read)) {
print "You're saying: $line";
}
但是再次看来输出文件只在执行结束时写入。
任何线索?
P.S。我在Cygwin上运行我希望它没有任何区别。
答案 0 :(得分:2)
可能与缓冲有关。数据在通过管道发送之前存储到一定大小(或在执行结束时刷新)。
尝试使用usig stdbuf -i0 -o0 -e0 ./speak.pl | stdbuf -i0 -o0 -e0 ./wrapper.pl
禁用缓冲。
当您使用perl时,请考虑this link禁用perl自己的缓冲机制。