I'm using Hash::Util
's lock_keys
to die whenever trying to access a non-existing key in a hash.
Sometimes my hashes are deep (hash
of hashes of hashes...). Is there a
quick method to lock them all at once?
Is it possible to control the
default message upon failure (i.e.
add a Dump of the hash in which the key wasn't found)
lock_hash_recurse
Catch the exception, then dump as you wish and rethrow.
use Try::Tiny;
try {
$hash{key} = 123; # illegal modification
} catch {
use DDS; DumpLex \%hash;
die $_;
}
Question 2 is possible, but you are at the whims of the Hash::Util author(s):
#!/usr/bin/perl
use strict;
use warnings;
use Hash::Util qw/lock_keys/;
$SIG{__DIE__} = sub {
my $message = shift;
return unless my ($key, $file, $line) = $message =~ m{
Attempt [ ] to [ ] access [ ] disallowed [ ] key [ ] '(.*?)'
[ ] in [ ] a [ ] restricted [ ] hash [ ] at [ ] (.*?) [ ]
line [ ] (.*?).
}x;
die "$key doesn't exist at $file line $line.\n";
};
my %h = map { $_ => undef } "a" .. "z";
lock_keys %h;
my $s = $h{4};