# Re: Recursion and \${*digit*} variables

On Fri, 14 Aug 2009 16:17:32 -0700 (PDT), "C.DeRykus" <derykus@xxxxxxxxx> wrote:

On Aug 14, 2:46 pm, "C.DeRykus" <dery...@xxxxxxxxx> wrote:
On Aug 14, 11:49 am, Mark <goo...@xxxxxxxxxxxxxxxx> wrote:

It appears that new \${*digit*} variables are not created when the same
subroutine is re-entered.  Is this to be expected?

use strict ;
use warnings;

my \$line = 'abc';
doit();
exit;

sub doit {
#   local(\$1);  # adding this doesn't appear to have an effect
\$line =~ /(.)/ || die "no match";
print "bef \\$1  =\$1\n";

\$line = substr(\$line,1);
doit() if length(\$line);

my \$thing = \$1; # WRONG! \$1 has been changed by recursive call to
doit()

print "aft \\$1  =\$1\n";

}

Output:
bef \$1  =a
bef \$1  =b
bef \$1  =c
aft \$1  =c
aft \$1  =c
aft \$1  =c

Expected output:
bef \$1  =a
bef \$1  =b
bef \$1  =c
aft \$1  =c
aft \$1  =b
aft \$1  =a

No, this came up in a recent thread. Even if a match fails
within a given scope, a previously successful backref isn't
cleared:

my \$s='a';
for (1..2){
print \$s=~/(.)/ ? "match:\$1" : "no match:\$1";
\$s=substr(\$s,1);}

__END__

match:a
no match:a

Just to expand that explanation a bit more:

sub doit {
\$line =~ /(.)/ || die "no match";

print "bef \\$1 =\$1\n"; # matches succeed initially
\$line = substr(\$line,1); # as \$line gets emptied
doit() if length(\$line); # and doit() recurses
my \$thing = \$1; # WRONG! ..

print "aft \\$1 =\$1\n";
}

By the time the recursion starts to unwind, \$line has
been drained and the match fails. Because the final "c"
matched successfully though, \$1 doesn't get cleared.
So you see the trailing series of "c" printed.

Matching had nothing to do with why his \$1 contained 'c'
when the stack unwound.

The reason is he keeps reenterring the same scope block.
In terms of N vars, there is only one scope block so
the N vars keep thier last state.

N var state is not stacked, it only has scope.

-sln

.