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

I suspect this behavior is a side effect of using LWP::Simple because output redirects as expected when the get() function call is omitted.

4

2 に答える 2

4

追加

$| = 1;

コードの先頭まで。出力が端末に送信されない場合の自動フラッシュの問題です。

STDOUTが端末の場合、perlは出力を自動フラッシュしますが、STDOUTがたとえば、そのようなパイプである場合

perl print_urls.pl |cat

これはもはやTTYではなく、ファイル操作を最適化するためにベアファイル記述子と自動フラッシュが0に設定されています(各行を書き込んだ後にログファイルをフラッシュしたくないですよね?)

自動フラッシュを無効にしても、出力が表示されます...遅かれ早かれ。通常、バッファは4096バイトであるため、プログラム出力が4097文字に達すると、最初の4096バイトが一度に表示されます。

また、自動フラッシュをグローバルに有効にする方法がない場合は、試してみることもできます

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

それについての詳細は、manperlvarとperldocIO::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 に答える