Я пишу модуль Perl и использую carp для выдачи нефатального предупреждения обратно вызывающей программе.
Предупреждение карпа работает нормально - я проверяю, соответствует ли входной параметр определенному условию - если оно не удовлетворяет условию, отправляется предупреждение с карпом, и модуль продолжает использовать значение по умолчанию для параметра вместо одного вызывающая программа прошла. Предупреждение просто для уведомления о том, что вместо переданного параметра используется параметр по умолчанию.
Моя проблема с моим тестовым скриптом. Мой тестовый скрипт отправляет неверный параметр в модуль, и я пытаюсь перехватить возвращаемое предупреждающее сообщение и убедиться, что получил правильное предупреждающее сообщение.
Мой модуль выглядит примерно так:
else {
carp "value must be numeric - using default value";
}
и мой тестовый скрипт выглядит так:
eval {
#call to my module
};
like (
$@,
qr/value must be numeric/,
"Should abort on non-numeric value"
);
Когда я запускаю тест, я вижу предупреждение (оно должно идти в STDERR) на экране, но содержимое переменной $ @ - '' - пусто.
Вот вывод из моего тестового скрипта:
t/04bad_method_calls....ok 10/12value must be numeric - using default value at ...
# Failed test 'Should abort on non-numeric value'
# at t/04bad_method_calls.t line 98.
t/04bad_method_calls....NOK 12
# '' doesn't match '(?-xism:value must be numeric)'
# Looks like you failed 1 test of 12.
Если я поменяю карпа на хулигана, мой тестовый скрипт сработает - он ловит сообщение об ошибке (но я только хочу предупредить, а не прервать).
Если честно, у меня нет лучшего понимания eval - возможно, это не лучший способ поймать вывод предупреждения от карпа. Я пытался использовать $ SIG { WARN }, но это тоже было пусто.
Есть ли способ захватить выход из карпа? Это не самая большая сделка, поскольку это только в моем тестовом скрипте, но я все же хотел бы, чтобы мой тестовый скрипт работал правильно.
Заранее спасибо!