【发布时间】:2020-02-26 23:21:23
【问题描述】:
这个问题与以下问题有关: How do I color output text from Perl script on Windows?
但是更具体一点。在某种程度上,我已经获得了跨平台着色工作:
use Term::ANSIColor;
use Win32::Console;
if (!(-f STDOUT)) {
if ($^O =~ /win/) {
our $FG_BLUE;
our $FG_YELLOW;
our $FG_RED;
our $BG_GREEN;
my $CONSOLE = Win32::Console->new(STD_OUTPUT_HANDLE);
my $attr = $CONSOLE->Attr(); # Get current console colors
$blue = sub {$CONSOLE->Attr($FG_BLUE);return};
$reset = sub {$CONSOLE->Attr($attr);return};
$yellow = sub {$CONSOLE->Attr($FG_YELLOW);return};
$red = sub {$CONSOLE->Attr($FG_RED);return};
} else {
$blue = sub {return color('bold blue')};
$reset = sub {return color('reset')};
$yellow = sub {return color('yellow')};
$red = sub {return color('red')};
}
}
但是当从字符串内部调用函数时,终端颜色不会立即改变,因此:
print "${\$blue->()} this is blue\n";
print "${\$blue->()}This is... not blue${\$reset->()}\n";
print "this is Blue ${\$blue->()}\n";
print "this is reset${\$reset->()}\n";
我想知道是否可以执行以下操作:
my $print_help = <<PRINT_HELP;
Usage: $toolname [-Options] [-fields name1,[name2],...]
${\$red->()} toolname version VERSION ${\$reset->()}
${\$blue->()} options: ${\$reset->()}
PRINT_HELP
print $print_help;
打印没有颜色。我试过设置 $| = 1 没有运气。
我没有在相关系统上安装 Win32::Console::ANSI 的选项,因此我无法使任何使用该模块的解决方案工作。
【问题讨论】:
-
如果你将heredoc结束字符串放在双引号中,我相信你会得到现在没有发生的变量扩展。即
<<"PRINT_HELP"在功能上与您现在所拥有的不同。 -
不幸的是,在这种情况下,引号中的 heredoc 似乎不会影响功能。在heredoc中已经发生了变量扩展,只是子程序在打印出任何东西之前都在执行。由于颜色更改是在函数调用时进行的,而不是打印出特殊字符,因此所有更改都是在打印任何文本之前进行的。
标签: windows perl cmd colors windows-console