in reply to using colors with print()

here's a C program which does exactly that. I'm sure you could adapt it to be perlish.

#define RESET 0 #define BRIGHT 1 #define DIM 2 #define UNDERLINE 3 #define BLINK 4 #define REVERSE 7 #define HIDDEN 8 #define BLACK 0 #define RED 1 #define GREEN 2 #define YELLOW 3 #define BLUE 4 #define MAGENTA 5 #define CYAN 6 #define WHITE 7 void textcolor(int attr, int fg, int bg); int main() { textcolor(RESET, RED, BLACK); printf("In color"); textcolor(RESET, WHITE, BLACK); return 0; } void textcolor(int attr, int fg, int bg) { char command[13]; /* Command is the control command to the terminal */ sprintf(command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40); printf("%s", command); }

Replies are listed 'Best First'.
Re^2: using colors with print()
by thunders (Priest) on Jun 19, 2004 at 22:08 UTC
    very nice, here's the same program in perl
    use constant RESET => 0; use constant BRIGHT => 1; use constant DIM => 2; use constant UNDERLINE => 3; use constant BLINK => 4; use constant REVERSE => 7; use constant HIDDEN => 8; use constant BLACK => 0; use constant RED => 1; use constant GREEN => 2; use constant YELLOW => 3; use constant BLUE => 4; use constant MAGENTA => 5; use constant CYAN => 6; use constant WHITE => 7; sub textcolor($$$); print textcolor( RESET, RED, BLACK ), "In color\n", textcolor( RESET, WHITE, BLACK ); sub textcolor($$$) { my ( $attr, $fg, $bg ) = @_; #Command is the control command to the terminal my $command = sprintf( "%c[%d;%d;%dm", 0x1B, $attr, $fg + 30, $bg ++ 40 ); return sprintf( "%s", $command ); }

      I believe there is a need to print the newline character after the reset, not before, or in other words, do not let color attributes span unnecessary lines, and those last lines dealing with $command are redundant.

      sub textcolor ($$$); print textcolor (RESET, RED, BLACK), 'In color', textcolor (RESET, WHITE, BLACK), "\n"; sub textcolor ($$$) { my ($attr, $fg, $bg) = @_; sprintf "\e[%d;%d;%dm", $attr, $fg + 30, $bg + 40; }

        Actually the ANSI escapes span lines so newline position is really immaterial (except from a neatness point of view). In fact AFAIK they remain active until reset, and this status outlives the life of your program as you are effectively manipulating defaults on your term.

         
        $ cat col.pl
        #!/usr/bin/perl
        
        # default black background
        use constant BLUE => "\e[0;34;40m";
        use constant RED  => "\e[0;31;40m";
        use constant DEFAULT  => "\e[0;37;40m";
        
        print "The flag is:
        ", RED, "
        red
        ", DEFAULT, "
        white &
        ", BLUE,"
        blue.
        
        ANSI color escapes
        will span", DEFAULT, " at least with
        putty as the terminal emulation.
        ", BLUE;
        
        $ ./col.pl
        The flag is:
        
        red
        
        white &
        
        blue.
        
        ANSI color escapes
        will span at least with
        putty as the terminal emulation.
        $
        $ echo Oops forgot to reset blue mode
        Oops forgot to reset blue mode
        $ perl -e 'print "\e[0;37;40m"';
        $ echo Fixed....
        Fixed....
        
        

        cheers

        tachyon