in reply to execute function with name passed as string parameter

You are not assigning a code_ref in your hash, but rather the out put of your routines, this causes them to run on assignment.
perl -e '$choice="1"; %hash=( 0 => one, 1 => two ); sub one {print "on +e\n"}; sub two {print "two\n"} &{$hash{$choice}}' two
print "Good ",qw(night morning afternoon evening)[(localtime)[2]/6]," fellow monks."