今天在我大学里老师问我一个问题。他在纸上写了这段代码,并说
“这段代码的输出是什么?”
“这段代码的输出是什么?”
use warnings; for (1 .. 20) { print "."; }
我发现它很容易,并说它将循环20次,并且在每次迭代它将打印一个点(。),因此总共20个点将是输出。
use warnings; for (1 .. 20) { print "."; sleep 1; }
他说现在的产量是什么?我不知道睡眠功能,我猜想在每次迭代时会打印点(。),然后等待1秒(因为睡眠功能),然后再次迭代,然后再次打印(。)然后它会等待1秒钟等等…
老师告诉我在家检查。我在家里试过,我知道第二个代码等待了20秒,然后一次打印所有的点(20点)。我想知道这是怎么回事?为什么每次迭代都不会打印点(。)?
解决方法
真正的问题与睡眠无关,而是…………
你是Suffering from Buffering.提供的链接让你从1998年的“Perl Journal”出自Marc Jason Dominus(高级Perl的作者)的一篇很好的文章。这篇文章可能已经十多年了,但是这个话题与他写的时候一样有关。
其他人解释了$ | = 1;技术。我会补充说,在Perl社区的主要思想中,似乎是$ | = 1优于$ |只是因为它的意思更清楚。我知道,自动增量也是非常简单的,但是当应用或 – (而不是在perlvar中查找)时,每个将会看到你的代码的人都知道$ |的行为。我也喜欢本地化Perl的“特殊变量”的任何修改,使得效果不会被清理成其他部分的代码,可能不会很好地对默认的Perl行为进行特定更改。所以就这样,我会把它写成:
use strict; use warnings; { local $| = 1; for ( 1 .. 20 ) { print '.'; sleep 1; } }