qr{ (?(DEFINE) (? (?&number) (?: \s+ (?: (?&number) | (?&unary_op) | (?&binary_op) ) )* ) (? ( \d+ (?: [.] \d* )? | [.] \d+ ) (?{ local @stack = ( @stack, $^N ) }) ) (? ( chs | abs | sqr | sqrt | sin | cos | tan ) (?(?{ @stack < 1 }) (*FAIL) ) (?{ local @stack = @stack; $operators{$^N}->($stack[-1]) }) ) (? ( [-+/*^] ) (?(?{ @stack < 2 }) (*FAIL) ) (?{ local @stack = @stack; $operators{$^N}->($stack[-2], pop @stack) }) ) ) \A \s* (?&expr) \s* \z (?(?{ @stack != 1 }) (*FAIL) ) (?{ $result = $stack[0] }) | (?{ $result = undef }) (*FAIL) }msx