How to improve the usage of lock_keys in Perl?

2019-07-04 06:19发布

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)

标签: perl hash
2条回答
Emotional °昔
2楼-- · 2019-07-04 06:39
  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 $_;
}
查看更多
狗以群分
3楼-- · 2019-07-04 06:41

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};
查看更多
登录 后发表回答