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