2010-06-30 7 views
5

uso de mi habitual 'x' era:Funky 'x' en Perl

print("#" x 78, "\n"); 

Qué concatena 78 veces la cadena "#". Pero recientemente me encontré con este código:

while (<>) { print if m{^a}x } 

que imprime cada línea de entrada que comienza con una 'a'. Entiendo la parte de correspondencia de expresiones regulares (m {^ a}), pero realmente no veo qué está haciendo 'x' aquí.

Cualquier explicación sería apreciada.

Respuesta

18

Es un modificador para la expresión regular. El modificador x le dice a Perl que ignore el espacio en blanco y los comentarios dentro de la expresión regular.

En su código de ejemplo no hace la diferencia porque no hay espacios en blanco ni comentarios en la expresión regular.

+0

Gracias por la explicación clara. –

+1

puede valer la pena editar y mencionar que puede acceder a esto a través de 'perldoc perlre'; ¡está incluso en la primera página! – leander

5

En este caso de uso 'x' es un modificador de expresiones regulares que "Extiende la legibilidad de su patrón al permitir el espacio en blanco y los comentarios". de acuerdo con la documentación perl. Sin embargo, parece redundante aquí

+2

No es "redundante" sino "innecesario". –

+3

@clintp: ¿y la diferencia entre redundante (que significa "innecesario") e innecesario? –

+1

'redundante' no significa simplemente 'innecesario'. Significa "innecesario debido a otra cosa que sirve para el mismo propósito". En este caso, no hay nada más que le indique a la expresión regular que ignore los espacios en blanco/comentarios. Simplemente no hay espacios en blanco/comentarios, por lo que es innecesario ignorarlos. – pkaeding

6

La "x" en su primer caso, es un operador de repetición, que toma la cadena como el argumento de la izquierda y el número de veces para repetir como el argumento de la derecha. Perl6 puede replicar listas usando el operador de repetición "xx".

Su segundo ejemplo usa la expresión regular m{^a}x. Aunque puede usar muchos tipos diferentes de delimitadores, los neófitos pueden usar la notación familiar, que usa una barra diagonal: m/^a/x

La "x" en una expresión regular se llama modificador o bandera y es solo una de muchas banderas opcionales que pueden ser utilizadas. Se utiliza para ignorar espacios en blanco en el patrón de expresiones regulares, pero también permite el uso de comentarios normales en el interior. Debido a que los patrones de expresiones regulares pueden ser realmente largos y confusos, el uso del espacio en blanco y los comentarios son muy útiles.

Su ejemplo es muy corto (todo lo que dice es si la primera letra de la línea comienza con "a"), por lo que probablemente no necesitaría espacios en blanco ni comentarios, pero podría hacerlo si quisiera.


Ejemplo:

m/^a  # first letter is an 'a' 
     # <-- you can put more regex on this line because whitespace is ignored 
     # <-- and more here if you want 
/x 
+0

gracias vol7ron, no sabía que podrías poner comentarios en expresiones regulares –

Cuestiones relacionadas