package My::Guard; use strict; sub new { bless $_[1] => $_[0]; }; sub DESTROY { $_[0]->() }; #### #!perl -w package My::Guard; use strict; sub new { bless $_[1] => $_[0]; }; sub DESTROY { $_[0]->() }; package main; use strict; sub alias {\@_}; sub localize { my @values = @{ +pop }; # or any other convenient method my $aliases=alias(@_); my @saved= @_; #warn Dumper \@saved; $_[$_] = $values[$_] for 0..$#values; My::Guard->new(sub{ $aliases->[$_]=$saved[$_] for 0..$#saved; }) }; my ($a,$b)=('a','b'); print "Start\n"; print qq($a $b),"\n"; my $restore=localize($a,$b,['foo','bar']); print "Localized\n"; print qq($a $b),"\n"; undef $restore; print "Restored\n"; print qq($a $b), "\n";