如果出现宽字符错误,Perl 停止打印

3
我有一个简单的打印脚本。
my $pdf_data = $agent->content;
open my $ofh, '>:raw', "test.pdf"
or die "Could not write: $!";
print {$ofh} $pdf_data;
close $ofh;

有时我会收到“宽字符警告”,我知道为什么会收到这个警告,希望能够取消打印而不是打印失败。类似于:
if(wideCharWarning)
{
delete "test.pdf"
}
else{
print {$ofh} $pdf_data;
}
3个回答

6
如果您想检测字符串中是否包含宽字符,您可以使用这样的正则表达式:
/[^\x00-\xFF]/;

(正如ikegami在下面指出的那样,我的第一个建议是不正确的:/ [^[:ascii:]] /;会产生错误的结果)

5

您指定了要打印字节 (:raw),但实际上并没有。

$ perl -we'
   open(my $fh, ">:raw", "file") or die $!;
   for (0..258) {
      print "$_\n";
      print $fh chr($_);
   }
'
...
249
250
251
252
253
254
255
256
Wide character in print at -e line 5.
257
Wide character in print at -e line 5.
258
Wide character in print at -e line 5.

要“取消打印”,您只需检查所打印的内容不包含非字节即可。
die if $to_print =~ /[^\x00-\xFF]/;

这样可以消除警告,但如果可能的话,我宁愿文档在未正确编码时不打印。我知道这意味着文档不是pdf格式,因此将其编码为UTF-8将消除警告,但文件仍然是损坏的。 - chrstahl89
当我将原始文件更改为编码(utf8)时,不再收到宽字符警告,输出仍然是损坏的PDF文件。 - chrstahl89
@chrstahl89,我不小心把它关闭了大约2秒钟。请再读一遍 :) - ikegami

1
你可以设置一个__WARN__信号处理程序,并根据警告消息执行任何你想要的操作。
my $wideCharWarningsIssued = 0;
$SIG{__WARN__} = sub {
    $wideCharWarningsIssued += "@_" =~ /Wide character in .../;
    CORE::warn(@_);     # call the builtin warn as usual
};

print {$ofh} $data;
if ($wideCharWarningsIssued) {
    print "Never mind\n";
    close $ofh;
    unlink "test.pdf";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接