2012-05-03 33 views
3

我有一個簡單的打印腳本的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; 
} 

回答

4

您指定要打印字節(: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]/; 
+0

這擺脫了警告,但我寧願(如果可能)文件不打印,如果它沒有正確編碼。我知道這意味着文檔不是PDF格式,因此它具有UTF-8將刪除警告但文件仍然損壞。 – chrstahl89

+0

當我將raw更改爲encoding(utf8)時,我不再收到Wide-char警告,並且輸出仍然是損壞的pdf文件。 – chrstahl89

+0

@ chrstahl89,我偶然上來喜歡2s。再讀一遍:) – ikegami

4

如果你想檢測,如果你的字符串包含寬字符,你可以使用這樣的正則表達式:

/[^\x00-\xFF]/; 

(如池上下面提到的,我的第一個建議是不正常:/[^[:ascii:]]/;將產生誤報)

+0

@ikegami:謝謝,我修改了正則表達式... – sergio

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