http://qs321.pair.com?node_id=626192


in reply to Traverse an unknown multi-dimensional hash

Recursion is the trick:

use strict; use warnings; my %hash = ( 1 => { a => { i => 'level 3', ii => 'level 3', iii => 'level 3', }, b => { i => 'level 3', ii => 'level 3', iii => 'level 3', }, }, 2 => {a => 'level2', b => 'level2'}, 3 => 'level 1', 4 => 'level 1', ); print dumpHash(\%hash); sub dumpHash { my ($element, $indent) = @_; $indent ||= ''; return "$indent$element\n" unless 'HASH' eq ref $element; my $str= ''; for my $key (sort keys %$element) { $str .= "$indent$key =>\n"; $str .= dumpHash ($element->{$key}, $indent . ' '); } return $str; }

Prints:

1 => a => i => level 3 ii => level 3 iii => level 3 b => i => level 3 ii => level 3 iii => level 3 2 => a => level2 b => level2 3 => level 1 4 => level 1

DWIM is Perl's answer to Gödel

Replies are listed 'Best First'.
Re^2: Traverse an unknown multi-dimensional hash
by Anonymous Monk on Jul 27, 2012 at 18:05 UTC
    how would i do something like 1 => a =>i =>level 3
    1=> a=> =>ii => level3
    1=>a=>iii=>level3
    etc.... Please help
      How would i print the output like this : 1 => a =>i =>level 3 1=> a=> =>ii => level3 1=>a=>iii=>level3 etc I could not workout the code to go back to the start and traverse back.
        ub dumpHash { my ($element, $indent) = @_; $indent ||= ''; return " = $indent$element\n" unless 'HASH' eq ref $element; my $str= ''; for my $key (sort keys %$element) { $str .= "$indent$key :"; $str .= dumpHash ($element->{$key}, $indent . ' '); } return $str;
        output :
        toplevel-1 : sublevel1a : = value-1a sublevel1b : = value-1b toplevel-2 : sublevel1c : value-1c.1 : = replace +ment-1c.1 value-1c.2 : = replacement-1c.2 sublevel1d : = value-1d
        but i want
        toplevel-1 : sublevel1a : = value-1a toplevel-1 : sublevel1b : = value-1b