## Don't overwrite fields in package main. my @saveFields; no strict 'refs'; package main; foreach my $F (@$Fields) { push @saveFields, ${$F}; } foreach $_s (0..$#$Recs) { $_r = $Recs->[$_s]; ## Bind $FieldName1, $FieldName2, (etc. for each field name in ## $Fields) point to address of the current value for that ## field in this record. no strict 'refs'; foreach my $F (@$Fields) {*{$F} = \ $_t->{$F}->[$_r]}; ## Now $Sub may refer to $_r, $_s, $_t, and ${any field name} ## Call $Sub and capture return values iff caller wants them ($WantVals ? $Vals->[$_r] = &$Sub() : &$Sub()); } ## Restore fields in main no strict 'refs'; package main; foreach my $F (@$Fields) { ${$F} = shift @saveFields; };