我想创建一个逐个输入字符串的脚本
my $str = 'Test String';
my @spl = split '',$str;
for (@spl){
print "$_";
sleep(1);
}
print "\n";
sleep()
没有做到这一点!它让我等待超过1秒,我立刻得到了全文,没有任何延迟。
答案 0 :(得分:4)
在循环中,您只输出2个项目。还有一个事实是您的输出可能是缓冲的,因此只有在\n
被发送时才刷新和打印缓冲区。
尝试将$|
设置为非零值,这可能会禁用行缓冲。
e.g
$| = 1;
$|++; // alternative often seen
或者,这也是做同样的事情:
STDOUT->autoflush(1); # Needs "use IO::Handle;" on older versions of Perl
尽管这里可能不是问题,但sleep()
并不是等待一秒钟的好方法,尤其是在旧系统上。正如manual所述,有理由认为睡眠时间可能少于或超过1秒。
答案 1 :(得分:3)
把
use IO::Handle;
STDOUT->autoflush();
打印前,禁用输出缓冲(从而等待先填充缓冲区)。
答案 2 :(得分:2)
您是Suffering from Buffering 。所提供的链接将带您阅读大约1998年由Perc Journal撰写的优秀文章,来自Marc Jason Dominus(高阶Perl的作者)。这篇文章可能已有十多年的历史了,但今天的主题和他写这篇文章的时候一样重要。
在你的情况下,你需要做
{
local $| = 1;
for (@spl){
print "$_";
sleep(1);
}
}
或使用IO::Handle
作为mpapec建议。