0

ASSP (Antispam SMTP Proxy) v2.3.3.13217 (最後の) がインストールされています (Ubuntu Server 13.04 上)。しばらくすると、コンソールで印刷が開始されます。

...
Wide character in print at sub main::mlogWrite line 30
Wide character in print at sub main::mlogWrite line 32
Wide character in print at sub main::mlogWrite line 30
Wide character in print at sub main::mlogWrite line 32
...

等々。

assp.pl のこのサブは次のとおりです。

sub mlogWrite {
    return if $WorkerNumber;
    my @m;
    my $items;
    threads->yield();
    &debugWrite();
    threads->yield;
    $items = $mlogQueue->pending();
    $refreshWait = (time - $lastmlogWrite) > 5 ? 5 : 1;
    return if (! $items);
    threads->yield();
    @m = $mlogQueue->dequeue_nb($items);
    threads->yield();
    my @tosyslog;
    while (@m) {
       my $logline = my $line = de8(shift @m);
       if ($Unidecode2Console) {
           eval{
               $line = Text::Unidecode::unidecode($line);
           } or print "con uni-decoding error: $@";
       } else {
           eval{
               Encode::from_to($line,'UTF-8',$ConsoleCharset,sub { return '?'; })
                   if $ConsoleCharset && $ConsoleCharset !~ /utf-?8/oi;
               1;
           } or print "con encoding error: $@";
       }
       push @tosyslog,substr($line,length($LogDateFormat)) if ($sysLog && ($CanUseSyslog || ($sysLogPort && $sysLogIp)));
       if ($line !~ /\*\*\*assp\&is\%alive\$\$\$/o) {
           print $line unless ($silent);
           w32dbg($line) if ($CanUseWin32Debug);
           print $LOG $logline if ($logfile && $asspLog && fileno($LOG));
           print $LOGBR $logline if ($logfile &&
                                     $asspLog &&
                                     fileno($LOGBR) &&
                                     $ExtraBlockReportLog &&
                                     $logline =~ /\[\s*spam\sfound\s*\]/io);
       }
       if ($logline !~ /page:\/maillog/o) {
           shift @RealTimeLog if (@RealTimeLog > 33);
           push @RealTimeLog, $logline;
           $lastmlogWrite = time;
       }
    }
    tosyslog('info', \@tosyslog) if (@tosyslog && $sysLog && ($CanUseSyslog || ($sysLogPort && $sysLogIp)));
    $MainThreadLoopWait = 1;
} 

大変申し訳ありませんが、私はperlを知りません。ここでエラーはどこにありますか?

完全な assp.pl はhttp://sourceforge.net/projects/assp/files/ASSP%20V2%20multithreading/2.3.3%2013217/ASSP_2.3.3_13217.zipにあります。

4

2 に答える 2

4

このエラーは通常、非 ASCII 文字を予期しないファイルハンドル (STDOUT など) に出力したことを示します。

手っ取り早い修正方法はno warnings 'utf8';、問題のある print ステートメントの上の行に追加することです。適切な解決策は、ファイルハンドルが正しいモードで開かれていることを確認することです。

于 2013-10-03T06:28:35.483 に答える
3

ここでの私の答えは、何が起こっているのかを説明します。

(あなたが受け入れた回答で示唆されているように)警告をオフにするだけでは、非常に良い解決策ではないと思います。出力ファイルハンドルが、使用している出力エンコーディングのデータを予期していることを確認する必要があります。

常に UTF8 出力を扱っている場合、-C コマンドライン スイッチは、標準ファイルハンドル (STDIN、STDOUT、および STDERR) が UTF8 を期待するように設定するための迅速かつ簡単な方法です (詳細については、 perldoc perlrunを参照してください)。$ConsoleCharsetしかし、予想される出力エンコーディングの名前を含む変数が呼び出されているようです。したがって、おそらくbinmode関数を使用して、STDOUT を正しいエンコーディングに設定できます。

binmode STDOUT, ":encoding($ConsoleCharset)";

Perl での文字セットのサポートは、複雑ですが重要な分野です。エラーを無視するだけでは、将来のためにさらに多くの苦痛を蓄積するだけです。

于 2013-10-03T09:50:38.863 に答える