考虑文件y.txt
中的以下输入数据(以UTF-8编码)。
bar
föbar
和一个文件y.pl
,它将两个输入行放入一个数组并处理它们,寻找子串起始位置。
use open qw(:std :utf8);
my @array;
while (<>) {
push @array, $_;
print $-[0] . "\n" if /bar/;
}
# $array[0] = "bar", $array[1] = "föbar"
print $-[0] . "\n" if $array[1] =~ /$array[0]/u;
如果我致电perl y.pl < y.txt
,我会
0
2
3
作为输出。但是,我希望最后一个数字也是2,但由于某种原因,第二个/.../
正则表达式表现不同。我错过了什么?我想这是一个编码问题,但无论我怎么做,我都没有成功。这是Perl 5.18.2。
答案 0 :(得分:2)
这似乎是5.18中的一个错误。
$ 5.18.2t/bin/perl a.pl a
0
2
3
$ 5.20.1t/bin/perl a.pl a
0
2
2
我无法找到解决方法。在您提供的情况下添加utf8::downgrade($array[0]);
或utf8::downgrade($array[0], 1);
,但不使用以下数据或其他内插模式包含字符&gt; 255的其他数据。
♠bar
f♠♠bar
看来这只能通过升级Perl来解决,实际上非常简单。 (请确保按照perl
中的说明将其安装到与系统INSTALL
不同的目录中!)