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

3
我想编写一个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的打印语句……不会自动执行这个操作_” -- 真的吗?你真的期望一种语言会决定不执行你打印彩色的指令吗?你引用的C++代码是一个第三方的库,而不是语言本身。 - undefined
这是一个很好的图书馆支持这个想法的主意。不过,Perl也提供了一种简单的方法来实现这一点,就像ikegami的回答中提到的那样,使用-t参数。 - undefined
终端序列在被打印到文件中时毫无意义,对终端来说根本没有作用。它们只会破坏日志文件。所以是的,我对Perl执行无意义且有害的操作感到惊讶。 - undefined
1
"终端序列在被打印到文件中时毫无意义" -- 我可以接受这个说法(尽管日志文件的一个目的可能是被“显示”,这时这些序列突然变得有意义,因为大多数控制台工具会遵守它们)。但无论如何,期望一门“语言”来干涉程序员如何打印的决定,这甚至更加没有意义。告诉我有哪门语言会这样做...(再次强调,你的例子是一个“库”做到的,而不是C++本身!) - undefined
并非所有的文件都是日志文件。 - undefined
2个回答

6

-t 可以用来检查一个句柄是否连接到终端。

use Term::ANSIColor 之前,你可以简单地放置以下内容:

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

0
正确的解决方案中包含了“不”。
BEGIN { $ENV{ NO_COLOR } = 1 if not -t STDOUT; }

2
在这种情况下,使用“not”而不是“!”并不会改变任何事情。 - undefined
@Dada,我的帖子原本缺少了 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接