2015-11-19 38 views
4

沖洗輸出我在Perl以下兩行:可以強制Perl

print "Warning: this will overwrite existing files. Continue? [y/N]: \n"; 
my $input = <STDIN>; 

的問題是,Perl腳本暫停輸入之前打印線沒有得到執行。也就是說,perl腳本似乎無限期停止,原因不明。我猜測輸出是以某種方式緩衝的(這就是爲什麼我把\ n放入,但似乎沒有幫助)。我對perl相當陌生,所以如果能解決這個問題,我將不勝感激。

回答

15

默認情況下,STDOUT在連接到終端時進行行緩衝(由LF刷新),而在連接到除終端以外的其他設備時進行塊緩衝(在緩衝區滿時刷新)。此外,<STDIN>在連接到終端時會刷新STDOUT。

這意味着

  • STDOUT未連接到一個終端,
  • 不打印到STDOUT,或
  • STDOUT一直弄亂用。

print打印到目前select版手柄時沒有手柄提供的,因此下面的工作,無論使用上述的哪個是正確的:

# Execute after the print. 
# Flush the currently selected handle. 
# Needs "use IO::Handle;" in older versions of Perl. 
select()->flush(); 

# Execute anytime before the <STDIN>. 
# Causes the currently selected handle to be flushed after every print. 
$| = 1; 
+0

這是一個很好的答案,注意你也可以爲特定的句柄設置autoflush'STDERR-> autoflush(1);' – andlrc

5

有幾種方法可以打開自動沖洗:在開始

$|++; 

,或者也有BEGIN塊:

BEGIN{ $| = 1; } 

然而,這似乎是不尋常的東西與你的配置,因爲通常一個\n在最後觸發沖洗(至少是終端)。