Due to forgetfulness I was recently bitten by the infamous "my() Scoped
Variable in Nested Subroutines" problem using Apache::Registry, and it got
me thinking about whether it is fixable.
>From the diagnostics:
This problem can usually be solved by making the inner subroutine
anonymous, using the sub {} syntax. When inner anonymous subs that
reference variables in outer subroutines are called or referenced, they
are automatically rebound to the current values of such variables.
I think it should be possible for Registry to pre-process the source code
to turn all top-level named subroutines into sub refs. For example,
convert subroutines of the form
sub foo { <CODE> }
into
sub foo { &{ sub { <CODE> } } }
Are there cases for which this would not work? I have a sneaking suspicion
that I am missing something important. If it is a reasonable solution, I
imagine there are better ways to do this transformation than fancy
regexps? Parse/modify/deparse?
Below is a processed version of the increment_counter example from the
guide that works as expected.
--Chris
#!/usr/bin/perl -w
use strict;
for (1..3){
print "run: [time $_]\n";
run();
}
sub run {
my $counter = 0;
increment_counter();
increment_counter();
sub increment_counter {&{sub{
$counter++;
print "Counter is equal to $counter !\n";
}}}
} # end of sub run