Лучший способ - использовать Log :: Log4perl , чтобы вам не приходилось об этом думать и вы могли сосредоточиться на своей реальной задаче.
Помимо этого, вы можетеИспользуйте некоторые приемы для файлов и файловых дескрипторов, которые мы рассмотрим в Эффективное программирование на Perl .К счастью для вас, это также бесплатная глава , которую выдает наш издатель.
Короче говоря, вы не хотите думать об этом в своей процедуре регистрации.Это беспорядок.Вместо этого создайте метод, который либо возвращает кэшированный дескриптор файла, либо открывает его (это очень похоже на метод, который вы использовали бы для проверки связи с дескриптором базы данных и при необходимости переподключения):
sub log_msg {
my( $self, $msg, $name ) = @_;
print { $self->get_fh_by_name( $name ) } $msg;
}
BEGIN { # to define variables before the subroutine
my %log_fhs;
sub get_fh_by_name {
my( $self, $name ) = @_;
return $log_fhs{$name} if defined $log_fhs{$name};
open my $log_fh, catdir( $base_dir, $name ) or croak "...";
print $logfh ...
$log_fhs{$name} = $log_fh;
}
}