sub fillDataFromHash { my ($src, $recordSpec, $data) = @_; $data ||= ' ' x $RECORD_LENGTH; # Maybe add to %recordformat my @spec = @$recordSpec; while (@spec) { my $key = shift @spec; my $location = shift @spec; $location =~ /(\d+)(?:-(\d))?/ or die "Syntax error in recordSpec: @$recordSpec"; my ($start, $end) = ($1, $2 || $1); substr($data, $start - 1, $end - $start + 1) = $src->{$key}; } } # ... # fill %datavalues somehow my $dataLine = fillDataFromHash(\%datavalues, $recordformat{__COMMON__}); $dataLine = fillDataFromHash(\%datavalues, $recordformat{$datavalues{'RecordType'}}, $dataLine);