perl的$ - [0]为非ASCII数据产生意外结果

lem*_*erg 9 regex perl utf-8

考虑文件中的以下输入数据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.

ike*_*ami 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

我找不到解决方法。在您提出的情况下添加utf8::downgrade($array[0]);或,但不使用以下数据或插值模式包含字符> 255的任何其他数据。utf8::downgrade($array[0], 1);

\n\n
\xe2\x99\xa0bar\nf\xe2\x99\xa0\xe2\x99\xa0bar\n
Run Code Online (Sandbox Code Playgroud)\n\n

看起来这个问题只能通过升级 Perl 来解决,这实际上很简单。perl(只需确保按照中的说明将其安装到与您的系统不同的目录即可INSTALL!)

\n