我正在尝试在应用程序中使用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功能的同时允许正则表达式?

最佳答案

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

但是,此模块确实充当词法编译指示,因此您可以轻松限制其作用范围。

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;也在词法范围内。

09-26 01:02