Converting "sub foo" into "local *foo = sub" won't work when the function
is called before is declared, because the local only works for the rest
of the block, not the entire block. i.e. you can't do
foo();
local *foo = sub {
...
};
Plus, I think you usually need the trailing semicolon anyway.
--Chris
On Wed, 16 Aug 2000, Dan Campbell wrote:
> [EMAIL PROTECTED] wrote:
> >
> > 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> } } }
> [snip]
>
> I think it would be easier to convert
>
> sub foo
>
> into
>
> local *foo = sub
>
>
> That way, you don't have to parse for the matching right brace.
> Something like:
>
> s/sub\s+(\w+)/local *\1 = sub/msg; # untested - just a guess
>
> might do the trick.
>
> --
> Dan Campbell
>