Используя Perl Regexp :: Grammars, как сделать захват зависимым от $ MATCH? - PullRequest
2 голосов
/ 15 июня 2010

У меня есть токен, подобный следующему:

<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=(')>?Итак, как мне добиться разумных результатов, имея динамический паттерн?

1 Ответ

4 голосов
/ 16 июня 2010

(?{ $MATCH{delim} }) не утверждает, что $MATCH{delim} появляется здесь во входных данных;только то, что это истинная ценность.Regexp :: Grammars должен иметь конструкцию named-backreference, такую ​​как perl \k<NAME>, но это не так (и вы не можете использовать \k<NAME>, потому что Regexp :: Grammars хранит свои результаты где-то совершенно иначе).1006 * Вы можете сделать что-то вроде

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

, что ужасно, но, похоже, работает в тестировании.Или вы могли бы сдаться и перейти к Parse :: RecDescent, который имеет лучшую поддержку для такого рода вещей.Или вы можете начать взламывать R :: G.

...