{ my $skip = qr/\s*/; my $expr = qr/ (? # term $skip (? [a-zA-Z]+ | [1-9]\d* | \( (?&EXPR) $skip \) ) # term* (?: $skip [-+*/] (?&TERM) )* ) /x; my $re = qr/^ $expr $skip \z/x; sub is_valid { shift =~ /$re/o } }