逐行打印

时间:2016-01-23 21:28:01

标签: perl

我一直在尝试为我的服务器开发一个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秒就能逐行打印歌词。请帮忙吗?

2 个答案:

答案 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";