Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re^3: sub scope question

by ikegami (Pope)
on Feb 07, 2008 at 13:38 UTC ( #666792=note: print w/replies, xml ) Need Help??

in reply to Re^2: sub scope question
in thread sub scope question

You say you get a new instance of $list_ref every time the function is called because my is not merely a declaration like in C. Yet you would get a new instance of local variables every time a function is called in C as well! Consider a re-entrant function, for example.

In fact, as an optimization in Perl, you *don't* get a new instance of my variable every pass unless you do something that forces Perl to create a new variable. That's an implementation detail you shouldn't worry about, though.

As for your suggestion to move my $list_ref, it seems to miss the point that nesting *named* functions has no benefit in Perl. Instead of trying to make the nested named function work, one should look at what one wants to achieve by nesting a named function and look for ways to meet that goal. (local *name = sub { ... }; is the likely answer.)

Replies are listed 'Best First'.
Re^4: sub scope question
by papidave (Pilgrim) on Feb 07, 2008 at 17:36 UTC

    Thank you for the comments on my implementation details; I have improved my wording above. As regards the remainder of your response, I think we both agree that nesting named functions has no benefit in Perl; we differ only in how to resolve it.

    By going with an unnamed function assigned to a local var, you eliminate the "named" part; by moving $list_ref outside the function, you can then also move the named function to main scope, thereby eliminating the "nesting".

    In either case, I favor passing arguments into a subroutine over retention of state information in a closure or any kind of shared variable, because I find it easier to maintain -- but then, TMTOWTDI.

      Making a local variable variable into a semi-global one in order to use it to pass arguments to a function doesn't sound like the right approach to me. For starters, it breaks if the outer function is re-entrant and can break if the inner function is re-entrant, and that's when I normally use nested subs.

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others rifling through the Monastery: (5)
As of 2020-02-28 10:00 GMT
Find Nodes?
    Voting Booth?
    What numbers are you going to focus on primarily in 2020?

    Results (123 votes). Check out past polls.