output_hash(\%data); sub output_hash { my ($href) = @_; die "Not a hashref" if ref($href) ne 'HASH'; my (@work, @row) = ($href, ()); while (@work) { my $item = pop @work; my ($k, $v) = each %$item; next if ! defined $k; if (ref($v) eq 'HASH') { push @work, $item, $v; $row[$#work - 1] = $k; next; } push @work, $item; print join(',', @row, $k, $v), "\n"; } }