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);
}
}