use strict; use warnings; BEGIN { package Testing; use Tie::Scalar qw( ); BEGIN { our @ISA = qw(Tie::StdScalar); } sub STORE { my ($self, $val) = @_; print("STORE ", defined($val) ? "[$val]" : 'undef', "\n"); shift->SUPER::STORE(@_) } } { our $s; tie $s, 'Testing'; { print("pre\n"); local $s; print("post\n"); } print("\n"); { print("pre\n"); local $s = 'a'; print("post\n"); } } #### pre STORE undef # local post STORE undef # local unroll pre STORE undef # local STORE [a] # assignment post STORE undef # local unroll #### 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; ... }