Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling

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]
[james28909]: Good morning!
[james28909]: I have a problem I am trying to solve. I am packaging scripts using pdk and would like the verify the executable name each time it is executed
[Corion]: Hi James!
[james28909]: I looked through the docs, and see that PerlApp::exe() is suppose to return this information but whenever i try to use this, i get the error "Undefined subroutine &PerlApp::exe called"
[james28909]: i just want to verify the integrity of the executables name each time it is run.
[Corion]: Weird. this documentation says what you say.
[Corion]: I assume you are experiencing this with your packaged program. Maybe also include in the packaging list?
[james28909]: has anyone else run into this problem? i have tried searching but have not returned many results
[james28909]: ah, good idea.

How do I use this? | Other CB clients
Other Users?
Others having an uproarious good time at the Monastery: (10)
As of 2017-07-28 13:47 GMT
Find Nodes?
    Voting Booth?
    I came, I saw, I ...

    Results (429 votes). Check out past polls.