2011-07-21 7 views
3
[[email protected] test]# perl -e 'use re "debug";"a" =~ /.*/'; 
Compiling REx `.*' 
size 3 Got 28 bytes for offset annotations. 
first at 2 
    1: STAR(3) 
    2: REG_ANY(0) 
    3: END(0) 
anchored(MBOL) implicit minlen 0 
Offsets: [3] 
    2[1] 1[1] 3[0] 
Matching REx ".*" against "a" 
    Setting an EVAL scope, savestack=3 
    0 <> <a>    | 1: STAR 
          REG_ANY can match 1 times out of 2147483647... 
    Setting an EVAL scope, savestack=3 
    1 <a> <>    | 3: END 
Match successful! 
Freeing REx: `".*"'` 

誰でもこれを解釈できますか?デバッグをオンにしたときのre.pmの出力をどのように理解していますか?

答えて

6

出力には、パターンのコンパイルとランタイムマッチングの2つの重要な部分があります。

最初の部分は、コンパイルされたオートマトンに3つのノードが記述されています。

  • STAR(n)マッチゼロ以上の次のノードのノードNまで続きます。
  • REG_ANY改行以外の任意の文字(すなわち/./
  • ENDはオートマトンの終了状態をマークに一致します。

MBOL試合開始-線の複数行マッチモードで、即ち/^/m。これは暗黙のうちにパターンの冒頭に.*があるためです。

パターンに一致する文字列の最小長はゼロまたは空の文字列です(覚えておいてください。 (注意:常にが成功した*数量詞を!)

オフセットは、プログラム内の正規表現にフォーム

NODENUM:POSITION[LENGTH] 

とリンクノードです。あなたの場合、.*(ノード2と1)はパターンの最初の位置から始まり、終わりの状態は暗黙的にそこにあります。正規表現デバッガに便利なオフセット、、現在どのサブパターンが一致しているかを強調表示します。

これでコンパイルされ、マッチすることができ、後者は実行をトレースします。 Pragmas and Debugging section of the perlretut documentationマッチ進捗を記述する行の形態を説明:

各ステップは<x>マッチした文字列と<y>まだマッチしていない部分の一部と、フォームn <x> <y>です。

あなたの質問で試合が消費なしのテキストで始まり、その後、.*aと一致し、パターンが正常に一致します。

evalスコープは、使用しないexecutable code in regexesに関連する機械です。

Debugging Regular Expressions section of the perldebguts documentationは、より多くの背景情報を提供しています。いつものように、Luke!

+0

私たちが出力から得ることができるのは、正規表現が右端から解釈されるということだけです。そこには他に何か役立つものがありますか? –

関連する問題