{
local $tied = 'x';
...
}
####
{
my $restorer = localiser($tied, 'x');
...
}
####
use Sub::ScopeFinalizer qw( scope_finalizer );
sub localiser {
my $var_ref = \$_[0];
my $saved = $$var_ref;
$$var_ref = $_[1];
return scope_finalizer { $$var_ref = $saved };
}
####
use strict;
use warnings;
use Sub::ScopeFinalizer qw( scope_finalizer );
{
package Tied;
use Tie::Scalar;
our @ISA = qw( Tie::StdScalar );
sub FETCH { return ${ $_[0] }++ }
}
sub localiser {
my $var_ref = \$_[0];
my $saved = $$var_ref;
$$var_ref = $_[1];
return scope_finalizer { $$var_ref = $saved };
}
{
tie our $tied_pkg, 'Tied';
$tied_pkg = 'a';
print $tied_pkg; # a
{
local $tied_pkg = 'x';
print $tied_pkg; # x
print $tied_pkg; # y
print $tied_pkg; # z
}
print $tied_pkg; # b
print $tied_pkg; # c
print "\n";
}
{
tie my $tied_lex, 'Tied';
$tied_lex = 'a';
print $tied_lex; # a
{
my $restorer = localiser($tied_lex, 'x');
print $tied_lex; # x
print $tied_lex; # y
print $tied_lex; # z
}
print $tied_lex; # b
print $tied_lex; # c
print "\n";
}
####
axyzbc
axyzbc