如何在Perl调试器中监视表达式的更改?

如何在Perl调试器中监视表达式的更改?,perl,debugging,watch,Perl,Debugging,Watch,使用Perl调试器,我知道我可以使用b命令在某些代码行设置断点。变量的内容发生更改后,是否可以让调试器立即停止?您可以使用Perl调试器中的w命令创建观察点 关于w调试器命令的速成课程: 通过键入w创建一个监视表达式,然后键入一个将监视更改的表达式: DB<1> w $variablename 请注意,在发生更改后,调试器会在语句处停止,因此显示的行可能根本不相关 还要注意,表达式是字符串化的。例如,将一个变量更改为unde将得到以下输出: DB<2> c Watc

使用Perl调试器,我知道我可以使用
b
命令在某些代码行设置断点。变量的内容发生更改后,是否可以让调试器立即停止?

您可以使用Perl调试器中的
w
命令创建观察点

关于
w
调试器命令的速成课程: 通过键入
w
创建一个监视表达式,然后键入一个将监视更改的表达式:

DB<1> w $variablename
请注意,在发生更改后,调试器会在语句处停止,因此显示的行可能根本不相关

还要注意,表达式是字符串化的。例如,将一个变量更改为
unde
将得到以下输出:

  DB<2> c
Watchpoint 0:   $variablename changed:
    old value:  'hi'
    new value:  ''
main::(ex.pl:7):    $variablename = undef;
提示:使用
Data::Dumper
使用
Data::Dumper
查看非标量的内容:

DB<1> w Data::Dumper->Dump([$hashref])
DB w Data::Dumper->Dump([$hashref])

这比简单的
w$hashref
更可取,因为当哈希值更改时,它将停止,而不仅仅是引用所指向的地址(因为hashref字符串化为类似
hash(0x2a07a90)
)。

此外,您可以在Linux中使用
“ddd your_script.pl&”
,并观察像C/C++调试器这样的变量在GUI中的表现。

最后两个技巧非常棒!另一个提示:
w$$
在进入forked childrenIn(第四版,第三版,2013-12-13)时中断,“w”被称为列出源代码,与1991年第一版相同(现在似乎是“v”(Perl版本5.30))。那是在这个答案被写出来之前的一个月。什么时候从“w”变为“v”?1994年的Perl5?好的,我找到了。根据文件,“w”被重新分配到(2002-03-05)中的观察表达式。在(2001-07-13)中,“w”仍然用于源代码列表。这本书已经严重过时了。对于Perl调试器(在发布时(2012年2月),该版本(第四版)已经过期了近10年)。谢谢@PeterMortensen。请随意编辑我的答案以更新它。
  DB<1> w $variablename, "second"

  DB<2> c
Watchpoint 0:   $variablename, "second" changed:
    old value:  'one', 'second'
    new value:  'two', 'second'
main::(hi.pl:6):    $variablename = "three";
DB<1> $main::my_debug_variable = $hashref_lexical_variable

DB<2> w $main::my_debug_variable->{key_im_watching}
DB<1> w Data::Dumper->Dump([$hashref])