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

时间:2012-05-03 18:42:06

标签: perl

我有一个简单的打印脚本

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 个答案:

答案 0 :(得分: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]/;

答案 1 :(得分:5)

如果要检测字符串是否包含宽字符,可以使用这样的正则表达式:

/[^\x00-\xFF]/;

(正如ikegami在下面提到的,我的第一个建议不合适:/[^[:ascii:]]/;会产生误报)

答案 2 :(得分: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";
}