Instead of printing your hash values divided by $sum, change directly your hash and push a reference to it into a global array of hashes. Once you have readd all your files, use that data structure to print your data structure in the required format.
$_ = $_/$sum foreach (values %hash);
push @AoH, \%hash;
It would probably be better to declare your hash within the "foreach my file (@ARGV)" loop to make sure you get a brand new and empty hash each time, but, on the other side, @AoH needs to be declared at the top of your program.
At the end, you just need to go through the @AoH structure to print your output. (Of course, this is just one possibility, there are quite a few others.)