use Modern::Perl; use String::Trim; use Data::Dumper; $Data::Dumper::Sortkeys = 1; $Data::Dumper::Terse = 1; my @rows; while () { chomp; trim; my @F = split /\s*=\s*/; push @rows, [map { my %x = (field => $F[$_ - 1], value => $F[$_]); $x{field} =~ s/.*\s+(\S+)$/$1/ unless $_ == 1; $x{value} =~ s/\s*\S+$// unless $_ == $#F; \%x; } 1 .. $#F]; } print Dumper \@rows; for (@rows) { say join q(,), map { $_->{value} } @$_; } __DATA__ FIELDA = ONEAL FIELDB = RELAY FIELDC = L1208 FIELDD = ALTS FIELDA = OSSIPEE FIELDB = DISC FIELDC = SOH: 169879251 FIELDD = DISC FIELDA = OSSIPEE FIELDB = RELAY FIELDC = L1201 FIELDD = ALTS FIELDA = OSSIPEE FIELDB = RELAY FIELDC = L1203 FIELDD = ALTS