Changing Text Color (Perl Cookbook, 2nd Edition)

## 15.5. Changing Text Color

### 15.5.1. Problem

You want text to appear in different colors on the screen. For instance, you want to emphasize a mode line or highlight an error message.

### 15.5.2. Solution

Use the CPAN module Term::ANSIColor to send the ANSI color-change sequences to the user's terminal:

>     use Term::ANSIColor;

>     print color("red"), "Danger, Will Robinson!\n", color("reset");
>     print "This is just normal text.\n";
>     print colored("<BLINK>Do you hurt yet?</BLINK>", "blink");

Or, you can use convenience functions from Term::ANSIColor:

>     use Term::ANSIColor qw(:constants);

>     print RED, "Danger, Will Robinson!\n", RESET;

### 15.5.3. Discussion

Term::ANSIColor prepares escape sequences that some (but far from all) terminals will recognize. For example, if you normally launch a color-xterm, this recipe will work. If you normally use the normal xterm program, or have a vt100 in your kitchen, it won't.

There are two ways of using the module: either by calling the exported functions `color($attribute)` and `colored($text`, `$attribute)`, or by using convenience functions like `BOLD`, `BLUE`, and `RESET`.

Attributes can be a combination of colors and controls. The colors are `black`, `red`, `green`, `yellow`, `blue`, `magenta`, `on_black`, `on_red`, `on_green`, `on_yellow`, `on_blue`, `on_magenta`, `on_cyan`, and `on_white`. (Apparently orange and purple don't matter.) The controls are `clear`, `reset`, `bold`, `underline`, `underscore`, `blink`, `reverse`, and `concealed`. `clear` and `reset` are synonyms, as are `underline` and `underscore`. `reset` restores the colors to the way they were when the program started, and `concealed` makes foreground and background colors the same.

You can combine attributes:

>     # rhyme for the deadly coral snake
>     print color("red on_black"),  "venom lack\n";
>     print color("red on_yellow"), "kill that fellow\n";

>     print color("green on_cyan blink"), "garish!\n";
>     print color("reset");

We could have written this as:

>     print colored("venom lack\n", "red", on_black");
>     print colored("kill that fellow\n", "red", "on_yellow");

>     print colored("garish!\n", "green", "on_cyan", "blink");

or as:

>     use Term::ANSIColor qw(:constants);

>     print BLACK, ON_WHITE, "black on white\n";
>     print WHITE, ON_BLACK, "white on black\n";
>     print GREEN, ON_CYAN, BLINK, "garish!\n";
>     print RESET;

Here, `BLACK` is a function exported from Term::ANSIColor.

It's important to `print` `RESET` or `color("reset")` at the end of your program if you're not calling `colored` for everything. Failure to reset your terminal will leave it displaying odd colors. You may want to use:

>     END { print color("reset") }

to ensure the colors will be reset when your program finishes.

Attributes that span lines of text can confuse some programs or devices. If this becomes a problem, either manually set the attributes at the start of each line, or use `colored` after setting the variable `$Term::ANSIColor::EACHLINE` to the line terminator:

>     $Term::ANSIColor::EACHLINE = $/;
>     print colored(<< EOF, RED, ON_WHITE, BOLD, BLINK);
>     This way
>     each line
>     has its own
>     attribute set.
>     EOF

### 15.5.4. See Also

The documentation for the Term::AnsiColor module from CPAN

Copyright © 2003 O'Reilly & Associates. All rights reserved.