$ perl -E 'sub foo { $_[0]= 5 } foo(4)' Modification of a read-only value attempted at -e line 1. #### use Scalar::Util "readonly"; sub foo { printf "%s\n", readonly($_[0])? "readonly" : "writable"; $_[0]= 5 if !readonly($_[0]) } foo(4); foo(my $x= 4); print "$x\n";