2

私はそのようなトークンを持っています:

<delim2=((?{ $MATCH{delim} }))>

そして、私がしたいのは、delim2キャプチャしての値に設定することですdelim。これを実行すると、delim2が設定されますが、キャプチャは実行されません。これは私の推論の誤りだと思います:私はこのフォームを連鎖させようとしています:

<ALIAS= ( PATTERN )>     Match pattern, save match in $MATCH{ALIAS}

そしてこの形:この(?{ MATCH{delim} })ようなものに

<ALIAS= ( (?{MATCH{delim}) )>     Matches the value of $MATCH{delim} save to $MATCH{delim2}

しかし、これは単に有効ではないようです。元のトークン<delim2=((?{ die $MATCH{delim} }))>がその値で機能することを確認できます。ハードコーディングすると、適切なキャプチャが取得され、すべてが機能し<delim2=(')>ますか?では、動的なパターンを持ちながら、どのようにして適切な結果を達成するのでしょうか。

4

1 に答える 1

4

(?{ $MATCH{delim} })$MATCH{delim}ここで入力に表示されることを表明しません。それが真の価値であるということだけです。Regexp :: Grammarsにはperlのような「named-backreference」構造\k<NAME>が必要ですが、そうではありません(\k<NAME>Regexp :: Grammarsは結果をまったく異なる場所に格納するため、使用できません)。

あなたは次のようなことをすることができます

(??{ quotemeta $MATCH{delim} })<delim2=(?{ $MATCH{delim} })>

これは恐ろしいことですが、テストでは機能するようです。または、あきらめて、この種のことをより適切にサポートするParse::RecDescentに移動することもできます。または、R::Gでハッキングを開始することもできます。

于 2010-06-16T02:22:34.170 に答える