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

Hi, I would like to use 'lc' (lowercase) in my regular expression. Any idea how to do this? Here is what my reg ex looks like now:
$newfile =~ s/\b([A-Z]{2,})\b/\\emph{$1}/g;
The line above is supposed to take the file (the lines of the file were joined to make one string) and look for any words that are 2 or more chars long that are in all uppercase and convert the word to bold (\emph{word} makes a word bold). In addition to this, I also need to lowercase the word. When I try to use 'lc' in the regex all I get is the string 'lc' appended to the match. Any suggestions?

Replies are listed 'Best First'.
Re: Using 'lc' (lowercase) in a reg ex
by theorbtwo (Prior) on Apr 29, 2004 at 10:16 UTC

    There are three basic ways to do this (some of which were covered by other posters already.)

    First, you could use /e. /e makes the right-hand-side of your s/// an expression, rather then a double-quoted string:
    $newfile =~ s/\b([A-Z]{2,})\b/"\\emph{".lc($1)."}"/g;

    Second, you could use \L ... \E, which lowercases inside of doublequotes:
    $newfile =~ s/\b([A-Z]{2,})\b/\\emph{\L$1\E}/g;

    Thirdly, you could use a trick to allow you to embed code within a doublequoted string:
    $newfile =~ s/\b([A-Z]{2,})\b/\\emph{@{[lc $1]}}/g;

    Which one to use is up to you; all three do the same thing, and on some level, operate in similar ways. Use whatever you think is most clear. (Well, whichever your intended audiance will find most clear, but that often is yourself.) (I'd use #1 or #3 myself. I had to read perlop to check if it was \L or \l I wanted.


    Warning: Unless otherwise stated, code is untested. Do not use without understanding. Code is posted in the hopes it is useful, but without warranty. All copyrights are relinquished into the public domain unless otherwise stated. I am not an angel. I am capable of error, and err on a fairly regular basis. If I made a mistake, please let me know (such as by replying to this node).

Re: Using 'lc' (lowercase) in a reg ex
by tinita (Parson) on Apr 29, 2004 at 09:55 UTC
    \L$1
    see perlop for details on \l, \L, \u, \U etc.
Re: Using 'lc' (lowercase) in a reg ex
by Hena (Friar) on Apr 29, 2004 at 09:53 UTC
    If you want to use commands in regex, you need to use /e in there.
    $newfile =~ s/\b([A-Z]{2,})\b/\\emph{lc($1)}/ge;
    Another way would be to use metasymbols
    $newfile =~ s/\b([A-Z]{2,})\b/\\emph{\L$1\E}/g;
    Code above untested, so might have mistakes.
      $newfile =~ s/\b([A-Z]{2,})\b/\\emph{lc($1)}/ge;
      Unless you happen to have a function called emph, that's not going to work. If you want to use /e, write it as:
      $newfile =~ s/\b([A-Z]{2,})\b/'\emph{' . lc ($1) . '}'/eg;

      But I would go for the \L method.

      Abigail