Beefy Boxes and Bandwidth Generously Provided by pair Networks
good chemistry is complicated,
and a little bit messy -LW

Re: Creating Nested Functions

by tilly (Archbishop)
on Jul 10, 2008 at 21:46 UTC ( #696819=note: print w/replies, xml ) Need Help??

in reply to Creating Nested Functions

One problem with using dynamic scoping is that you've opened up the possibility that the same variable could be used somewhere else for a different purpose. That is the advantage to using lexicals.

Another solution is to use ReleaseAction to do cleanup when you exit the sub.

sub outer { my $helper; $helper = sub { ... }; my $delay_cleanup = on_release {$helper = undef}; $helper->(@_); }
Effectively it does the same thing as the weaken solution, but the code is a little more explicit about what is happening, when. I'd personally lean towards this solution.

And a final option. Larry thinks that using dynamic scoping on lexical variables is too confusing to allow. But he does allow it for data structures. Which leads to the convoluted:

sub outer { my @helper; local $helper[0] = sub { ... }; $helper[0]->(@_); }
I wouldn't suggest this solution for fear of the psychopathic maintenance programmer demanding to know why this works. But every year or two I wind up using this fact in a recursive function to detect and track down potential deep recursion bugs. For instance I'm recursing through a set of nodes and I'll do something like this:
{ my %in_node; sub something_recursive { my $node = shift; if ($in_node{$node->{name}}) { confess("Can't access $node->{name} while accessing $node->{name +}"); } local $in_node{$node->{name}} = 1; ... } }

Log In?

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

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (6)
As of 2020-11-27 15:13 GMT
Find Nodes?
    Voting Booth?

    No recent polls found