7

以下代码:

#!/usr/bin/env perl
use utf8;
use strict;
use warnings;
use 5.012; # implicitly turn on feature unicode_strings
my $test = "some string";
$test =~ m/.+\x{2013}/x;

产量:

在 test.pl 第 9 行$test的模式匹配中使用未初始化的值。(m//)

这似乎发生在任何 2 字节字符中\x{}。以下正则表达式工作正常:

/a+\x{2013}/
/.*\x{2013}/
/.+\x{20}/

此外,错误消失了,但不鼓励use bytes使用该编译指示。这里发生了什么?

4

2 回答 2

5

这是一个错误,现在已通过提交 7e0d5ad7c9cdb21b681e611b888acd41d34c4d05 和 c72077c4fff72b66cdde1621c62fb4fd383ce093 在 blead 中修复。此修复程序应在 5.17.5 中可用

于 2012-10-17T04:19:25.163 回答
3

你应该问这个问题是奇异的。我看起来与我昨天刚刚报告的一个错误有关

https://rt.perl.org/rt3/Ticket/Display.html?id=114808

此代码还会产生"Use of uninitialized value $_ in split ..."警告,并导致split意外返回一个空列表:

use warnings;
binmode *STDOUT, ":encoding(UTF-8)";
my $pattern = "\x{abc}\x{def}ghi";
for ( "\x{444}", "norm\x{a0}l", "\x{445}", "ab\x{ccc}de\x{fff}gh" ) {
  print "--------------------\ntext is $_, pattern is /$pattern/\n";

  # expect  split  to return  ($_) , but when $pattern and $_ both
  # have wide chars, it returns  ()
  print 'split output is [', split /$pattern/, $_;

  print "]\n";
}
于 2012-09-10T20:30:14.777 回答