String 在Perl中迭代字符串

String 在Perl中迭代字符串,string,perl,for-loop,String,Perl,For Loop,我想做一个脚本,它将一个接一个地键入字符串字母 my $str = 'Test String'; my @spl = split '',$str; for (@spl){ print "$_"; sleep(1); } print "\n"; sleep()!这让我等了超过1秒钟,我立即得到了全文,没有任何延迟。在您的循环中,您只输出了2项。还有一个事实是,您的输出可能会被缓冲,因此只有当\n被发送时才会刷新和打印缓冲区 尝试将$|设置为非零值,这可能会禁用行缓冲 e、 g 或

我想做一个脚本,它将一个接一个地键入字符串字母

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

sleep()!这让我等了超过1秒钟,我立即得到了全文,没有任何延迟。

在您的循环中,您只输出了2项。还有一个事实是,您的输出可能会被缓冲,因此只有当
\n
被发送时才会刷新和打印缓冲区

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

e、 g

或者,这做同样的事情:

STDOUT->autoflush(1);    # Needs "use IO::Handle;" on older versions of Perl
虽然这里可能不是问题所在,
sleep()
不是等待一秒钟的好方法,尤其是在较旧的系统上。如前所述,睡眠时间可能少于或超过1秒是有原因的。

use IO::Handle;
STDOUT->autoflush();
在打印之前,禁用输出缓冲(并因此等待首先填充缓冲)。

您就是。提供的链接将带您访问大约1998年Perl期刊上Marc Jason Dominus(Higher Order Perl的作者)的一篇优秀文章。这篇文章可能已经有十多年的历史了,但今天的主题和他写这篇文章时一样重要

在你的情况下,你需要这样做

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

或者按照mpapec的建议使用
IO::Handle

睡眠可能不需要一秒钟-在这种情况下,
Sleep(1)
调用可能需要非常接近1秒的时间来执行。这是一个完美的方式等待现代系统。这里的问题是输出缓冲。我同意我已经编辑了我的答案来淡化这一点,但我仍然认为应该提到它。如果你使用更现代、更容易理解的
STDOUT->autoflush(1)
,我会对这一点进行升级;请尝试使用该选项。@LeoNerd TMTOWTDI-必须停止输入模糊的PERL竞争:-)
{
    local $| = 1;
    for (@spl){
         print "$_";
         sleep(1);
    }
}