3

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

4

1 回答 1

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;也是词法范围的。

于 2012-11-26T00:50:12.803 回答