我想制作一个脚本,它将逐个输入字符串字母
my $str = 'Test String';
my @spl = split '',$str;
for (@spl){
print "$_";
sleep(1);
}
print "\n";
sleep()
没有完成它的工作!这让我等待超过 1 秒,我立即得到全文,没有任何延迟。
在你的循环中,你只输出 2 个项目。还有一个事实是,您的输出可能会被缓冲,因此只有在发送
\n
时才会刷新和打印缓冲区。
尝试将
$|
设置为非零值,这可能会禁用行缓冲。
例如
$| = 1;
$|++; // alternative often seen
或者,这也可以做同样的事情:
STDOUT->autoflush(1); # Needs "use IO::Handle;" on older versions of Perl
虽然可能不是这里的问题,但
sleep()
并不是等待一秒钟的好方法,尤其是在较旧的系统上。正如手册所述,睡眠时间可能少于或多于 1 秒是有原因的。
放置
use IO::Handle;
STDOUT->autoflush();
在打印之前,禁用输出缓冲(从而首先等待填充缓冲区)。
您正在遭受缓冲之苦。通过提供的链接,您可以看到 Marc Jason Dominus(《Higher-Order Perl》的作者)于 1998 年发表在 The Perl Journal 上的一篇优秀文章。这篇文章可能已经有十多年的历史了,但这个话题在今天仍然和他写这篇文章时一样相关。
根据您的情况,您需要这样做
{
local $| = 1;
for (@spl){
print "$_";
sleep(1);
}
}
或按照mpapec的建议使用
IO::Handle
。