如何在C中用Perl 5.12创建qr?

kri*_*ina 14 regex perl xs qr-operator

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

# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );
Run Code Online (Sandbox Code Playgroud)

打印qr //不是由我的代码创建的,如下所示:

# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;
Run Code Online (Sandbox Code Playgroud)

我的代码基本上是:

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

任何人都知道如何从5.12中的字符串正确创建一个正则表达式?

kri*_*ina 12

谢谢你让我走上了正确的轨道,伙计们,事实证明我是在严肃地过度思考这个问题.他们只是切断了魔术线而没有创造PV.

这就是你需要在Perl 5.12中做的所有事情:

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

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
Run Code Online (Sandbox Code Playgroud)


Rob*_*t P 6

看看hobbs 在这个答案中的评论.为了便于阅读,我在下面复制了它:

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

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


bri*_*foy 5

Perl 5.12将regexp改为第一类对象,你会发现这是一个切向讨论的一部分,如何检查标量是否有一个已编译的正则表达式?.

我不是XS人员,因此我不知道您需要在代码中进行哪些更改才能使其成功.在perl源中搜索'REGEXP'显示了他们对核心模块所做的修复以使用新的东西.