Раскраска сообщения perl die - PullRequest
9 голосов
/ 17 апреля 2011

Я хочу изменить цвет сообщения в моем скрипте perl. В настоящее время я использую Term :: ANSIColor , чтобы изменить другие цвета в моем скрипте. Проблема, с которой я сталкиваюсь с сообщениями 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';
}

Обновление

Это работает, но теперь я не могу избавиться от той части статуи кубика, которая говорит, по какой линии это произошло.

Loading configuration file
/etc/solignis/config.xml not found!
 at discovery.pl line 50.

Обычно я просто добавляю функцию разрыва строки, и это исключает любую нормальную ошибку, выводимую из матрицы. Есть идеи, почему он это делает?

Обновление 2

Основываясь на всех ваших рекомендациях, я сделал это вместе.

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

Кажется, работает правильно. Использование констант для Term :: ANSIColor 1 было идеальной вещью, в которой я нуждался для простых вещей.

Ответы [ 4 ]

14 голосов
/ 17 апреля 2011

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";
4 голосов
/ 17 апреля 2011

Я уверен, что блок END{}, в котором вы возвращаете терминал обратно в его черноту, является самым чистым решением. Вот для чего такие вещи.

Делайте НЕ облажайтесь с $SIG{__DIE__}, иначе вы будете несчастны. Никто не понимает, что его вызывают даже для захваченных исключений !!

4 голосов
/ 17 апреля 2011

Есть несколько способов сделать это.

Используйте функцию 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";

или

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

Вы также можете trap $SIG{__DIE__} или использовать блок END с coderef и сбросить его после печати его аргументов. (Возможно, это не самые лучшие идеи, но они позволят вам сбросить цвета практически при любых условиях выхода.)

0 голосов
/ 17 апреля 2011

Вы можете использовать обработчик __DIE__:

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

С perldoc perlvar:

Из-за сбоя реализации, $SIG{__DIE__} hook вызывается даже внутри eval().

Следовательно, вы, вероятно, не должны использовать эту технику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...