为什么我在Perl脚本中得到“带有错误文件描述符的关闭文件句柄上的print()”?

时间:2012-05-06 23:08:45

标签: perl filehandle

我在perl中有一个tcp服务器(修订版5.0版本8颠覆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]

打开时没有任何错误!

如何解决此问题?

1 个答案:

答案 0 :(得分:3)

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;
}