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

Posted

技术标签:

【中文标题】如何在 Perl 5.12 中从 C 创建一个 qr//?【英文标题】:How can I create a qr// in Perl 5.12 from C? 【发布时间】:2010-04-21 18:16:46 【问题描述】:

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

【问题讨论】:

【参考方案1】:

感谢你们让我走上正轨,伙计们,事实证明我是在认真考虑这件事。他们只是切断了魔法线,并没有创建 PV。

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

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

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

【讨论】:

我也是!新方式更有意义。【参考方案2】:

看看 hobbs 的this 回答中的 cmets。为了便于阅读,我将其复制在下面:

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

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

【讨论】:

【参考方案3】:

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”会显示他们对核心模块所做的修复以使用新内容。

【讨论】:

以上是关于如何在 Perl 5.12 中从 C 创建一个 qr//?的主要内容,如果未能解决你的问题,请参考以下文章

如何创建带有列标题的表格视图(5.12)?

如何在 Perl 中从 telnet 屏幕抓取输出?

如何在 Perl 中从 HTML 中提取 URL 和链接文本?

在 Python 中从 CSV 文件创建混合图表

在 Python 中从 CSV 文件创建混合图表

Perl 语言的联想