use Scope::Guard qw( ); my %state; { my $backup = freeze(\%state); my $sentinel = Scope::Guard->new(sub { %state = %{ thaw($backup) }; }); $state{a} = ...; push @{$state{b}}, ...; $state{c}{key} = ...; if (success) { $sentinel->dismiss(); } }