3

2 つのファイルを比較する単純な Perl スクリプトがあります。結果 UTF8 BOM エンコーディングで別のファイルに書き込みます。テキストを BOM ファイルに保存するには、chr(65279) を結果ファイルの先頭に出力します。場合によっては、入力テキストの先頭に既に BOM char が含まれていて、スクリプトがもう 1 つ出力することがあります。

問題は、この BOM 文字を 2 回印刷しないように回避するにはどうすればよいかということです。

私のPerlのコードの下のテキストを参照してください:

use strict;
use warnings;
use List::Compare;
use Cwd 'abs_path';
use open ':encoding(utf8)';
use open IO => ':encoding(utf8)';

open F, "<$ARGV[0]" or die $!;
open S, "<$ARGV[1]" or die $!;
my @a=<F>;
my @b=<S>;
close F;
close S;

my $lc = List::Compare->new(\@a, \@b);

my @intersection = $lc->get_intersection;
my @missing = $lc->get_unique;
my @extra = $lc->get_complement;

open EXTRA, ">".$ARGV[2]."file_extra.txt" or die("Unable to open the file");
open MISSING, ">".$ARGV[2]."file_missing.txt" or die("Unable to open the file");
open SUBTRACTED, ">".$ARGV[2]."file_subtr.txt" or die("Unable to open the file");

#Turn on UTF-8 BOM support
print EXTRA chr(65279);
print MISSING chr(65279);
print SUBTRACTED chr(65279);

print MISSING @missing;
print EXTRA @extra;
print SUBTRACTED @intersection;

close MISSING;
close EXTRA;
close SUBTRACTED;
4

2 に答える 2

4

ファイルの内容を読み取っているときにそれを取り除き(あなたの例では and に適用されます)s/^\x{FEFF}//、本当に必要な場合は、結果が出力されたときに出力の前に追加しますが、役に立たないので、まったく印刷しないでください。 UTF-8 の場合。$a[0]$b[0]print

于 2012-09-16T14:19:12.500 に答える
1

BOM が 2 つある場合、これはおそらく入力から 1 つの BOM が生成されるためです。したがって、処理する前に入力をクリーンアップする必要があります。

s/^\x{FEFF}/ for $a[0], $b[0];

于 2014-06-09T23:47:52.227 に答える