为什么我会得到;使用错误的文件描述符在关闭的文件句柄上打印();在我的Perl脚本中?

为什么我会得到;使用错误的文件描述符在关闭的文件句柄上打印();在我的Perl脚本中?,perl,filehandle,Perl,Filehandle,我有一个Perl中的TCP服务器(版本5.0版本8 subversion 0),它使用此子例程登录文件 sub logger { return if ($LOGFILE eq "") ; my ($idt, $str) = @_ ; unless( defined($str) ) { $str = $idt ; $idt = '' ; } my ($s,$m,$h,$J,$M,$A) = localtime(time()) ; if(!open(OUT,"

我有一个Perl中的TCP服务器(版本5.0版本8 subversion 0),它使用此子例程登录文件

sub logger {
  return if ($LOGFILE eq "") ;
  my ($idt, $str) = @_ ;
  unless( defined($str) ) {
    $str = $idt ;
    $idt = '' ;
  }
  my ($s,$m,$h,$J,$M,$A) = localtime(time()) ;
  if(!open(OUT,">>$LOGFILE")) {
    warn "logger:error open [$LOGFILE]:[$!]\n";
    return;
  }
  if (!printf OUT "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n",
          $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str) {
    warn "logger:error print [$LOGFILE]:[$!]\n";
    return;
  }
  if (!close(OUT)) {
    warn "logger:error close [$LOGFILE]:[$!]\n";
    return;
  }
}
因此,在这个日志文件中有同步写入。 例外情况下,我在STDERR中有以下错误:

printf() on closed filehandle logger :error print [/my/path/logFile.LOG]:[Bad File Descriptor] 关闭的文件句柄上的printf() 记录器:错误打印[/my/path/logFile.LOG]:[错误的文件描述符] 打开时没有任何错误


如何解决此问题?

OUT
是一个全局包。假设不可能升级到Log4perl等真正的日志系统,您可以使用名为
$out
的词法文件句柄:

sub logger {
    $LOGFILE or return;
    my ($idt, $str) = @_ ;

    unless( defined($str) ) {
        $str = $idt ;
        $idt = '' ;
    }

    my ($s,$m,$h,$J,$M,$A) = localtime(time()) ;

    my $OUT;

    unless (open $OUT, '>>', $LOGFILE) {
        warn "logger:error open [$LOGFILE]:[$!]\n";
        return;
    }

    unless (printf $OUT 
        "%4.4d/%2.2d/%2.2d %2.2d:%2.2d:%2.2d %s %s -> %s\n",
        $A+1900, $M+1, $J, $h, $m, $s, $idt, $HOSTNAME, $str
    ) {
        warn "logger:error print [$LOGFILE]:[$!]\n";
        return;
    }

    unless (close $OUT) {
        warn "logger:error close [$LOGFILE]:[$!]\n";
        return;
    }

    return 1;
}

5.8在5.8.0之后有9个维护版本。您是否尝试升级到5.8.9?(为5.8.0编译的模块可以与5.8.9一起使用。)Perl5.8.0是10年前发布的。即使是5.8.9版本也已经超过3年了。我知道…但我现在不能升级它。在版本5版本10 subversion 1上也是一样