Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw

lcfirst and ucfirst not working

by laksh (Novice)
on Aug 27, 2012 at 07:53 UTC ( #989935=perlquestion: print w/ replies, xml ) Need Help??
laksh has asked for the wisdom of the Perl Monks concerning the following question:

my $mystring = "Bar"; print "\U $mystring--\n"; print "\L $mystring==\n"; $big = "\u$little"; print "$big\n";
for me lcfirst and ucfirst is not working as above please let me know how to do that. I am using perl version v5.12.2

Comment on lcfirst and ucfirst not working
Download Code
Re: lcfirst and ucfirst not working
by moritz (Cardinal) on Aug 27, 2012 at 08:00 UTC
Re: lcfirst and ucfirst not working
by davido (Archbishop) on Aug 27, 2012 at 08:24 UTC

    It's not entirely clear what you're trying to accomplish (or demonstrate) with that code snippet. It is using a variable that is never assigned a value ($little), and it never even uses the function ucfirst. ...and there's no function called 'lsfirst' (at least not as part of core Perl).

    But I can assure you that the \L, \U, \l, and \u metacharacters do work, as do their function based cousins, lc, uc, lcfirst, and ucfirst:

    my $string_upper = "BAR"; my $string_lower = "bar"; print "Testing metacharacter operations.\n"; print "\\L: [$string_upper] => [\L$string_upper]\n"; print "\\U: [$string_lower] => [\U$string_lower]\n"; print "\\l: [$string_upper] => [\l$string_upper]\n"; print "\\u: [$string_lower] => [\u$string_lower]\n"; print "\nTesting function operations.\n"; print " lc($string_upper) => (" , lc $string_upper, ")\n"; print " uc($string_lower) => (" , uc $string_lower, ")\n"; print "lcfirst($string_upper) => (" , lcfirst $string_upper, ")\n"; print "ucfirst($string_lower) => (" , ucfirst $string_lower, ")\n";


    Testing metacharacter operations. \L: [BAR] => [bar] \U: [bar] => [BAR] \l: [BAR] => [bAR] \u: [bar] => [Bar] Testing function operations. lc(BAR) => (bar) uc(bar) => (BAR) lcfirst(BAR) => (bAR) ucfirst(bar) => (Bar)


      I am trying to do as per below code but it is not working, here I dont want to use ucfirst
      print "Please enter your name:\n"; chomp($name = <>); $x = "\u substr($name,0,1)\n"; print $x;
      But it giving the result Please enter your name: sds Substr(sds,0,1)
        Function calls are not interpolated in double quotes.
        لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ

        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).


Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://989935]
Approved by moritz
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (10)
As of 2015-05-29 11:00 GMT
Find Nodes?
    Voting Booth?

    In my home, the TV remote control is ...

    Results (583 votes), past polls