Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked

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:

# use 5.014; use warnings; my $CleanExit = 0; { package My::ScopeGuard; sub DESTROY { return if $CleanExit; say 'cleaning up'; } } # 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 ""; say "Back in master"' doing something cleaning up 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 (Chancellor) on Jan 29, 2014 at 20:58 UTC

    I've been thinking about this, too, prior to writing my $SIG{__DIE__} answer above.
    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?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1072561]
and the universe expands...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (1)
As of 2018-01-19 23:38 GMT
Find Nodes?
    Voting Booth?
    How did you see in the new year?

    Results (226 votes). Check out past polls.