De this article,¿Cómo funciona esta expresión regular?
/^1?$|^(11+?)\1+$/
comprueba si un número (su valor en unario) es principal o no.
Al usar esto, perl -l -e '(1 x $_) !~ /^1?$|^(11+?)\1+$/ && print while ++$_;'
devuelve una lista de números primos.
No tengo suficiente experiencia con Perl, pero lo que entiendo es que la expresión regular será true para un número que no sea primer. Entonces, si imprimimos todos los números que no producen un true con esta expresión, tenemos una lista de números primos. Eso es lo que intenta hacer la consulta perl.
Sobre la parte de expresiones regulares,
^1?$
parte es para contar como 1 no se ceba
^(11+?)\1+$
es para hacer coincidir los números no primos a partir de 4.
Lo que no hago entiendo por qué es el ?
en la expresión regular necesaria en absoluto. Según yo /^1$|^(11+)\1+$/
debe estar muy bien y en realidad
perl -l -e '(1 x $_) !~ /^1$|^(11+)\1+$/ && print while ++$_;'
me da el mismo conjunto de números primos.
¿Hay alguna falla en mi comprensión de la expresión regular? ¿Por qué se necesitan ?
s?
¿No se supone que ?
coincide con cero o una aparición de la expresión que lo precede?
@cjm: ¿Es esta una forma estándar de hacer expresiones no codiciosas? Donde todo funciona, excepto '+?' Y '*?'. Pensé que '' 'significaba coincidencia cero o una vez. – Lazer
@Lazer: el signo de interrogación que sigue a un cuantificador (como '+' o '*') es completamente diferente del que sigue a un token. – Borealid
Un '?' Que sigue a otro cuantificador hace que el cuantificador no sea codicioso. Ver http://perldoc.perl.org/perlre.html#Quantifiers – cjm