A different hash reference should be pushed onto the array every time in the situation you describe. However, its possible that the contents of those hashes are the same (use
Data::Dumper to see the contents, if they are the same references also, it would show that).
I still question the need to use the same global hash everywhere, but if you need to push a snapshot of the hash onto the array, the 'push @array, { %hash }' should work for a simple hash, or if you need a deeper copy, then see dclone in Storable.