1

我有一个将条目写入哈希的脚本。但是,在某个点上,我认为不应该存在哈希中的条目。所以,很明显我已经把它翘起来了,但是我认为只有一个地方我在散列中添加了元素,我已经测试了它以确保这些“流氓”元素没有被添加到这个位置.

我想做的是中断对哈希的写入,类似这样,但是以一种“全局”的方式,因为我不知道这个杂散的写入在代码中的什么位置——我看不到它。 .

那么我的选择是什么?我可以在 EPIC 调试器中设置观察点吗?如果可以,如何设置?(我玩过,但找不到任何相关的东西)。

或者我是否可以创建一个可以以某种方式拦截写入的扩展哈希?

关于“简单”调试方法的任何想法。否则我想我会回到蛮力调试:S 谢谢你...

4

3 回答 3

2

不是 EPIC 特定的答案,但请查看Tie::Watch. 您可以设置要监视的变量(如哈希),并且您的程序可以在每次更新变量时输出一些内容。

更新: Tie::Trace做几乎相同的事情,但界面更简单。

于 2013-08-28T15:05:55.360 回答
1

这是一个 DIY 版本的小怪答案: 使该哈希成为一个绑定哈希到一个类,该类在每次写入访问时输出一个堆栈跟踪:

package MyHash {
  use Tie::Hash;
  use parent -norequire, "Tie::StdHash";
  use Carp "cluck";

  sub STORE {
    my ($self, $k, $v) = @_;
    cluck "hash write to $self: $k => $v";
    $self->SUPER::STORE($k => $v);
  }
}

tie my %hash => "MyHash";
$hash{foo} = 42;
print "$hash{foo}\n";

输出:

hash write to MyHash=HASH(0x91be87c): foo => 42 at -e line 1.
        MyHash::STORE('MyHash=HASH(0x91be87c)', 'foo', 42) called at -e line 1
42
于 2013-08-28T15:11:07.520 回答
1
  use Hash::Util qw(
     lock_keys unlock_keys
     lock_hash unlock_hash
  );

  my %hash = (foo => 42, bar => 23);

  # no keys change
  lock_keys(%hash);

  # no keys/values change
  lock_hash(%hash);
于 2013-08-28T15:12:55.357 回答