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 に答える