Steve Grazzini wrote: > On Mon, Jul 21, 2003 at 02:18:48PM -0400, Bob Showalter wrote: > > Steve Grazzini wrote: > > > On Mon, Jul 21, 2003 at 10:34:59AM -0400, Jeff 'japhy' > Pinyan wrote: > > > > The documentation states that the $DIGIT variables are set after > > > > each SUCCESSFUL pattern match. > > > > > > The docs also claim that the digit variables will be "dynamically > > > scoped to the current BLOCK", which isn't quite accurate, and is > > > presumably what confused Ed. > > > > The docs are correct. $1 is dynamically scoped to the block. Ed's > > code didn't leave the block, so this dynamic scoping didn't apply. > > [ snip well-behaved example ] > > > Thus, $1 is saved before entry to the block and restored afterward. > > You can't prove that there isn't a bug by showing well-behaved > examples! :-) > > First: the digit variables are supposed to be dynamically scoped, > but really they're not scoped at all. Compare these two examples, > which, according to perlvar, ought to be equivalent.
Where in the world does perldoc perlvar say these should be equivalent? I disagree that these are or should be equivalent. The dynamic scoping behavior of the $1..n variables works the same way that $_ and foreach iterator variables works. > > # local()ized variable ----------------- > > our $x = 0; > > sub F { > local $x = $x + 1; > print $x; > F() if $x<2; > print $x; > } > > F(); # prints "1221" > > > # digit variable ------------------------ > > "0" =~ /(\d)/; > > sub F { > ($1 + 1) =~ /(\d)/; > print $1; > F() if $1<2; > print $1; > } > > F(); # prints "1222" > > Now, you can almost explain this by saying that Perl's notion of the > "last match" is dynamically scoped, and that the digit variables just > refer to captured substrings from the last match. > > [ Which leaves out a crucial part of the explanation, but at least > it's almost correct. ] > > But then there's a second problem: the notional "last match" isn't > scoped to the body of the loop either. > > #-- local()ized variable ------------------ > > our $x = 1; > print $x; > > for (1..3) { > local $x = $x + 1; > print $x; > } > > print $x; # output is "12221" > > #-- digit variable ------------------------ > > "1" =~ /(\d)/; > print $1; > > for (1..3) { > ($1 + 1) =~ /(\d)/; > print $1; > } > > print $1; # output is "12341" > > The actual behavior is more like what you said: the "last match" > is saved before loop entry and restored loop exit. But that's a bit > of a cheat, since everything else that we call "dynamically scoped" > would get saved and restored with each iteration. Uh-uh. $_ and foreach iterators don't behave that way, nor should they. Look at what $_ is doing in that example. $1 is doing the same thing. > > -- > Steve -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]