2013-07-16 42 views
0

我正在使用文件句柄將某些消息打印到日誌文件。Perl:將消息打印到END塊中的文件句柄

我看到一些日誌消息,但在一個特定的if-else塊中,我有一個exit(1)。 然後執行END塊,其中我想使用在BEGIN塊中打開的Filehandle來打印時間戳。

但是,似乎我在if塊將無法訪問該文件句柄,因爲出口(1)中,我得到的錯誤信息:

print() on closed filehandle 

任何建議,我怎麼可以捕捉在這種情況下,時間戳?

+1

表現出一定的代碼;它是什麼樣的文件句柄?如果它存儲在一個變量中,則至少從聲明中顯示出來打開 – ysth

+0

再次在「END」塊中打開該文件。 – mob

+0

mob,perl自動關閉一個文件句柄,當它碰到出口(1)時?在這種情況下,再次打開文件句柄並打印日誌消息是有意義的。我試圖這樣做,它的工作原理,所以只是想澄清 – iDev

回答

2

END塊更加防禦性編程是很常見的,其中一些內容(文件句柄和其他與系統交互的資源,具有析構函數的對象)可能無法正常工作。該${^GLOBAL_PHASE}變量,或比v5.14.0舊的皮爾斯,在Devel::GlobalDestruction模塊能幫助您:

use Devel::GlobalDestruction; 

sub my_log_function { 
    ... 
    my $msg = add_timestamp_to_message(@msg); 
    if (! print $loghandle $msg) { 
     # who ever checks the return value of print? 
     if (in_global_destruction) { 
      # oh, maybe that explains it 
      open $loghandle, '>>', $the_log_file; 
      print $loghandle $msg; 
      close $loghandle; 
     } 
    } 
}