Search code examples
perlhashperl-data-structures

Accessing multi-level hash using scalar filled with keys


I'm trying to do something like this:

my $xml_hash_ref = XML::Parser......


my %fields_to_check = (
            '{Key1}{Key2}{Key3}{Key4}' => '..another hash...'
            '{Key1}{DifferentKey2}'    => '...another hash...'
            '{Key1}{DifferentKey2}{DifferentKey3}'    =>  '...another hash...'
);

foreach my $key (keys %fields_to_check){
     my $value = $xml_hash_ref->$key;
}

essentially I get this large hash of hashes of hashes when parsing an XML. I want to access these different values in this hash structure using this config hash %fields_to_check.Essential $key is a string of keys to direct where I want to go. Anyone know if this is possible or know of another solution?


Solution

  • Here's a rough idea:

    use strict;
    use warnings;
    
    my $deep_hash = {
        aa => {
            bb => { cc => 111, dd => 222 },
            ee => 333,
        },
        ff => 444,
    };
    
    sub dive {
        my $h = shift;
        for my $k (@_){
            return unless (ref($h) eq 'HASH' and exists $h->{$k});
            $h = $h->{$k};
        }
        return $h;
    }
    
    dive($deep_hash, qw(aa bb dd));