我有这段代码:
#!/usr/local/bin/perl
use strict;
open my $output, ">", "D:\\abc.txt";
for ( my $i = 0; $i < 10; $i++ )
{
print $output $i . "\n";
sleep(5);
}
令人惊讶的是,当我在机器运行的50秒内运行并打开abc.txt时,我看不到当前的输出。我希望在13秒之后,例如,该文件将包含“0 \ n1 \ n2”,但由于某种原因它不会。
我查看了我编写的其他代码片段并实际执行了此操作,但我找不到任何区别。
你能帮帮我吗?
提前谢谢。
答案 0 :(得分:6)
如果您阅读Marc Jason Dominus的文章Suffering from Buffering,您会看到设置$|
适用于当前的文件句柄。如果将$| = 1;
设置在脚本顶部附近,则可能会关闭STDOUT的缓冲。然而,您的脚本正在写入名为$output
的文件句柄。
您应该在open
电话后立即将此行放在您的脚本中。
select( ( select( $output ), $|=1 )[0] ); # borrowed from the Suffering from Buffering article.
这个技巧选择$output
文件句柄,关闭缓冲,然后重新选择最初选择的文件句柄(可能是STDOUT),这样你的脚本的其余部分就不会在不知不觉中使用$ output开始。
perlfaq5中也记录了这一点,它是每个完整Perl安装的标准配置。
作为最佳做法,您可能应该在所有IO调用之后放置or die $!
,或者在脚本顶部放置use autodie;
。我说“可能”因为总有例外,但这不可能是其中之一。