sub name { my $arg = ref $_[0] ? $_[0] : \do{my $anon = $_[0]}; # Do stuff. $$arg =~ s/^un//; return $$arg; } #### sub name { our $arg; local *arg = ref($_[0]) ? $_[0] : \do{my $anon = $_[0]}; # Do stuff. $arg =~ s/^un//; return $arg; } #### $i = $j = 'unchanged'; name(\$i); print("i:$i\n"); # i:changed $i = $j = 'unchanged'; $j = name($i); print("i:$i, j:$j\n"); # i:unchanged, j:changed $i = $j = 'unchanged'; $j = name(\$i); print("i:$i, j:$j\n"); # i:changed, j:changed #### sub name { our $arg; local *arg = defined wantarray ? \do{my $anon = $_[0]} : \$_[0]; # Do stuff. $arg =~ s/^un//; return $arg; } #### name($i); # In place $j = name($i); # Not in place sub test { name($_[0]) } # unknown!!! sub test { name($_[0]) } test($i); # In place sub test { name($_[0]) } $j = test($i); # Not in place