$sexp = qr/ (? \s* \( \s* (?&sexp)* \s* \) \s* | \s* (?\w+) \s* )/x; '(A (B C))' =~ /$sexp/; ## AFTERWARDS %/ = (sexp => { 0 => '(A (B C))', sexp => [{ 0 => 'A', atom => 'A' }, { 0 => '(B C)', sexp => [{ 0 => 'B', atom => 'B' }, { 0 => 'C', atom => 'C' }] }]}; @/ = ('(A (B C))', [['A', 'A'], ['(B C)', [['B', 'B'], ['C', 'C']]]]);