my @tokens = ( { name => 'group_begin', pattern => qr({) }, { name => 'group_end', pattern => qr(}) }, { name => 'escape', pattern => qr(\\[^\\{}\s]+) }, { name => 'text', pattern => qr([^\\{}]+) }, ); my $indent = 0; TOKENLOOP: { for (@tokens) { if ($text =~ /\G($_->{pattern})/gc) { (my $token = $1) =~ s/\n/[\\n]/g; $indent-- if $token eq "}"; print " " x $indent, "->$token<-\n"; $indent++ if $token eq "{"; redo TOKENLOOP; } } }