perl的$ - [0]为非ASCII数据

时间:2016-09-19 05:34:26

标签: regex perl utf-8

考虑文件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。

1 个答案:

答案 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不同的目录中!)