如何在Perl调试器中查看表达式的更改?

前端之家收集整理的这篇文章主要介绍了如何在Perl调试器中查看表达式的更改?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
使用Perl调试器,我知道我可以使用b命令在某些代码行设置断点.一旦变量的内容发生变化,我可以让调试器停止吗?

解决方法

您可以使用Perl调试器中的w命令创建监视点.

关于w debugger命令的崩溃过程:

通过键入w然后创建一个将监视更改的表达式来创建一个watch-expression:

DB<1> w $variablename

输入c继续,直到观察到的表达式发生变化.完成后,您将获得类似于此的输出

DB<2> c
Watchpoint 0:   $variablename changed:
    old value:  ''
    new value:  'hi'
main::(ex.pl:6):    $variablename = "";

请注意,调试器在更改发生后停止在语句处,因此显示的行可能根本不相关.

另请注意表达式是字符串化的.因此,例如,将变量更改为undef将为您提供此输出

DB<2> c
Watchpoint 0:   $variablename changed:
    old value:  'hi'
    new value:  ''
main::(ex.pl:7):    $variablename = undef;

如果随后将变量更改为空字符串,则调试器将不会停止,因为字符串化的空字符串和字符串化的undef被视为相等.

如果监视表达式是列表,则调试器将比较列表的字符串化元素:

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";

您可以将数组变量或散列变量用作监视表达式,它们将被视为任何其他列表.

删除watch-expression,请使用W命令,要查看活动监视表达式列表,请使用L命令.

提示:使用临时全局变量

由于watch-expression是使用每个语句重新计算的,因此您不能指望使用词法变量的watch-expression超出范围.一个快速提示是创建一个词法的全局引用,并跟踪它:

DB<1> $main::my_debug_variable = $hashref_lexical_variable

DB<2> w $main::my_debug_variable->{key_im_watching}

提示:使用Data :: Dumper

使用Data :: Dumper观察非标量的内容

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

这比简单的w $hashref更好,因为它会在散列值改变时停止,而不是简单地引用指向的地址(因为hashref字符串化为类似HASH(0x2a07a90)).

猜你在找的Perl相关文章