1

在没有输出重定向的情况下运行以下文件时,输出符合预期。

输出

./get_urls.pl
www.site1.com
www.site2.com
www.siten.com

将 STDOUT 重定向到文件时,文件中不会记录任何内容。

./get_urls.pl > out
cat out

-

#!/usr/bin/perl

use LWP::Simple;
use strict;
use warnings;

my $i = 1;

while (my $contents = get("http://www.validpage.com?page=$i"))
{
        #print STDERR $contents."\n".$url."\n";

        #print STDERR $i."\n";

        my @matches = ($contents =~ /_full'>(.*)?</g);

        for my $match (@matches)
        {
                $match =~ s/\s//g;
                print $match."\n";
        }

        $i++;
}

print STDERR "$i total matches.\n";

我怀疑这种行为是使用 LWP::Simple 的副作用,因为当 get() 函数调用被省略时,输出会按预期重定向。

4

2 回答 2

4

添加

$| = 1;

到代码的开头。当输出未发送到终端时,这是自动刷新问题。

当 STDOUT 是终端时,perl 会自动刷新输出,但如果 STDOUT 是这样的管道

perl print_urls.pl |cat

它不再是 TTY,而是一个裸文件描述符,并且 autoflush 设置为 0 以优化文件操作(您不希望在写入每一行后刷新日志文件,对吗?)

即使禁用了自动刷新,您也会看到输出......迟早。通常缓冲区为 4096 字节,因此当您的程序输出达到第 4097 个字符时,您将立即看到前 4096 个字节。

另外,如果您没有全局启用自动刷新的功能,您也可以尝试

use IO::Handle;
STDOUT->autoflush(1);

更多的阅读是 man perlvar 和 perldoc IO::Handle

于 2012-08-01T20:46:56.297 回答
0

您的输出应该真正显示

www.site1.com
www.site2.com
www.siten.com
3 total matches.

尝试重定向附加到输出文件

$ perl ./get_urls.pl >> out.log 2>> err.log
$ cat out.log
于 2012-08-01T20:41:41.833 回答