sub foo { my %hash = (); .... %hash = .... # key/values populated by some API bar(\%hash, ); # <<<----- Is this better/best practice compared to Scenario 1 ? } sub bar { my $hash_ref = shift; .... other function args are accessed here my @array = (); push (@array, $hash_ref); foreach my $i (.....) { .... %some_hash initialized here for each iteration of the for-loop push (@array, \%some_hash); } zzz(\@array); # zzz() will do some read-only operations with this array }