Perl 逐行打印
我一直在尝试为我的服务器开发一个Lyric bot,但在开始开发之前,我想对它进行一次测试,所以我使用Lyris::Fetcher模块设计了这个脚本Perl 逐行打印,perl,Perl,我一直在尝试为我的服务器开发一个Lyric bot,但在开始开发之前,我想对它进行一次测试,所以我使用Lyris::Fetcher模块设计了这个脚本 use strict; use warnings; use Lyrics::Fetcher; my ($artist, $song) = ('Coldplay', 'Adventures Of A Lifetime'); my $lyrics = Lyrics::Fetcher->fetch($artist, $song, [qw(Ly
use strict;
use warnings;
use Lyrics::Fetcher;
my ($artist, $song) = ('Coldplay', 'Adventures Of A Lifetime');
my $lyrics = Lyrics::Fetcher->fetch($artist, $song, [qw(LyricWiki AstraWeb)]);
my @lines = split("\n\r", $lyrics);
foreach my $line (@lines) {
sleep(10);
print $line;
}
这个脚本工作得很好,它抓取歌词并整体打印出来(这不是我想要的)
我希望能每10秒打印一行一行的歌词。请帮忙?您拨打的
split
电话看起来可疑。特别是正则表达式“\n\r”
。注意,无论是否提供带引号的字符串,到的第一个参数始终被解释为正则表达式
在Unix系统上,行尾通常是“\n”
。在DOS/Windows上,它是“\r\n”
(与您拥有的相反)。在古代的Mac电脑上,它是“\r”
。要匹配您可以执行的所有操作:
my @lines = split(/\r\n|\n|\r/, $lyrics);
您需要启用
autoflush
,否则当缓冲区已满或程序终止时,行将被缓冲并打印
STDOUT->autoflush;
您可以使用正则表达式通用换行符模式\R
在任何行尾进行拆分,无论您的数据包含CR、LF或CR LF。此功能仅在PerlV5.10或更高版本中可用
my @lines = split /\R/, $lyrics;
你需要在每一行歌词后打印一个换行符,因为拆分将删除它们
print $line, "\n";
或者split/[\r\n]+/
或者split/\r/
是的,[\r\n]+
版本对于空行显然有不同的行为,但这可能更适合OP。我不知道\R
。不管怎样,STDOUT不是一个TTY有效地自动刷新(每次打印输出)吗?@GrantMcLean:不,只有STDERR是由默认值自动刷新的。我重新读取了$的文档,我想我使用了错误的术语。它说TTY的标准输出通常是行缓冲的——这就是我的意思。只要打印以“\n”
结束,就会立即输出。