use Data::Dumper; $Data::Dumper::Terse = $Data::Dumper::Indent = 1; my $test = <|} objn = {blah|blah|blah|blah|blah|blah|} set = [ one | two | three ] EOT my $delim = qr{\s*\|\s*}; my $box = qr/\w+\s*=\s*\[\s*([^]]+)\s*\]/; my $brace = qr/\w+\s*=\s*{\s*([^}]+)\s*}/; my $re = qr/^\s*$brace\s*$brace\s*$brace\s*$box\s*$/; if ($test =~ $re) { my ($opt, $set) = ($1, $4); my @opt = split $delim, $opt; my @set = split $delim, $set; print Dumper({ opt => [ @opt ], set => [ @set ] }), $/; } #### my $test = <|} objn = {blah|blah{blah|blah|blah}blah|} set = [ one | two | three ] (this is new also) EOT