use Sub::ScopeFinalizer qw( scope_finalizer ); { my @undo; my $guard = scope_finalizer { for (reverse(@undo)) { eval { $_->(); 1 } or warn($@); } }; $dbh->do("CREATE DATABASE foo"); push @undo, sub { $dbh->do("DROP DATABASE foo"); }; mkdir("/path/foo") or die(...); push @undo, sub { rmdir "/path/foo" }; ... @undo = (); # Or $guard->disable(); }