Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
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.

Replies are listed 'Best First'.
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 romping around the Monastery: (5)
As of 2016-07-28 23:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    What is your favorite alternate name for a (specific) keyboard key?


















    Results (258 votes). Check out past polls.