#!/usr/local/bin/perl use strict; use warnings; use Data::Dumper; sub recurseHash{ my ($targetHash, $mergeHash) = @_; while( my ($key, $val) = each %{$targetHash} ){ if( ref($val) eq 'HASH' ){ if( !exists($mergeHash->{$key}) ){ mergeHash->{$key} = {}; } &recurseHash($targetHash->{$key}, $mergeHash->{$key}); next; } mergeHash->{$key} = $val; } } my %a = &recurseHash({a=>'a'}, {b=>'b'}); warn Dumper \%a;