【问题标题】:Perl printf of colored text - wrong format output彩色文本的 Perl printf - 错误的格式输出
【发布时间】:2018-11-14 21:59:16
【问题描述】:

我有这个问题,当我使用彩色文本时,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]});

输出(终端在最后两行以绿色显示文本“通过”:

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

【问题讨论】:

标签: perl printf


【解决方案1】:

单独打印颜色代码,使它们不包含在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 颜色序列中出现意外的拼写错误。

【讨论】:

  • 谢谢@choroba。就如何使用少于允许的字符进行评论而争吵..
  • 谢谢@choroba。就如何使用少于允许的字符进行评论而争吵:-) 而且返回键让生活变得困难。如果您将 'color => 'GREEN' 更改为 'server => 'HOST1' 和 'server => 'HOST2' 并且在下一个心跳中我需要增加计数器并修改每个服务器值的 'last_run' 值怎么办?只是这是更大计划的一部分,我使用 %HeartbeatHash 来跟踪。我需要更改它,以便在输出中添加一些颜色。
  • 我认为这与问题无关。您可以将颜色插入哈希中,或者从状态中推断出来,重点不是将颜色代码与要打印的值连接起来,而是将它们打印为单独的%s 项目。
  • 可能与问题无关,但与解决方案相关,因此我的后续问题但这可能被视为不同的主题,而不是stackoverflow的精神。我的第一个关于 stackoverflow 的主题,所以还在学习中。
  • 我不想给你设计数据结构,所以我用了一个更简单的。现在由您决定是要在哈希中包含颜色 ANSI 序列,还是在打印之前从值中派生它们。
猜你喜欢
  • 1970-01-01
  • 2019-05-06
  • 1970-01-01
  • 2021-09-28
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多