2016-09-19 23 views
9

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

在Cygwin下的Perl 5.22.2上,它适用于我。 –

+0

适用于x86_64-linux上的Perl 5.20.1(CentOS 6) –

+0

在v5.22.1下工作正常[Ubuntu 16.04.1 LTS] –

回答

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);作品,但不使用以下数据或其他插值图案包含大于255的字符的其他数据。

♠bar 
f♠♠bar 

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