2011-04-17 101 views
4

我有以下代码来打印“。”每秒钟模拟一个进度条。当使用Sleep()时Perl打印功能无法正常工作

$num = 15; 
while($num--){ 
    sleep(1); 
    print "."; 
} 

我现在面临的问题是“。”每个循环后都不打印字符。相反,所有15个“。”在循环退出后立即打印。但是,如果我打印“。\ n”,它工作正常。但是“。”每次都会印上新的一行,这不是我想要的。

这似乎很奇怪,不知道为什么。任何人都可以提供帮助吗?谢谢。

问候, 阿伦

回答

20

这可能是因为I/O被缓冲。尝试禁用缓冲(自动刷新):

$| = 1; 

在循环之前。

更完整的解释,请参阅How do I flush/unbuffer an output filehandle? Why must I do this?

+0

谢谢Mat,这个作品很棒!我将阅读你推荐的文章。回答我的问题的速度让我感到惊讶。我希望今晚晚上睡觉前能得到答案。 – Allen 2011-04-17 12:05:43

1

标准输出流通常是缓冲。尝试在每个打印语句后清空输出流。请参阅Perl Cookbook, §7.13以获取详细的解释和解决方案。

+0

感谢您的解释Philip。缓冲确实是问题。 – Allen 2011-04-17 12:08:14

+1

请不要链接到盗版内容 – ysth 2011-04-18 04:51:36

4

您需要在标准输出禁用缓冲。请参阅$| in perlfaq

+0

谢谢@aschepler,禁用令人讨厌的,它工作正常。 – Allen 2011-04-17 12:07:21

+1

应该始终在每个Perl脚本的顶部禁用排错。 – mob 2011-04-18 03:34:03