http://www.perlmonks.org?node_id=176148


in reply to sub and anonymous sub

I'll give you a scarier one:
sub my_sub { local $my_sub_level = $my_sub_level + 1; .. }
Yes, the localization for the variable doesn't happen until the end of the statement, so the value on the right is the previous value (plus one), and it's undone at the end of the block.

-- Randal L. Schwartz, Perl hacker

Replies are listed 'Best First'.
Re: �Re: sub and anonymous sub
by BrowserUk (Patriarch) on Jun 20, 2002 at 21:32 UTC

    Thanks Merlyn, "scarier" is just what I needed:)

    In your example, wouldn't $my_sub_level need to have been declared previously in order to have something to localise?

    From perlsub A local just gives temporary values to global (meaning package) variables. It does not create a local variable.

      I was presuming a global variable was already available. If you have use strict, you'd have to "use vars" the variable, yes.

      Or, just make it a package variable explictly:

      sub my_subroutine { local $main::my_subroutine_level = $main::my_subroutine_level + 1; .... }

      -- Randal L. Schwartz, Perl hacker

        But local also works with lexical variables, doesn't it? IMHO, I didn't think it was necessary for $my_sub_level to be a global, per se. Since perl 5.6 it's been possible to localize nearly any variable; I've localized member variables of class instances, lexicals, arbitrary scalars within complex multi-level structures (hash containing arrayrefs of hashrefs containing hashrefs, etc.).

        Granted, localizing such a thing may (temporarily, subject to the enclosing scope) hide the thing being localized with what is effectively a global, but that's an internal implementation detail that seems to have mattered not, at least with the code in which I've used it.

        To return to the original question, isn't $depth referred to as a closure? Or (perhaps my semantics are incorrect) is sub recurse the closure? Semantics aside, I'm surprised no one mentioned the word.

        dmm

        If you GIVE a man a fish you feed him for a day
        But,
        TEACH him to fish and you feed him for a lifetime
A reply falls below the community's threshold of quality. You may see it by logging in.