我正在使用文件句柄将一些消息打印到日志文件中。
我确实看到了一些日志消息,但在特定的if-else块中,我有一个exit(1)
。
然后它执行END块,其中我想使用在BEGIN块中打开的Filehandle打印时间戳。
但是,由于if块中的exit(1),我似乎无法访问该文件句柄,并且收到错误消息:
print() on closed filehandle
任何建议,如何在这种情况下捕获时间戳?
答案 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;
}
}
}