使用 sleep 迭代字符串来模拟打字

问题描述 投票:0回答:3

我想制作一个脚本,它将逐个输入字符串字母

my $str = 'Test String';
my @spl = split '',$str;
for (@spl){
    print "$_";
    sleep(1);
}
print "\n";

sleep()
没有完成它的工作!这让我等待超过 1 秒,我立即得到全文,没有任何延迟。

string perl for-loop
3个回答
3
投票

在你的循环中,你只输出 2 个项目。还有一个事实是,您的输出可能会被缓冲,因此只有在发送

\n
时才会刷新和打印缓冲区。

尝试将

$|
设置为非零值,这可能会禁用行缓冲。

例如

$| = 1; 
$|++; // alternative often seen

或者,这也可以做同样的事情:

STDOUT->autoflush(1);    # Needs "use IO::Handle;" on older versions of Perl

虽然可能不是这里的问题,但

sleep()
并不是等待一秒钟的好方法,尤其是在较旧的系统上。正如手册所述,睡眠时间可能少于或超过 1 秒是有原因的。


3
投票

放置

use IO::Handle;
STDOUT->autoflush();

在打印之前,禁用输出缓冲(从而首先等待填充缓冲区)。


2
投票

您正在遭受缓冲之苦。通过提供的链接,您可以看到 Marc Jason Dominus(《Higher-Order Perl》的作者)于 1998 年发表在 The Perl Journal 上的一篇优秀文章。这篇文章可能已经有十多年的历史了,但这个话题在今天仍然和他写这篇文章时一样相关。

根据您的情况,您需要这样做

{
    local $| = 1;
    for (@spl){
         print "$_";
         sleep(1);
    }
}

或按照mpapec的建议使用

IO::Handle

© www.soinside.com 2019 - 2024. All rights reserved.