¿Cómo puedo quitar los comentarios de bloque con Perl?
Pregunta
Estoy trabajando en un preprocesador que está analizando una conexión DSL. Mi objetivo es eliminar los comentarios.
La instalación de bloque de comentario está demarcada por %%
antes y después. No tienen que preocuparse por %% estar en cadenas, por la definición de la lengua.
Estoy utilizando esta expresión regular s///
. Por desgracia, parece coincidir con todo y limpiarlo hacia fuera:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
¿Qué estoy haciendo mal?
Solución
La primera cosa que puede hacer es asegurarse de que no expansivo:
.*?
lo contrario,
%% %% un texto
contenido real
%% %% otro texto
todos serán eliminados.
Otros consejos
La mayoría de la gente quiere decir que evitamos codiciosos coinciden tanto como les sea posible. técnicamente hablando, en realidad es que los cuantificadores son codiciosos en lugar de todo el patrón (, *, +, {}?); Perl prefiere avaricia local y la satisfacción inmediata a la codicia global. Para obtener versiones no codiciosos de los mismos cuantificadores, utilice (??, * + ?, ?, {}?).
Un ejemplo:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
Observe cómo la segunda sustitución detuvo a juego tan pronto como se encontró con "y". Los *? cuantificador dice efectivamente el motor de expresiones regulares para encontrar una coincidencia lo más rápido posible y pasar el control a todo lo que es el siguiente en línea, al igual que lo haría si estuviera jugando patata caliente.
asumiendo que ha leído el código entero en el $ cadena variable y entre %% %% y no hay posibilidad de un solo occuring%, podría utilizar esto.
$ str = ~ s / %% ([^%] +) %% // g;