考虑文件中的以下输入数据y.txt(以UTF-8编码).
bar
föbar
Run Code Online (Sandbox Code Playgroud)
和一个文件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;
Run Code Online (Sandbox Code Playgroud)
如果我打电话perl y.pl < y.txt,我会
0
2
3
Run Code Online (Sandbox Code Playgroud)
作为输出.但是,我希望最后一个数字也是2,但由于某种原因,第二个正则/.../表达式表现不同.我错过了什么?我想这是一个编码问题,但无论我怎么做,我都没有成功.这是Perl 5.18.2.
这似乎是 5.18 中的一个错误。
\n\n$ 5.18.2t/bin/perl a.pl a\n0\n2\n3\n\n$ 5.20.1t/bin/perl a.pl a\n0\n2\n2\nRun Code Online (Sandbox Code Playgroud)\n\n我找不到解决方法。在您提出的情况下添加utf8::downgrade($array[0]);或,但不使用以下数据或插值模式包含字符> 255的任何其他数据。utf8::downgrade($array[0], 1);
\xe2\x99\xa0bar\nf\xe2\x99\xa0\xe2\x99\xa0bar\nRun Code Online (Sandbox Code Playgroud)\n\n看起来这个问题只能通过升级 Perl 来解决,这实际上很简单。perl(只需确保按照中的说明将其安装到与您的系统不同的目录即可INSTALL!)