use strict; use warnings; while () { chomp; next unless length; my @items = / SS\s+ (\S+)\s+ # SS field PL\s+ (.*?) # PL field - may have trailing white space PV (.*?) # PV field - includes white space C[LT] (.*?) # CL field - includes white space RL (.*?) # RL field - includes white space SA\s+ (\S+)\s+ # SA field DS\s+ (\S+) # DS field /xi; # Allow comments and white space in regex. Ignore case if (@items != 7) { # Warn then skip badly formed lines warn "Unrecognised line format: $_\n"; next; } # Do stuff with the extracted fields print '>', join ('<, >', @items), "<\n"; } __DATA__ SS 21 PL 2#3 PV 51.3 CL #110 +0 RL 126' SA 106 DS 93 SS 21 PL 2#3 PVa51.3 CT^ 110 +0 RL126, SA 106 DS 93 SS 21 PL 2#3 PV 51.3 CL #110 +0 RL 126' SA 106 DS 93