我想处理一个文本文件,其中包含一长串具有以下形式的句子:
<s> Hello world </s>
<s> Ça world </s>
<s> He llo world </s>
<s> H.E.L.L.O world </s>
我想使用Perl(5.22.1)小写每个句子的第一个单词的第一个字母(“Hello” - &gt;“hello”)。我也不想修改缩写(例如A.B.C.)。 我的问题是文件可能包含特殊字符(例如Ç),我认为它们的编码给Perl带来了困难。
该文件采用ISO-8859-1编码。这是我使用的代码:
use strict;
use warnings;
use POSIX qw(locale_h);
use locale;
setlocale(LC_CTYPE, "fr_CA.ISO-8859-1");
while (<STDIN>) {
s/(^<s> +)(\w[^\.\ ][^\ ]*)/
$1.lc($2)
/ge;
print;
}
如果我在cygwin上处理带有该代码的文件(windows 64 -bit),我得到的结果是:
<s> hello world </s>
<s> Ça world </s>
<s> he llo world </s>
<s> H.E.L.L.O world </s>
“Ç”字符仍然是大写字母。
如果我在cygwin上处理它(windows 32 -bit),我得到的结果是:
<s> hello world </s>
<s> ça world </s>
<s> he llo world </s>
<s> H.E.L.L.O world </s>
“Ç”字符现在是小写的。
我希望代码可以在32位和64位窗口上运行 - 并理解它为什么不能正常工作。
答案 0 :(得分:3)
您还需要指定输入和输出的编码。
use open IO => ':encoding(iso-8859-1)', ':std';
您也可以使用
use open IO => ':locale', ':std';
但在这种情况下,您需要在设置open
图层之前在BEGIN块中设置区域设置:
BEGIN { setlocale(LC_CTYPE, "fr_CA.ISO-8859-1"); }