Поскольку вопрос стоит, этого не может быть. perlre говорит об этом
Обратите внимание, что группы захвата, совпадающие внутри рекурсии, недоступны после возврата рекурсии, поэтому необходим дополнительный слой групп захвата.
, но шаблон <x>
нельзя получить с «дополнительным слоем» захвата, поскольку он используется только внутри грамматики.У вас может быть только целое
if ($command =~ /
move\s+ (?<match>(?&commands))
(?(DEFINE)
(?<coord> (?<x>\d+)\s+(?<y>\d+) )
(?<map> (?<mapname>[a-zA-Z]+) )
(?<commands> \s* (?: (?&coord) | (?&map) ) \s* (?&commands)? )
)
/six)
{
say "got: $+{match}";
}
, куда я переместил блок ?(DEFINED)
в конце шаблона, как рекомендовано.
Обратите внимание, что это не имеет смыслалибо: в рекурсивном совпадении какой из нескольких <x>
должен быть получен?Таким образом, вам нужно реструктурировать подход, чтобы иметь возможность перехватить нужный вам матч;но я не понимаю, как это сделать, если вы хотите, чтобы подшаблон был похоронен так глубоко.
Для поставленной задачи я бы пошел с написанием простого синтаксического анализатора, не говоря уже о регулярном выражении, охватывающем все.Или, в вашем подходе, повторно обработайте совпадение для его частей, надеюсь, намного проще, когда он у вас есть.
А затем есть мощные инструменты, такие как Marpa :: R2 , Parse :: RecDescent , Regexp :: Грамматика .