XML ファイルからのデータを perl で処理していて、FIFO File::Queue を使用して処理を分割してスピードアップしたいと考えています。1 つの perl スクリプトが XML ファイルを解析し、別のスクリプト用に JSON 出力を準備します。
#!/usr/bin/perl -w
binmode STDOUT, ":utf8";
use utf8;
use strict;
use XML::Rules;
use JSON;
use File::Queue;
#do the XML magic: %data contains result
my $q = new File::Queue (File => './importqueue', Mode => 0666);
my $json = new JSON;
my $qItem = $json->allow_nonref->encode(\%data);
$q->enq($qItem);
long%data
に数値と z データのみが含まれている限り、これは正常に機能します。しかし、ワイド文字の 1 つ (例: ł、ą、ś、ż など) が発生すると、次のようになります。Wide character in syswrite at /usr/lib/perl/5.10/IO/Handle.pm line 207.
文字列が有効な utf8 かどうかを確認しようとしました:
print utf8::is_utf8($qItem). ':' . utf8::valid($qItem)
そして私は得ました1:1
-はい、正しいutf8文字列を持っています。
その理由は、syswrite が :utf8 でエンコードされたファイルであることを認識していないキュー ファイルにファイル ハンドラを取得することが原因である可能性があることがわかりました。
私は正しいですか?その場合、File:Queue に :utf8 ファイル ハンドラを強制的に使用させる方法はありますか? File:Queue は最良の選択ではないかもしれません。sth else を使用して、2 つの perl スクリプト間に FIFO キューを作成する必要がありますか?