我尝试使用w
的{{1}}命令,给perl -d
这样的条件,以便在w ($root =~ /something/)
更改时停止,但它有这种停止的习惯,即使变量只是超出了范围。所以对我来说没用。我尝试添加类似$root
的内容,但这似乎会导致一些奇怪的行为,例如随机停止并进入随机w (!$root || $root =~ /something/)
。并且在任何情况下,即使后一个工作它也会停止,如果新范围包含具有相同名称的变量,所以我宁愿不必使用它。
那么,有没有其他方法可以使用Perl调试器实现仅限电流范围的手表?或者是否有任何其他控制台调试器为Perl提供此功能?
答案 0 :(得分:1)
我不相信调试器内置了任何可以执行此操作的内容,但我推出了自己的绑定标量类并在“ScalarSnoop :: STORE”子例程上设置了断点。
这是班级:
package ScalarSnoop;
use strict;
use base qw(Tie::Scalar);
sub TIESCALAR {
my $class = shift;
my $value = shift;
return bless \$value, $class;
}
sub FETCH {
my $self = shift;
return $$self;
}
sub STORE {
my $self = shift;
my $newvalue = shift;
$$self = $newvalue;
}
1;
这是一个使用它的脚本:
#!/usr/bin/env perl
use v5.14.0;
use strict;
use warnings;
use lib qw(.);
use ScalarSnoop;
my ($first, $second, $third);
tie $second, 'ScalarSnoop';
$first = 'hey';
$second = 'there';
$third = 'dude';
# Changing the iterator variable changes the original since
# it is an alias
foreach my $variable (($first, $second, $third)) {
$variable = "like, ${variable}";
say "$variable";
}
启动调试器并使用b postpone ScalarSnoop::STORE
设置断点。继续运行,当有人在您的标量中存储值时,调试器将停止。然后你可以转储堆栈跟踪,看看它是谁。