Beefy Boxes and Bandwidth Generously Provided by pair Networks
Problems? Is your data what you think it is?
 
PerlMonks  

case escape characters

by vladb (Vicar)
on Mar 02, 2002 at 03:04 UTC ( #148757=perlquestion: print w/replies, xml ) Need Help??

vladb has asked for the wisdom of the Perl Monks concerning the following question:

Good day, monks.. I'm working on a small parser and in this script I require a function that would be able to return a special 'escape' (excuse me for poor jargon) character (such as'\U' etc) based on the case of a string passed to the sub as the first parameter. So, if my string is in uppercase, the subroutine should return '\U', it should return '\L' otherwise. For example,
my $esc_char = get_escape_case("S");
would return '\U' escape character. I may then use it (or so I hope to) to format any other string (either uppercase or lowercase it) by simply prepending the escape character in an expression like this:
my $case_formatted_string = $esc_char ."FoobAr";
In this example (where $esc_char is '\U') $case_formatted_string should become 'FOOBAR' (since "S" is in uppercase).

The only problem that I'm facing now is how do I actually apply this escape character to a string? I've tried one obvious way in a sample code below but it didn't work:
use strict; # determine case of a character # and return appropriate 'control' code. sub get_escape_case { my ($char) = @_; if ($char eq "\U$char") { return '\U'; } else { return '\L'; } } # this wouldn't work... print get_escape_case("S")."stuff\n"; # while this works.. print "\Ustuff\n";
I guess I might have to use a special 'code' for the escape character? Could anyone lead me in the right path? Thank you. ;-)

"There is no system but GNU, and Linux is one of its kernels." -- Confession of Faith

Replies are listed 'Best First'.
Re: case escape characters
by I0 (Priest) on Mar 02, 2002 at 05:13 UTC
    print &{sub{local($c,$_)=@_;$c x=length;$c^lc$c^lc}}("S","stuff");
      Nice! Very nice! I had to look twice (hell, five times) at x=length. I am still trying to understand $c^lc$c^lc:
      my $c = 'a'; my $d = 'A'; $_ = 'stuff'; print $c^lc$c^lc; print $d^lc$d^lc;
      More importantly, i am trying to understand how one would even COME UP with that! :D

      jeffa most humbly bows

Re: case escape characters
by synapse0 (Pilgrim) on Mar 02, 2002 at 03:40 UTC
    Wow.. it took me a bit to decipher what you are trying to do. I can say pretty much off the bat that you are going to want to do some overhauling on how you're thinking this snippet through. You're trying to replace a character with something new (in this case you're adding an escaped character).. how do we perl-ites usually do that? uh-huh.. you guessed it s/// (or tr///, but that's not as appropriate here). You'll prolly want to throw the entire string at your sub and return it's modified form.. something like
    $string = adjust_case('s', "stuff\n"); print $string; # which would print Stuff with a newline

    Prolly not exactly what you're lookin for, but hopefully will allow you to see your objective a little differently.

    -SynZero

    Sleep Deprived
      Thanks for help ;-)

      I've actually made it work by taking a slightly different approach. The rewrote the to_case() sub to return a reference to appropriate case subroutine (lc(), or uc() ...)
      use strict; sub to_case { my ($char) = @_; if ($char eq "\U$char") { return sub {uc(shift)}; } else { return sub {lc(shift)}; } } print to_case("FOO")->("bAr") ."\n"; print to_case("foo")->("BaR") ."\n";
      Here's the output produced by the script:
      BAR bar
      Sometimes, asking questions helps to come come up with an answer (eventually ;-). I'd appreciate it if you could show me another approach to solving my 'problem'. I'm not sure if returning sub references is a good thing?

      Of course, I realize that my 'solution' presented here is way worse than what you've suggested since I might as well just pass that string which I want to modify (it's case) to the sub and simply return it's modified version in the end. However, in my script I might need to format a number of separate strings to matching case, and most of those strings may not be 'known' at the time i first invoke the to_case() sub (say, i may call it once and store sub reference for later use...).

      "There is no system but GNU, and Linux is one of its kernels." -- Confession of Faith

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://148757]
Approved by root
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others surveying the Monastery: (3)
As of 2023-04-01 04:35 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?