为perl消息着色

为perl消息着色,perl,Perl,我想在perl脚本中更改死亡消息的颜色。我目前正在使用脚本中的其他颜色更改。我在die消息中遇到的问题是,一旦脚本死亡,它就无法将颜色重置为终端默认值,并且终端提示是脚本中上次使用的任何颜色。在这种情况下,它会变成红色 你知道我怎么能让脚本死掉,但仍然把颜色改回来吗 这里是有问题的代码块 #!/usr/bin/perl use strict; use warnings; require Term::ANSIColor; use Term::ANSIColor; print "Loading c

我想在perl脚本中更改死亡消息的颜色。我目前正在使用脚本中的其他颜色更改。我在die消息中遇到的问题是,一旦脚本死亡,它就无法将颜色重置为终端默认值,并且终端提示是脚本中上次使用的任何颜色。在这种情况下,它会变成红色

你知道我怎么能让脚本死掉,但仍然把颜色改回来吗

这里是有问题的代码块

#!/usr/bin/perl
use strict;
use warnings;
require Term::ANSIColor;
use Term::ANSIColor;

print "Loading configuration file\n";

# Check if the specified configuration file exists, if not die
if (! -e $config_file_path) {
    print color 'red';
    die "$config_file_path not found!\n";
    print color 'reset';
} else {
    print color 'green';
    print "$config_file_path loaded\n";
    print color 'reset';
}
更新

它工作,但现在我无法摆脱的一部分,模具statation说,它发生在哪一行

Loading configuration file
/etc/solignis/config.xml not found!
 at discovery.pl line 50.
通常我只是在die函数中添加一个换行符,这样就消除了die的任何正常错误输出。知道为什么要这么做吗

更新2

根据你所有的建议,我拼凑了这个

print STDERR RED, "$config_file_path not found!";
die RESET, "\n";

它似乎工作正常。为Term::ANSIColor使用常量是我简化事情所需要的一件完美的事情。

die
正在打印到STDERR,而
打印
正在打印到STDOUT

print STDERR color 'red';
die "$config_file_path not found!\n";
请注意。。。你刚刚死了。不会打印您的“重置”

您想将其连接到您的
模具上

die color 'red' . "$config_file_path not found!" . color 'reset';
您还可以使用常数:

use Term::ANSIColor qw(:constants);

die RED, "THis is death!", RESET, "\n";
编辑:对不起-要删除“发生在哪里”部分,请在结尾处连接一个
\n

die color 'red' . "$config_file_path not found!" . color 'reset' . "\n";

有几种方法可以做到这一点

使用
Term::ANSIColor
colored
功能,该功能似乎会在末尾自动添加ANSI重置序列:

die colored( "$config_file_path not found!\n", 'red' );
使用
Term::ANSIColor
中的常量界面:

use Term::ANSIColor qw( :constants );
$Term::ANSIColor::AUTORESET = 1;
die RED "$config_file_path not found!\n";


您还可以将
$SIG{{uuuuu DIE{uuuuuu}
,或使用带有coderef的
结束
块,并在打印其参数后重置它。(这些可能不是最好的主意,但它们允许您在几乎任何退出情况下重置颜色。)

您可以使用
\uuuu DIE\uuu
处理程序:

$SIG{'__DIE__'} = sub {
    print color 'reset';
};
发件人:

由于一个实现故障
$SIG{{uuuuu DIE}
钩子被称为偶数 在
eval()中


因此,您可能不应该使用这种技术。

我确信,将终端重置为黑色的
END{}
块是最干净的解决方案。这就是这些东西的用途


不要乱动
$SIG{{uuuu DIE}
,否则你会不高兴的。没有人意识到它会被调用,即使是被捕获的异常

明白了-对不起,我忘了
\n
就是这么做的。
color
函数所做的一切就是返回一个控制字符,终端将其解释为颜色变化,因此您将该字符包含在字符串中并进行连接。+1对于您来说,使用
术语::ANSIColor qw(:常量)的想法是个很棒的主意。感谢您,您的更新解决方案是完美的。我喜欢它在一行中的表现。请注意,你也可以对常量做同样的处理-只需将
\n
粘贴在末尾(我刚才也更新了它)是的,我明白了,我从来没有费心使用concats。所以我真的可以把代码减少很多。那么每个被捕获的异常都应该打印那个crud?Ug!:添加了一个关于它的引用。谢谢。是的,我试过了
$SIG{{uuuuu DIE}
,尽管我不知道它的作用。无论如何,它对我都不起作用。
END{}
block是最好的方法++<代码>结束{}
块是最好的方法++
$SIG{'__DIE__'} = sub {
    print color 'reset';
};