my %data; @{$data{a}{b}{c}{columns}} = [1, 2, 3]; @{$data{a}{b}{c}{values}} = [4, 5, 6]; @{$data{d}{e}{columns}} = [7, 8, 9]; my %leaves; walkHash (\%data); print "columns: "; print "@$_ " for @{$leaves{columns}}; print "\nvalues: "; print "@$_ " for @{$leaves{values}}; sub walkHash { my $subHash = shift; for (keys %$subHash) { if (/columns/) { push @{$leaves{columns}}, @{$subHash->{$_}}; } elsif (/values/) { push @{$leaves{values}}, @{$subHash->{$_}}; } else { walkHash ($subHash->{$_}); } } }