2011-07-27 84 views
2

我有這樣一段代碼:在運行時打印Perl?

#!/usr/local/bin/perl 
use strict; 
open my $output, ">", "D:\\abc.txt"; 
for (my $i = 0; $i < 10; $i++) 
{ 
    print $output $i . "\n"; 
    sleep(5); 
} 

出人意料的是,當我在50秒跑完它和開放的abc.txt機器運行時,我沒有看到的電流輸出。例如,我預計在13秒之後,該文件將包含「0 \ n1 \ n2」,但由於某種原因它不會。

我回顧了我編寫的其他代碼,實際上是這樣做的,但是我找不到任何區別。

你能幫我嗎?

預先感謝您。

+1

此問題已被詢問多次。請在發佈問題之前進行搜索。 – Zaid

+1

[Perl中的睡眠函數]可能的重複(http://stackoverflow.com/questions/6558634/sleep-function-in-perl) – Zaid

+0

對於Windows路徑使用雙反斜槓'\\'的替代方法是正斜槓'/ ':'「D:/abc.txt」'。你也可以考慮''D:\ abc.txt'' – TLP

回答

6

如果您閱讀了Marc Jason Dominus的文章Suffering from Buffering,您會看到設置$|適用於當前文件句柄。如果您在腳本的頂部附近設置了$| = 1;,則可能會關閉STDOUT的緩衝。然而你的腳本正在寫入一個名爲$output的文件句柄。

您應該在open調用之後立即將此行放在腳本中。

select((select($output), $|=1)[0]); # borrowed from the Suffering from Buffering article. 

這一招選擇$output文件句柄,打開緩衝掉,然後重新選擇原先選定的文件句柄(大概是STDOUT),使你的腳本的其餘部分並沒有開始使用$輸出渾然不覺。

這也記錄在perlfaq5,這是每個完整的Perl安裝的標準。

作爲一種最佳實踐,您可能還應該在所有IO調用後放置or die $!,或者在腳本的頂部放置use autodie;。我說'可能',因爲總是有例外,但這不太可能是其中之一。

+0

嗨大衛 - 非常感謝你的回答,那就是問題所在。我很抱歉,我沒有在文章中看到它,我只是在審查它,因爲我認爲它提出了與其他人一樣的解決方案。 我仍然不明白爲什麼,那麼,我沒有把它放在我的其他代碼中... – Amy

+0

沒有看到其他代碼,它只是一個猜測。但是當Perl填滿時,當它們的文件句柄關閉時(包括程序終止時,或者當詞法文件句柄超出作用域時)以及在終端輸出時遇到換行符時,Perl會刷新輸出緩衝區。如果答案奏效,接受。 ;) – DavidO

+0

是的,我意識到遇到換行符時,Perl會刷新 - 這就是爲什麼我在我的問題中發現這個例子很奇怪,因爲它使用了換行符!是的,答案確實有效,我確實接受了。 :-) – Amy