Вы выиграете от конвертации вашего скрипта в модуль.
Проблема, с которой вы столкнулись, заключается в том, что foo()
вызывается напрямую, как только Perl входит в среду выполнения.Но это не то поведение, которое вам нужно с точки зрения отладки.
Цель модуля - разрешить обрабатывать большую часть кода как встроенный модуль и разрешить запуск или запуск кода толькозапускается, если скрипт запускается напрямую, но не запускается, если вместо этого скрипт загружается как модуль.Делая это, вы можете написать набор тестов для кода modulino, оставив только минимальный стартовый код вне досягаемости модульных тестов.
Здесь существует одна из нескольких статей по этой теме: https://perlmaven.com/modulino-both-script-and-module
Для ваших целей модуль modulino позволяет вам более избирательно относиться к тому, что вы запускаете с помощью отладчика Perl.
Если вы структурируете свой код следующим образом, вы будете более успешны:
package MyModulino;
use parent 'Exporter';
our @EXPORT = qw(foo bar);
sub foo {
print "Hello world\n";
# enable debugger from this moment with PERLDB_OPTS='NonStop frame=1'
bar();
# disable debugger from this moment
return;
}
sub bar {
print "Just another Perl hacker\n";
return;
}
package main;
if(!caller) {
MyModulino->import();
foo();
}
Теперь вы можете сделать это:
perl -I/some/path/to/script -e 'do "scriptname"; MyModulino::bar()'
Другими словами, теперь вы можете рассматривать scriptname
, что бы это ни было, как модуль с пакетом с именем MyModulino
, и вы можете вызывать bar()
напрямую, а не полагаться на foo()
, чтобы позвонить.Вызов foo()
происходит только в том случае, если caller()
возвращает false, что он будет делать, если вы запускаете программу напрямую, но не будет, если вы вызываете ее как модуль.
Обрабатывая scriptname
какмодуль, вызов foo()
не выполняется неявно, и ваш код отладчика может вызывать bar()
из пакета MyModulino
.
Этот один лайнер должен перенаправить вас в отладчик, не вызвав foo()
.
perl -d -I/path/to/script -e 'do "scriptname"; MyModulino::bar()'
Вы можете комбинировать эту технику вместе с Test::MockModule
, чтобы высмеивать части стека вызовов, которые вам не нужны при тестировании bar()
.Но когда вы начинаете идти по этому пути, вам действительно следует потратить время на реализацию этих стратегий в автоматизированном тестовом сценарии.В этом случае по-прежнему действует совет «modulino».