加载Regexp :: Grammars后使用“正常”正则表达式

时间:2012-11-26 00:38:23

标签: regex perl parsing regexp-grammars

我正在尝试在应用程序中使用Regexp::Grammars,但它打破了很多其他正则表达式。例如,以下代码:

$hello = 'hello';
print 'hello 1' if $hello =~ /hello/; #prints "hello 1"
use Regexp::Grammars;
print 'hello 2' if $hello =~ /hello/; #prints nothing

展示我的问题。我不知道如何处理这个问题,除非重复加载和卸载模块,我甚至不确定在使用no显式卸载模块后我可以使用扩展正则表达式。如何在仍然获得Regexp :: Grammars的强大功能的同时允许正常的正则表达式?

1 个答案:

答案 0 :(得分:4)

您无法卸载模块。模块只是一个脚本。卸载模块就是不执行它。

但是,此模块确实充当了词法编纂,因此您可以轻松限制其效果范围。

my $grammar = do {
    use Regexp::Grammars;
    qr{
        ...
    }x;
    # Active here
};
# Not active here

Regexp :: Grammars处于活动状态时创建的语法可用于Regexp :: Grammars未激活的语法,因此只需在定义语法的地方激活Regexp :: Grammars。 (这个模块的界面很差!)

如果你的代码组织不当,你需要在范围内禁用Regexp :: Grammars,那么也可以使用

no Regexp::Grammars;

请注意,效果no Regexp::Grammars;也是词法范围的。