for my $let (keys %hash) { for my $num (keys %{$hash{$let}}) { for my $name (keys %{$hash{$let}{$num}}) { print join(',', $let, $num, $name, $hash{$let}{$num}{$name}), "\n"; } } } #### output_hash(\%data, []); sub output_hash { my ($href, $item) = @_; die "Not a hashref" if ref($href) ne 'HASH'; my ($key, $val) = each %$href; if (ref($val) ne 'HASH') { for my $key (sort keys %$href) { print join(',', @$item, $key, $href->{$key}), "\n"; } return; } for my $key (sort keys %$href) { push @$item, $key; output_hash($href->{$key}, $item); pop @$item; } }