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
,但不鼓励使用该编译指示.这里发生了什么?
这是一个错误,现在已通过提交7e0d5ad7c9cdb21b681e611b888acd41d34c4d05和c72077c4fff72b66cdde1621c62fb4fd383ce093修复了blead.此修复程序应在5.17.5中提供
你问这个问题很奇怪。我看起来与我昨天刚刚报告的一个错误有关
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)