Steve Grazzini wrote: > On Mon, Jul 21, 2003 at 04:40:19PM -0400, Jeff 'japhy' Pinyan wrote: > > On Jul 21, Jeff 'japhy' Pinyan said: > > > > > This is the issue. Why are the $DIGIT variables bound to the > > > block they're in IN TOTALITY, rather than for the life of the > > > execution of the block? > ... > You're explaining this much more clearly than I had done, but let me > jump in again -- > > The magic regex variables *themselves* live forever and don't obey > any scoping rules. They don't have to worry about scope, since as > you said, they don't contain any data. Their values are fetched > dynamically by looking at the "last match" (which is what I've been > calling PL_curpm, which is the dynamically scoped PMOP pointer). > > PL_curpm behaves consistently, although the way it's dynamically > scoped is slightly unusual, as you said. > > But the PMOP doesn't contain any data *either*. It has a pointer > to REGEXP structure, which contains, among other things, the compiled > pattern and what I'll call the "match data". The match data might > include a copy of the target string and offsets for each pair of > capturing parens, and it can be used to calculate the value of $1 > or @- (or a host of other variables) dynamically. > > The problem with this set-up is that PL_curpm is dynamically > scoped, but the REGEXP, which contains the data we're interested in, > isn't.
Aha! (slaps forehead, finally understanding) > > Tying the match data to the compiled pattern (and thence to the > PMOP, for pity's sake) is, arguably, bad design... > > You can also see it misbehaving here: > > my $rx = qr/(...)/; # REGEXP 1 > > "foo" =~ /$rx/; # PMOP 1 / REGEXP 1 > { "bar" =~ /$rx/; } # PMOP 2 / REGEXP 1 > > print $1; # "bar" > > In this one there are two distinct PMOPs (the m// operations) but > only one REGEXP, which is what we've stored in $rx. > > When we print $1 the chain of references looks something like > > $1 -> PL_curpm -> <PMOP #1> -> $rx -> <match data> > > [ Really the PMOP points directly to the REGEXP inside $rx. ] > > And the match data inside $rx comes from the time it matched "bar", > since there's no mechanism for saving and restoring that kind of > thing. > > Anyway, apologies for the blood and perlguts -- Steve and Jeff, thanks for the explanations. Obviously, I underestimated the complexity of the underlying issues :~) -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]