|Just another Perl shrine
Re^3: Variable initialization / reinitializationby gone2015 (Deacon)
|on Feb 07, 2009 at 01:24 UTC
The thing is that you cannot have locally scoped subroutines. All named subroutines are implicitly package level things.
Now, you can declare a named subroutine inside another subroutine. That inner subroutine comes into existence without having to execute the outer subroutine. But, because all named subroutines are all at package level, the inner subroutine can be called from outside the outer one.
So, if the inner subroutine refers to lexical variables belonging to the outer subroutine, Perl has a problem. Those variables notionally don't exist until the outer subroutine is entered. It's a mess, which Perl resolves by inventing new versions of the variables apparently shared by the inner and outer subroutines. Those new versions are effectively outside the inner subroutine -- so behave, as you observed, much like 'C' statics.
is effectively the same as:
(You can declare named subroutines in other blocks, such as inside an eval, which is probably why you can do so in a subroutine. But that's pure speculation.)