Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

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

Replies are listed 'Best First'.
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)

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


        Function calls are not interpolated in double quotes.
        لսႽ ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ
Re: lcfirst and ucfirst not working
by moritz (Cardinal) on Aug 27, 2012 at 08:00 UTC

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://989935]
Approved by moritz
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (7)
As of 2017-02-22 20:21 GMT
Find Nodes?
    Voting Booth?
    Before electricity was invented, what was the Electric Eel called?

    Results (335 votes). Check out past polls.