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

•Re: Re: •Re: sub and anonymous sub

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


in reply to Re: •Re: sub and anonymous sub
in thread sub and anonymous sub

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


Comment on •Re: Re: •Re: sub and anonymous sub
Download Code
Replies are listed 'Best First'.
Re: •Re: Re: •Re: sub and anonymous sub
by dmmiller2k (Chaplain) on Jun 21, 2002 at 22:02 UTC

    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
      Since local works with variables in the symbol table and lexical (my) variables have no symbol table entries, you can't use local on a my variable. For example, this fails:
      perl -e 'my $foo; local $foo'
      with the error:
      Can't localize lexical variable $foo at -e line 1.

      -- Mike

      --
      just,my${.02}

        Hmmm, I seem to recall localizing a hash value within a deeply nested structure, like:

        my $root = { some_object => obj }; $root->{some_object} = new Object; my $arrayref = $root->{some_object}->objectMethodReturningEmbeddedArra +yref(); $arrayref->[0] = 5; { local $arrayref->[0] = 0; # execute some code, which sees 0 not 5 } # now array element is 5 again

        I specifically remember wanting to do something like that in 5.004 and not being able to, having instead to do something like this:

        # ... $arrayref->[0] = 5; # ... { my $lcl = $arrayref->[0]; $arrayref->[0] = 0; # execute some code, which sees 0 not 5 $arrayref->[0] = $lcl; } # now array element is 5 again

        dmm

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (8)
As of 2015-07-31 19:51 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (280 votes), past polls