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;
...
}