I implemented your idea with a slight variation (moved the decimal-correction in the numeric data branch and put the check for empty fields in the non-numeric branch:
if ($self->datatype->[$_] =~ /^(?:TINYINT|MEDIUMINT|SMALLINT|I
+NT|INTEGER|BIGINT|FLOAT|DOUBLE)$/) {
$hr_returnvalue->{$CurrentColumnName} = 0 + substr ($texti
+nput, $self->flatfield_start->[$_], $self->flatfield_length->[$_]);#
+create a numeric value.
# Decimal-correction
if ($self->decimals->[$_] > 0 and defined $hr_returnvalue-
+>{$CurrentColumnName}) {
$hr_returnvalue->{$CurrentColumnName} /= 10**$self->de
+cimals->[$_];
}
} else {
$hr_returnvalue->{$CurrentColumnName} = substr ($textinput
+, $self->flatfield_start->[$_], $self->flatfield_length->[$_]);
$hr_returnvalue->{$CurrentColumnName} =~ s/^\s*(.*?)\s*$/$
+1/; # Trim whitespace
# Fill empty fields with that field's default value, if su
+ch a value is defined
if ($hr_returnvalue->{$CurrentColumnName} eq "") {
if (defined $self->standadefaultard->[$_]) {
if ($self->datatype->[$_] =~ /^(?:CHAR|VARCHAR|DAT
+E|TIME|DATETIME)$/) {
$hr_returnvalue->{$CurrentColumnName} = sprint
+f ("%s", $self->default->[$_]);
} else {
$hr_returnvalue->{$CurrentColumnName} = $self-
+>default->[$_];
}
} else {
# Remove empty field
delete $hr_returnvalue->{$CurrentColumnName};
}
}
}
but the idea is sound.
Devel::Size now reports the returned data-structure to be 385251506 bytes, which, for some reason is smaller than the data-structure retrieved from the db...I'll have to look at things more closely to figure out why that is.