Variable will not stay shared in subroutine: "The correct solution is not to declare a named subroutine inside a named subroutine."This sort of comment pisses me off. Nesting and lexical scope are some of the most valuable concepts in programming language design.
'via Blog this'
Just as security has the Principle of Least Privilege, programs should usually take advantage of the Principle of Smallest Scope.
Temporary values should have the smallest scope possible.
Helper functions are just temporary values that happen to be code. It should be possible to define lexically nested functions that are not visible outside the lexical scope.
Perhaps the author of the comment that pissed me off may have meant to be more specific: "Perl's implementation of 'nested subroutines' is misleading, and should not be used because of this possible confusion."
Not least because Perl's 'nested subroutines' are not really lexically nested. Instead, they are (as poster Ovid earlier in the thread before the4 comment that pissed me off says):
[Named] subroutines are entries in the current namespace's symbol table (in a typeglob slot) and this does not allow for nesting. As the docs explain, this can be gotten around by using an anonymous subroutine because these get stuffed in a scratchpad, thus making them lexically scoped.Also, it is quite confusing that 'nested name subroutines' and 'nested anonymous subroutines' have such different behavior.
It is also fair to say that this specificity may have been implied by context. I should not get pissed off so easily.
But on the technical issue, yeah, Perl's funky support for not-really-lexically-nested-named-functions is a piss-off.
I think I am annoyed by this because recently I have writing Python to use pyobjc on my Apple MacBook - and Python does not have lexical scopes apart from functions and modules. So Python does not support the Principle of Smallest Scope. At least up to Python3. Perl mostly supports the Principle of Smallest Scope - except for stupidities like this not-really-lexically-nested-named-functions.