为什么这个带有2字节unicode char的正则表达式会对匹配中的左值发出"未初始化"警告?

Ark*_*kin 7 regex unicode perl

以下代码:

#!/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;
Run Code Online (Sandbox Code Playgroud)

产量:

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

这似乎发生在内部的任何2字节字符\x{}.以下正则表达式正常:

/a+\x{2013}/
/.*\x{2013}/
/.+\x{20}/
Run Code Online (Sandbox Code Playgroud)

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

khw*_*khw 5

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


mob*_*mob 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";
}
Run Code Online (Sandbox Code Playgroud)