use Sub::ScopeFinalizer qw( scope_finalizer ); sub local_sassign { my $r = \($_[0]); my $sentry = scope_finalizer { $$r = $_[0] } { args => [ $$r ] }; $$r = $_[1]; return $sentry; } sub f { my $sentry = local_sassign $SIG{ALRM}, \&alarm_handler; ... }