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

Reply via email to