2012-08-01 63 views
1

在沒有輸出重定向的情況下運行下面的文件時,輸出如預期。當使用LWP :: Simple和輸出重定向時特有的Perl行爲

輸出

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

當重定向標準輸出到一個文件,沒有被記錄在文件中。

./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 ::簡單,因爲輸出重定向省略了get()函數調用時預期的副作用。

回答

4

添加

$| = 1; 

你的代碼的開頭。當輸出沒有發送到終端時,這是自動刷新問題。

當STDOUT是一個終端,perl的autoflushes輸出,但如果STDOUT是,說,像

perl print_urls.pl |cat 

管它已不再是一個TTY但裸文件描述符和自動沖洗被設置爲0以優化文件操作(你不希望你在寫入每行之後刷新日誌文件,對吧?)

即使禁用了autoflush,你也會看到輸出...遲早。通常緩衝區是4096字節,所以當你的程序輸出達到第4097個字符時,你會看到第一個4096個字節。

此外,如果你做什麼,使自動沖洗全球您也可以嘗試

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

更多閱讀上是人perlvar和的perldoc IO ::處理

+0

謝謝。你能詳細解釋一下嗎? – SemperFly 2012-08-01 20:52:38

+1

@SemperFly更新了我的答案 – s0me0ne 2012-08-01 21:05:32

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