如何使用相同的Perl语句将彩色文本打印到终端,但将非彩色文本打印到文件中?

How to print colored text to the terminal, but non-colored to the file with the same Perl statement?

提问人:Jennifer M. 提问时间:11/9/2023 更新时间:11/9/2023 访问量:101

问:

我想让 Perl 程序将彩色文本打印到终端,但是当输出重定向到文件时 - 应该在没有终端序列的情况下打印相同的文本。

令我惊讶的是,像下面这样的Perl打印语句不会自动执行此操作。

#!/usr/bin/perl -w

use Term::ANSIColor qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
print "Do you wish to operate in ";
print BOLD GREEN "(s)";
print "cript mode or in ";
print BOLD RED "(l)";
print "ive mode ? \n";

如何在Perl中像这样打印?

(C++ 库 rang 可以智能打印,就像我上面描述的那样。

Perl的

评论

0赞 zdim 11/9/2023
"很惊讶Perl打印语句...不要自动执行此操作“——说真的,很惊讶吗?你真的希望一种语言决定它会放弃你的彩色打印指令吗?你从 C++ 引用的是执行此类操作的第三方,而不是语言本身。
0赞 zdim 11/9/2023
不过,对于一个库来说,支持这一点是个好主意。(但话又说回来,Perl 为你提供了一种简单的方法来做到这一点,就像 ikegami 的回答一样。-t
0赞 Jennifer M. 11/9/2023
当终端序列打印到文件中时,它们没有任何意义,而不是打印到终端。他们只是垃圾日志文件。所以,是的,我很惊讶Perl做了毫无意义和有害的事情。
1赞 zdim 11/9/2023
"当终端序列被打印到文件中时,它们没有任何意义“——我可以接受这种说法(即使日志文件的目的可能是要显示,然后这些序列突然变得有意义,因为控制台中的大多数工具都会尊重它们)。但无论如何,期望一种语言扰乱程序员如何打印的决定就更没有意义了。告诉我一种语言......(同样,您的示例是一个执行此操作的,当然不是 C++ 本身!
0赞 ikegami 11/9/2023
并非所有文件都是日志文件。

答:

6赞 ikegami 11/9/2023 #1

-t 可用于检查句柄是否连接到终端。

您可以简单地将以下内容放在前面:use Term::ANSIColor

BEGIN { $ENV{ NO_COLOR } = 1 if !-t STDOUT; }
0赞 Jennifer M. 11/9/2023 #2

正确的解决方案中包含“not”:

BEGIN { $ENV{ NO_COLOR } = 1 if not -t STDOUT; }

评论

2赞 Dada 11/9/2023
在这种情况下,使用 instead of 不会改变任何内容。not!
0赞 ikegami 11/9/2023
@Dada,我的帖子最初缺少.!