#! perl -slw use strict; use re 'eval'; our ($num, $firstwords, $bracketed, $label, @bits, $pre_bit, $in_bit, $post_bit); my $re = qr[ (?{ our($num, $firstwords, $bracketed, $label, $pre_bit, $in_bit, $post_bit, @bits) = ( (undef) x 7, () ); }) (\d+) : (?{ our $num = $^N }) ([^\x5b]+?) \x5b (?{ our $firstwords = $^N }) ([^\x5d]+?) \x5d (?{ our $bracketed = $^N }) ([^:]+) : \s* (?{ our $label = $^N }) (?x-ism: ( [^,\s]+? ) [,\s] (?{ push our @bits, $^N }) )+? \s* \x5b (\w+) \( (?{ our $pre_bit = $^N }) ([\w ]+) \) (?{ our $in_bit = $^N }) (\w+) (?{ our $post_bit = $^N }) \x5d ]x; while( ) { print "$num : $firstwords [ $bracketed ] $label : [@bits] [ $pre_bit ( $in_bit ) $post_bit ]" if $_ =~ $re; } __DATA__ 1: or more [semi-fixed] fields: and,some,variable,length,stuff [more(fixed)stuff] 2: kind of [similarly] formated: records,with,variable,differences [embedded(in the)records]