首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从C在Perl5.12中创建一个qr//?

如何从C在Perl5.12中创建一个qr//?
EN

Stack Overflow用户
提问于 2010-04-22 02:16:46
回答 3查看 368关注 0票数 14

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

代码语言:javascript
复制
# running "print Dumper($regex)"
$VAR1 = bless( do{\(my $o = '')}, 'Regexp' );

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

代码语言:javascript
复制
# running "print Dumper(qr/foo/i)"
$VAR1 = qr/(?i-xsm:foo)/;

我的代码基本上是:

代码语言:javascript
复制
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中正确地从字符串创建正则表达式吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-04-22 03:21:50

谢谢你们让我走上正轨,伙计们,事实证明我想得太多了。他们只是切断了魔法线,并没有创造出PV。

这就是您在Perl 5.12中需要做的全部工作:

代码语言:javascript
复制
REGEXP *rx = re_compile(pattern, flags);
SV *regex = newRV((SV*)rx);

stash = gv_stashpv("Regexp", 0);
sv_bless(regex, stash);
票数 12
EN

Stack Overflow用户

发布于 2010-04-22 02:40:11

看看霍布斯在this answer中的评论。为了便于阅读,我在下面复制了一份:

在5.12.0中,REGEXP对象实际上获得了更多的“核心”,因为它们现在是对

类型的标量的引用,而不是使用魔法对标量的引用。但是,这对于用户代码是完全不可见的,除非您设法绕过重载的字符串化,在这种情况下,您会注意到正则表达式现在打印为Regexp=REGEXP(0x1234567)而不是Regexp=SCALAR(0x1234567)

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

票数 6
EN

Stack Overflow用户

发布于 2010-04-22 02:42:44

Perl 5.12 changed regexps to be first class objects,这是How do I check if a scalar has a compiled regex it in?中切题讨论的一部分。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2685477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档