sub hash_walk { my ($hash, $string, $level, %keys_printed) = @_; while (my ($k, $v) = each %$hash) { $string .= "{ $k: " unless $keys_printed{$level}{$k}; $keys_printed{$level}{$k} = 1; if (ref($v) eq 'HASH') { $string = hash_walk($v, $string, ++$level, %keys_printed); $string .= ' }, '; $level--; } else { $string .= $v . ' },'; } } return $string; } my %data = ( email =>{steve => 'owens'}, user => {steve => {fun => 'times', laugh => 'in'}}, pass => {blah => 'moomoo'}, ); print hash_walk(\%data, '', 0, ()) . "\n";