in reply to Re: Re: Finding the right $<*digit*> capture variable
in thread Finding the right $<*digit*> capture variable

I was thinking of taking the sideways route - instrument the ')' part of a '(...)' group so that the contents of @+ is copied elsewhere for safekeeping. Any time that I'm interested in knowing which newly closed group was just passed I'd look for the index of the newly defined value in @+.

So after (a)? $+[1] and $+[2] are undefined. After (b) $+[1] is still undefined but $+[2] is defined (and equal to 2). So... if I can know which @+ entry was just created is that sufficient or will that break as well?

Replies are listed 'Best First'.
Re^4: Finding the right $<*digit*> capture variable
by hv (Prior) on Apr 17, 2003 at 14:29 UTC

    I think you can combine the information from @-, @+ and $^N to get most of the way there:

    sub last_closed { my $last = $+[0]; my $len = length $^N; for (1 .. $#+) { return $_ if defined($+[$_]) && $+[$_] == $last && $+[$_] == $len + $-[$_]; } return undef; } "ad" =~ m{ ( (a) (?{ print last_closed() }) (b)? (?{ print last_closed() }) (c?) (?{ print last_closed() }) d ) (?{ print last_closed() }) }x;

    This assumes a capture has just been closed; if that isn't necessarily the case, $last should instead be calculated as max(@+[1 .. $#+]).

    Obviously this cannot report optional captures that did not capture; also, it can't tell the order of closing of empty strings - "c" =~ /((a*)b*)/ vs "c" =~ /(a*)(b*)/ - but if you are only interested in non-empty captures, I think this code will give the unique answer.

    Hugo