Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
PerlMonks  

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

by dmmiller2k (Chaplain)
on Jun 21, 2002 at 22:02 UTC ( #176414=note: print w/replies, xml ) Need Help??


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

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

Replies are listed 'Best First'.
Re: Re: •Re: Re: •Re: sub and anonymous sub
by thelenm (Vicar) on Jun 21, 2002 at 22:08 UTC
    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
Domain Nodelet?
Node Status?
node history
Node Type: note [id://176414]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (4)
As of 2023-09-27 09:39 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?