14

这在 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 中的字符串正确创建正则表达式?

4

3 回答 3

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);
于 2010-04-21T19:21:49.717 回答
6

看看霍布斯在这个答案中的评论。为了便于阅读,我将其复制在下面:

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

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

于 2010-04-21T18:40:11.210 回答
5

Perl 5.12 将 regexps 更改为 first class objects,您可以在How do I check if a scalar has a compiler regex it in?.

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

于 2010-04-21T18:42:44.197 回答