




carp лучше работает для отладки внутри модулей. Если вы пишете только простой сценарий, пользы нет. От Документация по карпу:
The Carp routines are useful in your own modules because they act like die() or warn(), but with a message which is more likely to be useful to a user of your module. In the case of cluck, confess, and longmess that context is a summary of every call in the call-stack. For a shorter message you can use carp or croak which report the error as being from where your module was called. There is no guarantee that that is where the error was, but it is a good educated guess.
carp дает вам больше информации о том, откуда пришло сообщение (контекст)
#!/usr/bin/perl
use Carp;
foo();
bar();
baz();
sub foo {
warn "foo";
}
sub bar {
carp "bar";
}
sub baz {
foo();
bar();
}
производит
foo at ./foo.pl line 9.
bar at ./foo.pl line 13
main::bar() called at ./foo.pl line 6
foo at ./foo.pl line 10.
bar at ./foo.pl line 14
main::bar() called at ./foo.pl line 19
main::baz() called at ./foo.pl line 7
немного глупо для этой маленькой программы, но может пригодиться, когда вы хотите знать, кто вызвал метод, который придирается.
Я использую warn для скриптов и простых программ, а Carp внутри любых модулей. Подпрограммы Carp используют имя файла и номер строки, в которой была вызвана ваша текущая подпрограмма, поэтому легче определить, кто является причиной проблемы (а не только там, где проблема проявилась).
Дамиан рекомендует Carp вместо warn в «Сообщении об ошибках» в Лучшие практики Perl, но не делает различий между сценариями как конструкциями кода верхнего уровня и модулями как компонентами, которые используют программы.
В последнее время меня это почти не заботило, потому что я использовал Журнал :: Log4perl для обработки всего этого.
Carp сообщает об ошибках с точки зрения вызывающего абонента. Это полезно для модулей, где вы обычно хотите предупредить о неправильном использовании (например, об отсутствии аргумента) и определить место, где возникла ошибка произошел, а не обнаружен.. Это особенно важно для служебных функций, которые могут использоваться во многих местах.
Большинство авторов используют warn в скриптах и carp в модулях. Иногда я использую warn внутри модуля, когда хочу, чтобы сообщение об ошибке отражало проблему в реализации модуля (например, случай, который он должен поддерживать, но не поддерживает). Можно утверждать, что cluck будет лучше в таких ситуациях, поскольку он обеспечивает полную трассировка стека.