Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 逐行打印_Perl - Fatal编程技术网

Perl 逐行打印

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

我一直在尝试为我的服务器开发一个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(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”
结束,就会立即输出。