Good eye, but this actually isn't a problem in this case. Because of the my %h inside of the loop, %h is a different (and new) lexical through each iteration -- thus there is no problem just sticking a reference to it into the hash or array. The problem comes from code like this (nearly directly copied from perldsc):
my %hash;
for $i (1..10) {
%hash = somefunc($i);
$hash_of_hashes{$rn} = \%hash; # WRONG!
}
Note where the "my" is. See perldsc or perlreftut or perllol for more.
perl -pe '"I lo*`+$^X$\"$]!$/"=~m%(.*)%s;$_=$1;y^`+*^e v^#$&V"+@( NO CARRIER'