4

このツールを使用しようとしています。(Perl版)しかし、推奨コマンドを使って実行しようとするとperl bin/SWOG.pl --input=examples/simple.swog --toPng=simple、次の警告が表示されます(use diagnostics修正方法に光を当てることを期待して追加されました)

Variable "$np" will not stay shared at (re_eval 8) line 2 (#1)

(W Closure) 内側の (ネストされた) 名前付きサブルーチンが、外側の名前付きサブルーチンで定義されたレキシカル変数を参照しています。

内側のサブルーチンが呼び出されると、外側のサブルーチンの変数の値が、外側のサブルーチンへの最初の 呼び出しの前と呼び出し中に表示されます。この場合、外側のサブルーチンへの最初の呼び出しが完了すると、内側と外側のサブルーチンは変数の共通の値を共有しなくなります。つまり、変数は共有されなくなります。

この問題は通常、sub {} 構文を使用して内部サブルーチンを匿名にすることで解決できます。外側のサブルーチン内の変数を参照する内側の匿名サブルーチンが作成されると、それらはそのような変数の現在の値に自動的に再バインドされます。

Google: linkに対してデューデリジェンスを行いましたが、私の場合にこれを適用する方法がまだわかりません。

また、この問題の原因となっているコード スニペットのソースに戻りました。簡単に参照できるように、スニペットを再度以下に示します。

    # parentheses balance pattern
    # @ http://www.unix.org.ua/orelly/perl/prog3/ch05_10.htm
    $np= qr{
       \(
       (
       (?:
          (?> [^()]+ )    # Non-parens without backtracking
        |
          (??{ $np })     # Group with matching parens
       )*
       )                    
       \)
    }x;

私は、$npこの同じ変数の定義内でネストされて$npいることがこの警告を引き起こしていると考えています。

助けてください。ありがとう!

4

1 に答える 1

5

あなたは次のようなものを持っています

sub f {
   my $np;
   $np = qr/...(??{ $np }).../;
}

(??{...})パターンがコンパイルされると、レキシカルが取り込まれます。

あなたの場合、パターンは一定であるため、それ自体がコンパイルqr//されるときに正規表現パターンがコンパイルされます。qr//残念ながら、$np関数が実行されるたびに新しいが作成されます。

レキシカル変数を避けることで問題を解決できます。

sub f {
   local our $np;
   $np = qr/...(??{ $np }).../;
   ... /$np/ ...
}

または、パターンを変数にすることにより、qr// の実行時に正規表現パターンを強制的にコンパイルします。

sub f {
   my $var = '';
   my $np;
   $np = qr/...(??{ $np })...$var/;
   ... /$np/ ...
}

しかしqr//、一定のパターンに対して繰り返し実行するのはなぜでしょうか? 最善の解決策は、パターンをサブから移動することです。

my $np;
$np = qr/...(??{ $np }).../;

sub f {
   ... /$np/ ...
}
于 2013-10-18T16:21:08.407 に答える