我一直在尝试为我的服务器开发一个lyrical bot,但在我开始研究它之前,我想给它一个测试,所以我用Lyrics :: Fetcher模块想出了这个脚本
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秒就能逐行打印歌词。请帮忙吗?
答案 0 :(得分:5)
您对split
的电话看起来很可疑。特别是正则表达式"\n\r"
。请注意,split的第一个参数始终被解释为正则表达式,无论您是否提供带引号的字符串。
在Unix系统上,行结尾通常为"\n"
。在DOS / Windows上它是"\r\n"
(与你所拥有的相反)。在古老的Mac上它是"\r"
。要匹配所有你可以做的:
my @lines = split(/\r\n|\n|\r/, $lyrics);
答案 1 :(得分:3)
您需要启用autoflush
,否则当缓冲区已满或程序终止时,这些行将被缓冲并打印
STDOUT->autoflush;
您可以使用正则表达式通用换行符模式\R
拆分任何行结尾,无论您的数据是否包含CR,LF或CR LF。此功能仅在Perl v5.10或更高版本中可用
my @lines = split /\R/, $lyrics;
您需要在每行歌词之后打印换行符,因为split
会删除它们
print $line, "\n";