in reply to Populating Hash passed to a sub as reference

One item of clarfication: you have

PopulateHash(\%hash);
which passes a reference to %hash to the subroutine PopulateHash.

You create a new hash, %hash1, which is a copy of the old, %hash. Both are empty in this case.

my %hash1 = %$hashParm;
The changes in the subroutine are made to the new hash, which is a separate from the original. That's why you don't see the changes in the main program.