Beefy Boxes and Bandwidth Generously Provided by pair Networks Bob
Do you know where your variables are?
 
PerlMonks  

•Re: sub and anonymous sub

by merlyn (Sage)
on Jun 20, 2002 at 20:35 UTC ( #176148=note: print w/ replies, xml ) Need Help??


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


Comment on •Re: sub and anonymous sub
Download Code
Re: •Re: sub and anonymous sub
by BrowserUk (Pope) 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
Re: Re: sub and anonymous sub
by stefp (Vicar) on Jun 27, 2002 at 19:20 UTC
    I am not sure it is valuable to teach odd tricks that are likely to disappear with perl6.

    -- stefp -- check out TeXmacs wiki

      An odd response.
      1. Perl6 is still at least 18 months away from being available for other than "early adopters".
      2. This trick works fine in Perl6, if you change local to temp, which the P5toP6 translator will do for you.
      3. Perl5 will remain alive for at least a few years even after Perl6 comes around.

      -- Randal L. Schwartz, Perl hacker

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://176148]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (11)
As of 2014-04-17 18:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    April first is:







    Results (453 votes), past polls