【发布时间】:2010-07-22 00:05:54
【问题描述】:
我有一些文本文件,我试图在 Windows 上使用 Perl 脚本对其进行转换。文本文件在 Notepad+ 中看起来很正常,但我脚本中的所有正则表达式都无法匹配。然后我注意到,当我在 NotePad+ 中打开文本文件时,状态栏显示“UCS-2 Little Endia”(原文如此)。我假设这对应于编码 UCS-2LE。所以我在 Perl 中创建了“readFile”和“writeFile”子程序,如下所示:
use PerlIO::encoding;
my $enc = ':encoding(UCS-2LE)';
sub readFile {
my ($fName) = @_;
open my $f, "<$enc", $fName or die "can't read $fName\n";
local $/;
my $txt = <$f>;
close $f;
return $txt;
}
sub writeFile {
my ($fName, $txt) = @_;
open my $f, ">$enc", $fName or die "can't write $fName\n";
print $f $txt;
close $f;
}
my $fName = 'someFile.txt';
my $txt = readFile $fName;
# ... transform $txt using s/// ...
writeFile $fName, $txt;
现在正则表达式匹配(虽然比我预期的要少),但输出包含长字符串,其中穿插着正确文本的长字符串。我的代码错了吗?或者 Notepad+ 的编码可能是错误的?我应该如何进行?
【问题讨论】:
-
提供一些测试数据,额外的 hexdump 是个好主意。显示导致问题的完整代码。如果您不能让我们重现问题,我们只能推测。
-
@daxim:这里的代码相当完整,我无法检查的唯一原因是因为我没有notepad+编辑器可以比较。猜测是 BOM 问题。