0

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

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

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

print() on closed filehandle 

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

4

1 回答 1

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;
        }
    }
}
于 2013-07-16T19:27:00.353 回答