It doesn’t help me for what I want to do, because I am using Perl, version 5.005_01 built for powerpc-machten (BSD 4.4) and I cant use modules.
Yes you can.
# Term::ANSIColor -- Color screen output using ANSI escape sequences. # $Id: ANSIColor.pm 58 2006-07-12 22:30:55Z eagle $ # # Copyright 1996, 1997, 1998, 2000, 2001, 2002, 2005, 2006 # by Russ Allbery <rra@stanford.edu> and Zenin # # This program is free software; you may redistribute it and/or modify + it # under the same terms as Perl itself. # # Ah, September, when the sysadmins turn colors and fall off the trees +.... # -- Dave Van Domelen ###################################################################### +######## # Modules and declarations ###################################################################### +######## package Term::ANSIColor; require 5.001; use strict; use vars qw($AUTOLOAD $AUTORESET $EACHLINE @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS $VERSION %attributes %attributes_r); use Exporter (); @ISA = qw(Exporter); @EXPORT = qw(color colored); @EXPORT_OK = qw(uncolor); %EXPORT_TAGS = (constants => [qw(CLEAR RESET BOLD DARK UNDERLINE UNDER +SCORE BLINK REVERSE CONCEALED BLACK RED GRE +EN YELLOW BLUE MAGENTA CYAN WHITE ON_BLA +CK ON_RED ON_GREEN ON_YELLOW ON_BLUE ON_ +MAGENTA ON_CYAN ON_WHITE)]); Exporter::export_ok_tags ('constants'); $VERSION = '1.11'; ###################################################################### +######## # Internal data structures ###################################################################### +######## %attributes = ('clear' => 0, 'reset' => 0, 'bold' => 1, 'dark' => 2, 'underline' => 4, 'underscore' => 4, 'blink' => 5, 'reverse' => 7, 'concealed' => 8, 'black' => 30, 'on_black' => 40, 'red' => 31, 'on_red' => 41, 'green' => 32, 'on_green' => 42, 'yellow' => 33, 'on_yellow' => 43, 'blue' => 34, 'on_blue' => 44, 'magenta' => 35, 'on_magenta' => 45, 'cyan' => 36, 'on_cyan' => 46, 'white' => 37, 'on_white' => 47); # Reverse lookup. Alphabetically first name for a sequence is preferr +ed. for (reverse sort keys %attributes) { $attributes_r{$attributes{$_}} = $_; } ###################################################################### +######## # Implementation (constant form) ###################################################################### +######## # Time to have fun! We now want to define the constant subs, which ar +e named # the same as the attributes above but in all caps. Each constant sub + needs # to act differently depending on whether $AUTORESET is set. Without # autoreset: # # BLUE "text\n" ==> "\e[34mtext\n" # # If $AUTORESET is set, we should instead get: # # BLUE "text\n" ==> "\e[34mtext\n\e[0m" # # The sub also needs to handle the case where it has no arguments corr +ectly. # Maintaining all of this as separate subs would be a major nightmare, + as well # as duplicate the %attributes hash, so instead we define an AUTOLOAD +sub to # define the constant subs on demand. To do that, we check the name o +f the # called sub against the list of attributes, and if it's an all-caps v +ersion # of one of them, we define the sub on the fly and then run it. # # If the environment variable ANSI_COLORS_DISABLED is set, turn all of + the # generated subs into pass-through functions that don't add any escape # sequences. This is to make it easier to write scripts that also wor +k on # systems without any ANSI support, like Windows consoles. sub AUTOLOAD { my $enable_colors = !defined $ENV{ANSI_COLORS_DISABLED}; my $sub; ($sub = $AUTOLOAD) =~ s/^.*:://; my $attr = $attributes{lc $sub}; if ($sub =~ /^[A-Z_]+$/ && defined $attr) { $attr = $enable_colors ? "\e[" . $attr . 'm' : ''; eval qq { sub $AUTOLOAD { if (\$AUTORESET && \@_) { '$attr' . "\@_" . "\e[0m"; } else { ('$attr' . "\@_"); } } }; goto &$AUTOLOAD; } else { require Carp; Carp::croak ("undefined subroutine &$AUTOLOAD called"); } } ###################################################################### +######## # Implementation (attribute string form) ###################################################################### +######## # Return the escape code for a given set of color attributes. sub color { return '' if defined $ENV{ANSI_COLORS_DISABLED}; my @codes = map { split } @_; my $attribute = ''; foreach (@codes) { $_ = lc $_; unless (defined $attributes{$_}) { require Carp; Carp::croak ("Invalid attribute name $_"); } $attribute .= $attributes{$_} . ';'; } chop $attribute; ($attribute ne '') ? "\e[${attribute}m" : undef; } # Return a list of named color attributes for a given set of escape co +des. # Escape sequences can be given with or without enclosing "\e[" and "m +". The # empty escape sequence '' or "\e[m" gives an empty list of attrs. sub uncolor { my (@nums, @result); for (@_) { my $escape = $_; $escape =~ s/^\e\[//; $escape =~ s/m$//; unless ($escape =~ /^((?:\d+;)*\d*)$/) { require Carp; Carp::croak ("Bad escape sequence $_"); } push (@nums, split (/;/, $1)); } for (@nums) { $_ += 0; # Strip leading zeroes my $name = $attributes_r{$_}; if (!defined $name) { require Carp; Carp::croak ("No name for escape sequence $_" ); } push (@result, $name); } @result; } # Given a string and a set of attributes, returns the string surrounde +d by # escape codes to set those attributes and then clear them at the end +of the # string. The attributes can be given either as an array ref as the f +irst # argument or as a list as the second and subsequent arguments. If $E +ACHLINE # is set, insert a reset before each occurrence of the string $EACHLIN +E and # the starting attribute code after the string $EACHLINE, so that no a +ttribute # crosses line delimiters (this is often desirable if the output is to + be # piped to a pager or some other program). sub colored { my ($string, @codes); if (ref $_[0]) { @codes = @{+shift}; $string = join ('', @_); } else { $string = shift; @codes = @_; } return $string if defined $ENV{ANSI_COLORS_DISABLED}; if (defined $EACHLINE) { my $attr = color (@codes); join '', map { $_ ne $EACHLINE ? $attr . $_ . "\e[0m" : $_ } grep { length ($_) > 0 } split (/(\Q$EACHLINE\E)/, $string); } else { color (@codes) . $string . "\e[0m"; } } package main; die "YOUR CODE HERE";
If that doesn't help you, you need to learn " ANSI escape sequences".

In reply to Re: underline variable width column headings by Anonymous Monk
in thread underline variable width column headings by wlegrand

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.