http://www.perlmonks.org?node_id=812950


in reply to Re^5: Regex fun
in thread Regex fun

Thanks for the additional paragraphs.

The OP's supposition implied that variables could be used there. They can't. That's what I said.

That's not how I read

I would assume that quantifier cannot be a '\x' variable
at all—it seems to me specifically to be saying that you can't use a variable there. Do you mean that, since it mentions that you can't use one sort of variable, it implies that you can use others?

Aside from that, did you forget about capture buffers, the return value of the last (?{ }) and Perl variables? There's just no way to access them there.

You certainly can use, at least in the sense of referring to, capture buffers (which I guess means $1 instead of \1?) and Perl variables, like /(.{$1}){$a}/; since their values don't change during the regex match *, the result is the same (as you pointed out) as substituting in their values before running the regex. (Indeed, I think that's exactly what happens internally.) This is just what I meant in Re: Regex fun; so, as I indicated there, I must (still) be misunderstanding you.

UPDATE: To avoid the appearance of slyly avoiding the bit about the return value of the last (?{ }), I didn't forget about it, but only because I never knew about it. Thanks!

Another UPDATE: * Ah, this is probably a crucial point! I always assumed that $1 didn't change until the match had completed; but I guess it's more accurate to say that it does change, but that all the interpolation has already happened at that point, so that change is not reflected in the regex. There's my misunderstanding; sorry!

Replies are listed 'Best First'.
Re^7: Regex fun
by ikegami (Pope) on Dec 16, 2009 at 00:55 UTC

    it seems to me specifically to be saying that you can't use a variable there.

    Then why did the OP say "Can't use a \x variable" instead of "can't use a variable"?

    If I say "The Western sky is orange", doesn't that tell you something about the Eastern sky? At the very least, I'm leaving the possibility of the Eastern sky being a different colour. In fact, it's quite likely it's either a different colour or I don't know it's colour.

    capture buffers (which I guess means $1 instead of \1?)

    I mean "what is captured". Technically, they exist as a reference to the string being matched, a start position and an end position (or something similar).

    $1 and \1 are both windows into them, and so are @-, @+, %-,%+ and $^N.

    since their values don't change during the regex match

    They're not used at all during regex matching. There isn't even a regex opcode to refer to them. The only way they can be accessed is via \1 (etc) and via Perl code blocks ((?{ }) and (??{ }). Neither of those can be used in a quantifier.

    And if they don't change — if you can't even give them a value — how can you consider them variables?