着色perl die消息

时间:2011-04-17 04:54:13

标签: perl

我想在perl脚本中更改die消息的颜色。我目前正在使用Term::ANSIColor在我的脚本中进行其他颜色更改。我遇到的消息是,一旦脚本死掉它就无法将颜色重置为终端默认值,终端提示符是我脚本中最后使用的颜色。在这种情况下,它会变成红色。

我知道如何让脚本死掉但仍然会改变颜色吗?

这是有问题的代码块;

#!/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';
}

更新

它有效,但现在我无法摆脱模具陈述的部分,说明它发生了什么线。

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 1的常量是我需要完美的事情。

4 个答案:

答案 0 :(得分:14)

die正在打印到STDERR,而print将转到STDOUT。

print STDERR color 'red';
die "$config_file_path not found!\n";

请注意......你刚刚去世了。您的“重置”不会打印

您希望将其连接到die

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";

答案 1 :(得分:4)

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

使用Term::ANSIColor的{​​{1}}函数,它似乎会在结尾处自动添加ANSI重置序列:

colored

使用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";

您还可以陷阱die RED, "$config_file_path not found!\n", RESET; 使用带有coderef的$SIG{__DIE__}块,并在打印参数后重置它。 (这些可能不是最好的想法,但它们可以让你在几乎任何退出环境下重置颜色。)

答案 2 :(得分:4)

我确定你将终端重置为黑色的END{}块是最干净的解决方案。这就是这样的事情。

使用$SIG{__DIE__}进行操作,否则您会感到不快。没有人意识到即使对于被困异常也会被调用!!

答案 3 :(得分:0)

您可以使用__DIE__处理程序:

$SIG{'__DIE__'} = sub {
    print color 'reset';
};

来自perldoc perlvar

  

由于实施故障,所以   $SIG{__DIE__}挂钩被称为偶数   在eval()内。

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