Perl 给坦白/胡说八道的信息着色
我写了一个脚本,可以向终端输出很多消息。一些消息是信息性的,另一些是从Shell命令输出的,还有一些是错误消息。为了便于用户在终端中轻松读取输出,我想将错误消息涂成红色 除了由Perl 给坦白/胡说八道的信息着色,perl,Perl,我写了一个脚本,可以向终端输出很多消息。一些消息是信息性的,另一些是从Shell命令输出的,还有一些是错误消息。为了便于用户在终端中轻松读取输出,我想将错误消息涂成红色 除了由Carp::坦白产生的错误消息外,这一切都很正常。例如: use strict; use warnings; use Carp; use Term::ANSIColor; my_func(1); sub my_func { my ( $val ) = @_; if( $val != 0 ) {
Carp::坦白
产生的错误消息外,这一切都很正常。例如:
use strict;
use warnings;
use Carp;
use Term::ANSIColor;
my_func(1);
sub my_func {
my ( $val ) = @_;
if( $val != 0 ) {
confess color("bold red")
. "Unexpected value. Abort." . color("reset");
}
}
输出如下所示(行号不同):
问题是颜色重置太早,因此堆栈跟踪没有着色。如果省略color(“reset”)
调用,堆栈跟踪也会着色,但程序退出后的终端提示以及终端中运行的所有后续命令的输出都是红色
这有可能实现吗?我已经尝试了$SIG{{uuuuu DIE}
处理程序和END
块,但都不起作用
另请参见。似乎可以使用模具信号处理器(达到令人满意的水平)完成此操作。由于一个die信号处理程序将捕获远远多于对
的调用(有关更多信息,请参阅),因此我们将检查给定前导ANSI转义序列的die处理程序的输入参数。如果输入字符串包含color(“red”)
,我们将假定我们被调用:
local $SIG{__DIE__} = sub {
my ( $msg) = @_;
my $col_red = color( "bold red" );
if ( $msg =~ /\Q$col_red\E/ ) {
$msg =~ s/\s+$//;
$msg .= (color("reset") . "\n");
}
die $msg;
};
然后,在我们编写的程序中
confess color("bold red") . "Unexpected value. Abort.";
因此省略了颜色(“重置”)
代码
编辑:
可以获得对上述的改进。由于脚本已经控制了每个调用
调用,因此可以编写一个助手子例程来进一步本地化信号处理程序:
sub error_exit {
my ( $msg ) = @_;
local $SIG{__DIE__} = sub {
my ( $msg) = @_;
my $col_red = color( "bold red" );
if ( $msg =~ /\Q$col_red\E/ ) {
$msg =~ s/\s+$//;
die $msg . color("reset") . "\n";
}
else {
die $msg;
}
};
confess color("bold red") . $msg;
}
然后,在脚本中,将每个坦白
调用替换为错误\u退出
调用。例如,对于问题中的脚本:
error_exit("Unexpected value. Abort.");
你应该能够调整它是如何实现的。