彩色文本的Perl打印-错误的格式输出



我有一个问题,当我使用彩色文本时,printf格式(对齐(不正确。在本例中,请注意最后一列是如何向左1个空格的。只搜索解决方案告诉我,它很可能与代码中颜色变量中的转义序列有关。

这个问题有一个简单的解决方案吗?或者当文本被着色时,我需要添加代码来添加空格吗??

代码:

#! /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 %-sn", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-dn", "NOCOLOR", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});
${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "Passed";
printf ("%-9s %7s %-7s %-sn", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-dn", "NOCOLOR", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});
${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "${GREEN}Passed${DEFAULTCOLOR}";
printf ("%-9s %7s %-7s %-sn", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-dn", "GREEN", ${HeartbeatHash{'PKT'}[1]}, ${HeartbeatHash{'PKT'}[2]}, ${HeartbeatHash{'PKT'}[3]});
$DEFAULTCOLOR = "33[0m";
$GREEN = "33[32m";
${HeartbeatHash{'PKT'}[1]}++;
${HeartbeatHash{'PKT'}[2]} = "${GREEN}Passed${DEFAULTCOLOR}";
printf ("%-9s %7s %-7s %-sn", "Heartbeat", "Counter", "LastRun", "TriggerTime");
printf ("%-9s %7s %-7s %-dn", "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

单独打印颜色代码,这样它们就不会包含在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 %-sn", qw( Heartbeat Counter LastRun TriggerTime );
for my $heartbeat (@heartbeats) {
    printf "%-9s %7s %s%-7s%s %-dn",
        @$heartbeat{qw{ color counter code_before last_run code_after time }};
}

此外,使用Term::ANSIColor可以简化代码,防止ANSI颜色序列中的意外拼写错误。

最新更新