How to improve the usage of lock_keys in Perl?

2019-07-04 06:13发布

问题:

I'm using Hash::Util's lock_keys to die whenever trying to access a non-existing key in a hash.

  1. Sometimes my hashes are deep (hash of hashes of hashes...). Is there a quick method to lock them all at once?

  2. 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)

回答1:

  1. lock_hash_recurse

  2. 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 $_;
}


回答2:

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};


标签: perl hash