我该如何在Perl 5.12中从C语言创建QR码?

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中从字符串创建正则表达式吗?

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);

我也是!新的方式更加合理。 - kris

6
请看hobbs在这个回答中的评论。为了方便阅读,我将其复制如下:
正则表达式对象在5.12.0版本中实际上变得更加“核心”,因为它们现在是对类型为REGEXP的标量的引用,而不是带有魔法的标量的引用。但是,除非您绕过重载的字符串化,否则用户代码完全看不到这一点,如果您注意到正则表达式现在打印为Regexp = REGEXP(0x1234567)而不是Regexp = SCALAR(0x1234567)。
我不太熟悉XS,但我怀疑您不能再使用标量值来创建正则表达式了。

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接