I would return a list of "records", where each record is implemented as a hash. E.g.
my $infh = IO::File->new("< data") or die;
local $_ = $infh->getline;
s/LV /LV_/g; # :-)
my @column_names = split;
my @records;
while ( $infh->getlines ) {
my %rec;
@rec{@column_names} = split;
push @records, \%rec;
}
return @records;
# or simply
return map { my %r; @r{@c} = split; \%r } $infh->getlines;
...just for example. A better approach would parse fixed-width columns. A more robust extension of that would attempt to infer the column widths.
Update. If one of the columns is a "unique key", then it probably makes sense to load the set of records into a hash, using those values as the hash keys. E.g.:
return map {
my %r;
@r{@c} = split;
( $r{'LV_NAME'} => \%r )
} $infh->getlines;
(That doesn't really return a
hash, it returns a list... but that list can sensibly be assigned to a hash and it will DWIM.)