我有以下Perl代码:
STDOUT->autoflush(1);
foreach(...)
{
...
foreach(...)
{
print("Processing $folder");
$|=1;
process($folder);
}
...
}
但是print语句仅在循环的第一次迭代中起作用,并且在此之后不会打印任何内容。知道为什么吗?
编辑:我找到了原因并在答案中添加了它。 解决方案是:我在里面添加了以下内容 循环,它工作:
选择STDOUT;
我认为process()函数中的代码 应该一直在修改默认值 输出缓冲区。这是一个代码 其他人!
我不确定这是不是问题 与Perl允许这个或者 开发人员没有改变它 到默认值。
最终代码如下所示:
foreach(...) { ... foreach(...) { select STDOUT; print("Processing $folder"); $|=1; process($folder); } ... }
谢谢大家......
答案 0 :(得分:11)
追踪这个问题的好侦探工作!
我想建议一个替代解决方案。
您可以使用IO::Handle界面与STDOUT进行select()
战争,而不是与process()
作者进行use IO::Handle;
foreach(...)
{
...
foreach(...)
{
STDOUT->printflush("Processing $folder");
process($folder);
}
...
}
战争:
{{1}}
答案 1 :(得分:5)
我在循环中添加了以下行,它起作用了:
select STDOUT;
我认为process()函数中的代码应该一直在修改默认的输出缓冲区。这是别人写的代码!
我不确定这是否是Perl的一个问题,它允许这个或开发人员没有将其更改回默认值。
最终代码如下所示:
foreach(...)
{
...
foreach(...)
{
select STDOUT;
print("Processing $folder");
$|=1;
process($folder);
}
...
}
谢谢大家......
答案 2 :(得分:0)
我的代码如下所示:
#!/usr/bin/perl -w
use strict;
use warnings;
use sigtrap qw/handler signal_handler normal-signals/;
use feature qw(say);
my $datetime;
$datetime = localtime ();
say "tester started $datetime";
while ( 1 ) {
select STDOUT;
$datetime = localtime ();
say "tester output every second $datetime";
$|=1;
sleep ( 1 );
}
sub signal_handler {
die "\nCaught a signal $!\n";
}