How to improve the usage of lock_keys in Perl?

白昼怎懂夜的黑 提交于 2020-01-04 03:52:36

问题


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


来源:https://stackoverflow.com/questions/3725675/how-to-improve-the-usage-of-lock-keys-in-perl

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!