As choroba correctly mentioned, function calls don't interpolate inside of strings (at least not unless you resort to some ugly trickery). The far better approach is this:
print "Please enter your name:\n"; chomp( $name = <> ); $x = ucfirst $name; print $x;
If you have a good reason for not wanting to use ucfirst, then you do have alternatives:
# The \u metacharacter acts only upon the first character. # No need for substr. $x = "\u$name";
# Assuming Perl 5.14+ $x = $name =~ s/^(.)/\u$1/r;
$x = $name; $x =~ s/^(.)/\u$1/;
But why isn't ucfirst available to you? Also, did you read through the code example I provided in my earlier Post? It should have made it reasonably clear that "\u$string" does what you want without resorting to using substr (unless we're not seeing some relevant code from you that would make this approach unsavory).