my %error_per_file; my %error_type; while(my ($filename, $errnum) = get_row_elements($some,$params,$here)) { $error_type{$errnum}++; $error_per_file{$filename}->{$errnum}++; } #### my $column = 1; my %column_for = map ($_ => $column++), sort keys %error_type; $column_for{Filename} = 0; #### $worksheet->write(0, $column_for{$col_name}, $col_name) for keys %column_for; #### my $row = 1; for my $filename (sort keys %error_per_file){ $worksheet->write($row, 0, $filename) my ($errnum, $occurences); $worksheet->write($row, $column_for{$errnum}, $occurences) while ($errnum, $occurences) = each %{$error_per_file{$filename}}; ++$row; }