in reply to Preserving hash structure after subroutine call

It seems to me the only place that this can go wrong is in this section, copied from your code:
while (my $tmp_href = $sth->fetchrow_hashref) { $ct++; $results{$ct} = $tmp_href; }
You see: there's no garantee that DBI won't reuse the same hashref over and over again. That would mean that all, at least some, of the stored values in the final hash are the same reference. Quoting from `perldoc DBI` on fetchrow_hashref, $DBI::VERSION==1.15 (I haven't bothered to upgrade in a long time):
Currently, a new hash reference is returned for each row. *This will change* in the future to return the same hash ref each time, so don't rely on the current behaviour.

Therefore, I propose to anonymise those records:

while (my $tmp_href = $sth->fetchrow_hashref) { $ct++; $results{$ct} = { %$tmp_href }; }
For the rest: doing %$href = %result; seems to work for me.