2013-07-16 41 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; 
     } 
    } 
}