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

彩色文本的Perl printf-输出格式错误,perl,printf,Perl,Printf,我有一个问题,当我使用彩色文本时,printf格式(对齐)不正确。 在本例中,请注意最后一列的左边是1个空格。 搜索解决方案只会告诉我,它很可能与代码中颜色变量的转义序列有关 这个问题有没有一个简单的解决方案,或者我是否需要添加代码以在文本着色时添加空格 守则: #! /usr/bin/perl use warnings; use strict; use feature qw{ say }; use Data::Dumper; # Color variables my $DEFAULTCOLO

我有一个问题,当我使用彩色文本时,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 %-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

单独打印颜色代码,这样它们就不会被
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 }};
}

此外,使用将简化代码并防止ANSI颜色序列中的意外输入错误。

单独打印颜色代码,以便它们不包括在长度计算中。
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 }};
}

此外,使用将简化代码并防止ANSI颜色序列中的意外输入错误。

您会发现有用。您会发现有用。感谢@choroba。就如何在不允许的字符内进行注释进行了一些讨论。。感谢@choroba。就如何在不允许的字符内进行注释进行了一些讨论:-)返回键让生活变得艰难。如果将“color=>”GREEN“更改为“server=>”HOST1“和“server=>”HOST2”,在下一次心跳中,我需要增加计数器并修改每个服务器值的“last_run”值,该怎么办?只是这是一个更大计划的一部分,我使用%HeartbeatHash来跟踪。我需要改变它,只是为了在输出中添加一些颜色。我认为这与问题无关。您可以将颜色插入哈希,或从状态推断颜色,重点不是将颜色代码与要打印的值连接起来,而是将它们作为单独的
%s
项打印。可能与问题无关,但与解决方案相关,因此,我提出了后续问题,但这可能被视为一个不同的主题,而不是stackoverflow的精神。我的第一个主题是stackoverflow,所以还在学习。我不想为您设计数据结构,所以我使用了一个更简单的。现在由您决定是将颜色ANSI序列包含在哈希中,还是在打印之前从值中派生出来。谢谢@choroba。关于如何在少于允许字符的范围内发表评论有点争论..谢谢@choroba。在如何用少于允许字符的:-)和返回键进行评论方面有点争执,这让生活变得困难。如果将“color=>”GREEN“更改为“server=>”HOST1“和“server=>”HOST2”,在下一次心跳中,我需要增加计数器并修改每个服务器值的“last_run”值,该怎么办?只是这是一个更大计划的一部分,我使用%HeartbeatHash来跟踪。我需要改变它,只是为了在输出中添加一些颜色。我认为这与问题无关。您可以将颜色插入哈希,或从状态推断颜色,重点不是将颜色代码与要打印的值连接起来,而是将它们作为单独的
%s
项打印。可能与问题无关,但与解决方案相关,因此,我提出了后续问题,但这可能被视为一个不同的主题,而不是stackoverflow的精神。我的第一个主题是stackoverflow,所以还在学习。我不想为您设计数据结构,所以我使用了一个更简单的。现在由您决定是要在散列中包含颜色ANSI序列,还是在打印之前从值派生它们。