如何在不重新启动Perl调试器中的脚本的情况下重新运行子例程?

时间:2009-09-23 21:27:33

标签: perl debugging

假设我遇到了尝试使用Perl代码的情况。

 perl -d foo.pl

Foo.pl认为它是快乐的方式(这是一个很大的脚本),我决定我想重新运行一个特定的子程序并单步执行它,但不重新启动该过程。我该怎么做?

3 个答案:

答案 0 :(得分:5)

调试器命令b method在子例程的开头设置断点。

  DB<1> b foo
  DB<2> &foo(12)
main::foo(foo.pl:2):      my ($x) = @_;
  DB<<3>> s
main::foo(foo.pl:3):      $x += 3;
  DB<<3>> s
main::foo(foo.pl:4):      print "x = $x\n";
  DB<<3>> _

有时您可能必须使用包名来限定子例程名称。

  DB<1> use MyModule
  DB<2> b MyModule::MySubroutine

答案 1 :(得分:2)

只需执行:func_name(args)

e.g。

sub foo {
  my $arg = shift;
  print "hello $arg\n";
}

在perl -d:

  DB<1> foo('tom')
hello tom

答案 2 :(得分:0)

回应有关想要重新执行子程序的编辑。

这并不是最优雅的做法,但我没有其他方法,我对其他人对这个问题的回答感兴趣:

my $stop_foo = 0;

while(not $stop_foo) {
   foo();
}

sub foo {
   my $a = 1 + 1;
}

调试器将继续执行foo,但您可以通过在调试器中执行'$ stop_foo ++'来停止下一个循环。

同样,我并不觉得这是最好的方式,但只需对调试代码进行少量添加即可完成工作。