while (my $line = <>) { chomp($line); my @tokens; foreach ($line) { /\G ( [^{\s]+ )/xgc && do { push(@tokens, $1); redo }; /\G ( {[^}]*} )/xgc && do { push(@tokens, $1); redo }; /\G \s+/xgc; redo; } ...process split line... }