in reply to Re: Backref in a regex quantifier
in thread Backref in a regex quantifier

...it's likely better not to use anything that exotic in production code.

You're absolutely right, and I probably should've added a "still experimental" warning. (In fact, I wouldn't use it myself, if my well-being depended on it :)  OTOH, if people never really use those more exotic features (and report bugs, if found!), they'll remain experimental forever...

As to the original problem, does anyone know if backrefs are supposed to work within the {} quantifier, or not? (In the docs, I couldn't find anything explicit either way.)  I can well imagine that it's non-trivial to implement, but as the OP said, it doesn't seem too far off to attempt to use them that way, in particular as they do work outside of the quantifier.

Replies are listed 'Best First'.
Re^3: Backref in a regex quantifier
by RMGir (Prior) on Jul 09, 2007 at 18:55 UTC
    does anyone know if backrefs are supposed to work within the {} quantifier, or not?

    Good question.

    My guess would be that they're not supposed to work -- text matched in a backreference is matched textually, without metacharacters. So doing /^(.)\1$/ won't match a wildcard as a second character if the first is a literal ".", and won't match one or more "+" if the first character is a literal "+".

    Keeping to that pattern, it makes sense that if a backreference appears between {}, what's parsed is a literal "{", the backreference, and a literal "}".

    It would obviously complicate regexen something fierce if the possibility of recompiling the regex based on backreferences had to be handled in the general case, and not just in the ??{} case.


    Mike
      All these problems are the fallout from the design mistake of considering regexen to be strings. In Perl 6 they are not strings, but merely programs in a specialized language that doesn't have to understand backreferences because it can get by with understanding variables, which include variables bound to earlier matches. Thus in Perl 6 you can just say
      / (\d+) x**{$0} /
      to do this very naturally. Also note that no recompilation of the closure returning the repeat count need be done here, since the closure is also real program and compiled only once. The only thing that changes is the binding of $0. (The numbered captures start at 0 rather than 1 in Perl 6 for consistency with the array view of the same data.)