【问题标题】:perl's $-[0] produces unexpected results for non-ASCII dataperl 的 $-[0] 对非 ASCII 数据产生意外结果
【发布时间】:2016-09-19 05:34:25
【问题描述】:

考虑文件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 &lt; y.txt,我会得到

0
2
3

作为输出。但是,我希望最后一个数字也是 2,但由于某种原因,第二个 /.../ 正则表达式的行为不同。我错过了什么?我想这是一个编码问题,但无论我尝试了什么,我都没有成功。这是 Perl 5.18.2。

【问题讨论】:

  • 在 Cygwin 下的 Perl 5.22.2 上它适用于我。
  • 在 x86_64-linux (CentOS 6) 上的 Perl 5.20.1 上工作
  • 在 v5.22.1 [Ubuntu 16.04.1 LTS] 下工作正常
  • 感谢测试。所以这似乎是 5.18.2 中的一个错误......糟糕......任何想法如何优雅地规避这个问题?

标签: regex perl utf-8


【解决方案1】:

这似乎是 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 不同的目录!)

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多