迭代Perl中的字符串

时间:2014-06-27 10:11:31

标签: string perl for-loop

我想创建一个逐个输入字符串的脚本

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

sleep()没有做到这一点!它让我等待超过1秒,我立刻得到了全文,没有任何延迟。

3 个答案:

答案 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建议。