Perl: как разбить запись в переменную в Eclipse
У меня есть скрипт, который записывает записи в хэш. Тем не менее, в определенный момент записи в хэше существуют, что я думаю, не должно. Итак, очевидно, что я где-то облажался, но есть только одно место, где я думаю, что я добавляю элементы в хеш, и я проверил это, чтобы убедиться, что эти "жульнические" элементы не добавляются в этом месте,
То, что я хотел бы сделать, это прервать запись в хеш, что-то вроде этого, но в "глобальном" смысле, потому что я не знаю, где в коде эта случайная запись - я не вижу этого…,
Так какие у меня варианты? Могу ли я установить точку наблюдения в отладчике EPIC, и если да, то как? (У меня была игра, но я не могу найти что-нибудь подходящее).
Или я мог бы создать расширенный хеш, который может как-то перехватывать записи?
Любые идеи по поводу "простого" метода отладки. В противном случае я думаю, что я вернусь к отладке грубой силы:S Спасибо в davance...
3 ответа
Не EPIC-специфичный ответ, но проверить Tie::Watch
, Вы можете настроить переменную (например, хеш) для наблюдения, и ваша программа может что-то выводить каждый раз, когда переменная обновляется.
обновлено: Tie::Trace
делает почти то же самое, с более простым интерфейсом.
Вот ответ от мобов в виде 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
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);