Perl:在END块中将消息打印到文件句柄

时间:2013-07-16 18:51:03

标签: perl file exit

我正在使用文件句柄将一些消息打印到日志文件中。

我确实看到了一些日志消息,但在特定的if-else块中,我有一个exit(1)。 然后它执行END块,其中我想使用在BEGIN块中打开的Filehandle打印时间戳。

但是,由于if块中的exit(1),我似乎无法访问该文件句柄,并且收到错误消息:

print() on closed filehandle 

任何建议,如何在这种情况下捕获时间戳?

1 个答案:

答案 0 :(得分:2)

通常为END块进行更具防御性的编程,其中某些内容(文件句柄和与系统交互的其他资源,具有析构函数的对象)可能无法正常工作。 ${^GLOBAL_PHASE}变量,或者对于早于v5.14.0的Perls,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;
        }
    }
}