my $pat = qr { (?(DEFINE) (? (?: [0-9]+ )) (? (?: [-+] )) (? (?: (?&term) (?: \s* [-+] \s* (?&expr))? )) (? (?: (?&factor) (?: \s* [/*] \s* (?&term))? )) (? (?: (?&number) | (?&sign) \s* (?&factor) | \( \s* (?&expr) \s* \))) ) (?&expr) }x;