Perl printf для цветного текста - неправильный формат вывода - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть проблема, что, когда я использую цветной текст, форматирование (выравнивание) в printf некорректно. В этом примере обратите внимание, как последний столбец находится на 1 пробел слева. Поиск решения только говорит мне, что это, скорее всего, связано с escape-последовательностью в переменных цвета в коде.

Есть ли простое решение для этой проблемы, или мне нужно добавить код, чтобы добавить пробел, когда текст окрашен ??

Код:

#! /usr/bin/perl
use warnings;
use strict;
use feature qw{ say };
use Data::Dumper;

# Color variables
my $DEFAULTCOLOR = "\e[0m";
my $RED = "\e[31m";
my $GREEN = "\e[32m";
my $YELLOW = "\e[33m";
my $BLUE = "\e[34m";
my $MAGENTA = "\e[35m";

my %HeartbeatHash = (
'BOTH' => [ '-', 0, '-', 10 ],
'PTN' => [ '-', 0, '-', 10 ],
'PKT' => [ '-', 0, '-', 10 ],
);

printf ("%-9s %7s %-7s %-s\n", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-d\n", "NOCOLOR", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});

${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "Passed";

printf ("%-9s %7s %-7s %-s\n", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-d\n", "NOCOLOR", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});

${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "${GREEN}Passed${DEFAULTCOLOR}";

printf ("%-9s %7s %-7s %-s\n", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-d\n", "GREEN", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});

$DEFAULTCOLOR = "\033[0m";
$GREEN = "\033[32m";

${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "${GREEN}Passed${DEFAULTCOLOR}";

printf ("%-9s %7s %-7s %-s\n", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-d\n", "GREEN", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});

Вывод (терминал показывает текст «Пропущен» зеленым цветом для последних 2 строк:

Heartbeat Counter LastRun TriggerTime
NOCOLOR         0 -       10
Heartbeat Counter LastRun TriggerTime
NOCOLOR         1 Passed  10
Heartbeat Counter LastRun TriggerTime
GREEN           2 Passed 10
Heartbeat Counter LastRun TriggerTime
GREEN           3 Passed 10

1 Ответ

0 голосов
/ 14 ноября 2018

Печать цветовых кодов отдельно, чтобы они не учитывались при расчете длины на printf:

my @heartbeats = (
    { color => 'GREEN',
      code_before => "",
      code_after => "",
      counter => 1,
      last_run => 'Passed',
      time => 10 },
    { color => 'GREEN',
      code_before => $GREEN,
      code_after => $DEFAULTCOLOR,
      counter => 2,
      last_run => 'Passed',
      time => 10 },
);

printf "%-9s %7s %-7s %-s\n", qw( Heartbeat Counter LastRun TriggerTime );
for my $heartbeat (@heartbeats) {
    printf "%-9s %7s %s%-7s%s %-d\n",
        @$heartbeat{qw{ color counter code_before last_run code_after time }};
}

Кроме того, использование Term :: ANSIColor упростит код и предотвратит случайные опечатки в цветовых последовательностях ANSI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...