La estructura es:
(?(condición)patrón-sí|patrón-no)(En este caso concreto, no está la parte de patrón-no)
Se trata de una estructura que comprueba una condición. Si la condición es verdadera, el resultado de la estructura será un patrón: el indicado por patrón-sí. Si no es verdadera, devuelve el patrón-no.
Esto se usa para indicar distintos patrones de búsqueda según el valor de una condición.
En este caso, la condición es
(?{ ... })que es una estructura que contiene una expresión Perl, que es evaluada. En este caso, se pasan a las variables $M, $A y $D la longitud de las capturas de paréntesis realizadas antes (líneas anteriores a las mostradas). Y se termina con una comparación de igualdad, similar a la de tu último código.
Si el resultado de esta condición es verdadera, se ejecuta la parte de patrón-sí, que resulta que es:
(?{ say "$M$A$D"; })que a su vez es otro código Perl ejecutable. En este caso, un simple say(), sacando el resultado correcto de la búsqueda.
Como no hay patrón-no, pues no hace nada en caso de que la condición falle.
Después de eso, hay un patrón predefinido:
(*FAIL)Este patrón no coincide con nada. Solo provoca un "fallo de coincidencia" al motor de expresiones regulares, haciéndole creer que la búsqueda actual ha fracasado, y que debe reintentarlo con otro patrón distinto. Lo que hace el motor de expresiones regulares es volver atrás, y volver a ajustar los parámetros de búsqueda de las 'M', en la parte de '{1,9}', probando con otra combinación.
Todo esto es para imitar el funcionamiento de tres bucles anidados: el motor de expresiones regulares probará con todas las combinaciones de '{1,9}'.
Más información en tu propio ordenador en
perldoc perlre,
y en la Web (
traducido al español).