This may be missing the mark, because I don't understand your goal; but for the way switch_var is supposed to work, inside of that sub you could tie $w. Then setting it elsewhere in the program automatically sets $r. Based on my rememberance of subroutine prototypes, maybe something like:
sub switch_var (\$$\$) {
my ($reference, $initial, $binding) = @_;
# bind $binding to scalar reference $reference
tie $$binding, 'SomeClass', $reference;
$$binding = $initial;
}
where SomeClass is a simple scalar tied package that implements at least TIE to store $reference and STORE to set
@$reference = ($value) x $something.