package Guard;
sub DESTROY { $_[0]->() };
sub guard (&) {
bless $_[0] => __PACKAGE__
};
Here is the complete program, without that scary XS:
package Guard;
sub DESTROY { $_[0]->() };
package main;
use File::Temp 'tempfile';
sub guard (&) {
bless $_[0] => 'Guard';
};
sub frobnicate {
my ($fh,$name) = tempfile();
print {$fh} "Hello";
close $fh;
my $atexit = guard {
print "Removing '$name'";
unlink $name;
};
my ($fh,$name) = tempfile();
print {$fh} "World";
close $fh;
my $atexit = guard {
print "Removing '$name'";
unlink $name;
};
print "Important processing here";
}
print "Frobnicating";
frobnicate();
print "Frobnicating done, and cleaned up";
__END__
Frobnicating
Important processing here
Removing 'C:\Users\Corion\AppData\Local\Temp\w2guL0aAIx'
Removing 'C:\Users\Corion\AppData\Local\Temp\mtR1B1FxN3'
Frobnicating done, and cleaned up
I think Guard lives in a very similar incarnation in some other module whose name escapes me. Maybe tilly wrote it, and I think another similar one was posted recently on blogs.perl.org.
Update: The blogs.perl.org incarnation is Golang's 'defer' in Perl.
tillys module is ReleaseAction. There also are AtExit, and its SEE ALSO section provides lots of other, similar modules. |