4

我尝试使用 的w命令perl -d,给它一个条件,比如w ($root =~ /something/)在更改时停止$root,但它有这种停止的习惯,即使变量刚刚超出范围。所以对我来说没用。我尝试添加类似的东西,w (!$root || $root =~ /something/)但这似乎会导致一些奇怪的行为,比如随机停止并进入 random subs。无论如何,即使后一个有效,如果新范围包含同名的变量,它也会停止,所以我宁愿不必使用它。

那么,有没有其他方法可以使用 Perl 调试器实现仅限当前范围的监视?或者是否有任何其他提供此功能的 Perl 控制台调试器?

4

1 回答 1

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。继续运行,当有人在您的标量中存储值时,调试器将停止。然后你可以转储堆栈跟踪并查看它是谁。

于 2013-07-02T16:06:49.020 回答