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