Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何从C在Perl 5.12中创建qr//?_Regex_Perl_Xs_Qr Operator - Fatal编程技术网

Regex 如何从C在Perl 5.12中创建qr//?

Regex 如何从C在Perl 5.12中创建qr//?,regex,perl,xs,qr-operator,Regex,Perl,Xs,Qr Operator,这在5.8和5.10中对我有效,但在5.12中,我的代码创建了一个奇怪的非qr对象: # running "print Dumper($regex)" $VAR1 = bless( do{\(my $o = '')}, 'Regexp' ); 而打印不是由我的代码创建的qr//看起来如下所示: # running "print Dumper(qr/foo/i)" $VAR1 = qr/(?i-xsm:foo)/; 我的代码基本上是: REGEXP *rx = re_compile(patte

这在5.8和5.10中对我有效,但在5.12中,我的代码创建了一个奇怪的非qr对象:

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );
而打印不是由我的代码创建的qr//看起来如下所示:

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;
我的代码基本上是:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = sv_2mortal(newSVpv("",0));

sv_magic(regex, (SV*)rx, PERL_MAGIC_qr, 0, 0);

stash = gv_stashpv("Regexp", 0);
sv_bless(newRV((SV*)regex), stash);

有人知道如何从5.12中的字符串正确创建正则表达式吗?

看看霍布斯在回答中的注释。为了便于阅读,我将其复制到下面:

在5.12.0中,Regex对象实际上得到了更多的“核心”,因为它们现在是对REGEXP类型标量的引用,而不是对magic类型标量的引用。但是,这对于用户代码来说是完全不可见的,除非您设法绕过重载字符串化,在这种情况下,您会注意到正则表达式现在打印为Regexp=Regexp(0x1234567),而不是Regexp=SCALAR(0x1234567)

我对XS不是特别熟悉,但我怀疑您不能再使用标量值来创建正则表达式了。

,您可以在中的切线讨论中找到它


我不是XS人员,所以我不知道需要对代码进行哪些更改才能使其正常工作。在perl源代码中搜索“REGEXP”显示了他们为使用新东西而对核心模块所做的修复。

谢谢你们让我走上正轨,伙计们,事实证明我真的想得太多了。他们只是切断了魔线,而不是创造PV

在Perl 5.12中,您只需执行以下操作:

REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);

我也是!这种新方式更有意义。