Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

Re: Execute function before exit of do() block

by moritz (Cardinal)
on Jan 29, 2014 at 19:04 UTC ( #1072561=note: print w/ replies, xml ) Need Help??


in reply to Execute function before exit of do() block

One technique you can use is a "scope guard"; an object which goes out of scope when a scope is exited. When it goes out of scope, its reference count drops to zero and its DESTROY method is called:

# slave.pl: use 5.014; use warnings; my $CleanExit = 0; { package My::ScopeGuard; sub DESTROY { return if $CleanExit; say 'cleaning up slave.pl'; } } # this is the object that will go out of scope my $guard = bless {}, 'My::ScopeGuard'; say 'doing something'; die "Oh Noez"; # or if everything works fine: $CleanExit = 1;

Now we can test it likes this:

$ perl -wE 'do "slave.pl"; say "Back in master"' doing something cleaning up slave.pl Back in master

You can see that the cleanup happens before the the rest of the calling code.


Comment on Re: Execute function before exit of do() block
Select or Download Code
Re^2: Execute function before exit of do() block
by shmem (Canon) on Jan 29, 2014 at 20:58 UTC

    I've been thinking about this, too, prior to writing my $SIG{__DIE__} answer above.
    *sigh*
    Creating a sentinel object... slowly, the objectification creeps on every subject...

    perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

      Well, in Perl 6 there are are non-object options, like a LEAVE block that is called on every scope exit, or an UNDO block for unsuccessful scope exists.

      I wonder if those are possible (and worthy) to backport to perl 5...

        Maybe that could be done in a cheap way overriding eval. Brrr... just as I am writing this, overriding eval feels very evil... ;-)

        perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'
      You could use clear or free magic if you wanted to avoid objects.

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others taking refuge in the Monastery: (13)
As of 2015-07-06 12:54 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 (74 votes), past polls