Expresión regular en una función pasando un string
Publicado: 2016-07-31 13:19 @597
Hola a todos en el foro.
Tengo escrito un pequeño script para capturar las primeras líneas de un archivo dividiendo éste por medio de una expresión regular para luego analizar la sección que deseo con otras expresiones regulares para pasar las capturas a un array.
El script retorna el resultado esperado de manera correcta. Las líneas que deseo capturar son de la forma
y siempre van en una sola línea.
(Nota: el & #058; anterior corresponde a un carácter ':')
Solo me interesan las palabras entre {...}, sin los espacios ni las comas para pasarlas a un par de array ya definidos, con la excepción de escapar : { § } que es un carácter único y solo deseo quitar los espacios en blanco. Las líneas que contengan !myscript no deseo capturarlas.
Con el siguiente código:
Obtengo lo que deseo, pero repito varias veces el mismo código para las palabras que irán en un array y en el futuro extenderé los casos que deseo capturar. ¿Puedo escribir esto como una función? ¿o escribir el código de manera más compacta?
Saludos.
Tengo escrito un pequeño script para capturar las primeras líneas de un archivo dividiendo éste por medio de una expresión regular para luego analizar la sección que deseo con otras expresiones regulares para pasar las capturas a un array.
El script retorna el resultado esperado de manera correcta. Las líneas que deseo capturar son de la forma
Using text Syntax Highlighting
- % myscript : extraer : { extraer1, extraer2, extraer3} % (se captura)
- %%%%myscript:saltar:{algo, algo2 , algo3 } % (se captura)
- % myscript : escapar : { § } % (se captura)
- % !myscript : proteger : {archivo.txt, archivo_25.doc} % (no se captura)
- % myscript : borrar: {archivo_3.txt, archivo_5.doc}% (se captura)
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
y siempre van en una sola línea.
(Nota: el & #058; anterior corresponde a un carácter ':')
Solo me interesan las palabras entre {...}, sin los espacios ni las comas para pasarlas a un par de array ya definidos, con la excepción de escapar : { § } que es un carácter único y solo deseo quitar los espacios en blanco. Las líneas que contengan !myscript no deseo capturarlas.
Con el siguiente código:
Using perl Syntax Highlighting
- #!/usr/bin/env perl
- use v5.22;
- use Text::ParseWords;
- ### test
- my $archivo = '
- % myscript : extraer : { extraer1, extraer2, extraer3} %
- %%%%myscript:saltar:{algo, algo2 , algo3 } %
- % myscript : escapar : { § }
- % !myscript : proteger : {archivo.txt, archivo_25.doc} %%
- % myscript : borrar: {archivo_3.txt, archivo_5.doc}
- \documentclass{article}%
- \begin{document}
- \begin{verbatim}
- \documentclass{article}%
- \end{verbatim}
- \end{document}
- lineas ignoradas
- ';
- ### Palabras
- my $extraer = 'extraer'; # palabra
- my $saltar = 'saltar' ; # palabra
- my $escapar = 'escapar'; # carácter único
- my $proteger = 'proteger'; # nombres de archivo .algo
- my $borrar = 'borrar'; # nombres de archivo .algo
- ### Array
- my @extraer_tmp = qw (
- postscript tikzpicture pgfpicture
- );
- my @saltar_tmp = qw ();
- my @proteger_tmp = qw ();
- my @borrar_tmp = qw ();
- ### Dividir
- my($optin,$documento) = $archivo =~ m/\A (.+?) (\\documentclass.*)\z/msx;
- ### Reglas
- my $del = qr/ (?:\s* [:] \s*)/x;
- # my $inicio = qr/^(?:[%]+?\s*? myscript)/x;
- my $llaves = qr/ (?:[{])(.+?)(?:[}]) /x;
- ### extraer en el archivo de entrada
- my ($extraer_in) = $optin =~ m/^(?:[%]+?\s*? myscript) $del $extraer $del $llaves/msx;
- my @extraer_in = $extraer_in;
- s/^\s*|\s*//mg foreach @extraer_in;
- my @extraer_ok = quotewords('\,', 0,@extraer_in);
- push(@extraer_tmp,@extraer_ok);
- say "Esto contiene extraer_tmp : @extraer_tmp";
- ### saltar en el archivo de entrada
- my ($saltar_in) = $optin =~ m/^(?:[%]+?\s*? myscript) $del $saltar $del $llaves/msx;
- my @saltar_in = $saltar_in;
- s/^\s*|\s*//mg foreach @saltar_in; # quitar espacios en blanco
- my @saltar_ok = quotewords('\,', 0,@saltar_in);
- push(@saltar_tmp,@saltar_ok);
- say "Esto contiene saltar_tmp: @saltar_tmp";
- ### escapar en el archivo de entrada
- my ($escapar_in) = $optin =~ m/^(?:[%]+?\s*? myscript) $del $escapar $del $llaves/msx;
- my @escapar_in = $escapar_in;
- s/^\s*|\s*//mg foreach @escapar_in; # quitar espacios en blanco
- my $escapar = join '', @escapar_in;
- say "Esto contiene escapar: $escapar";
- ### proteger en el archivo de entrada
- my ($proteger_in) = $optin =~ m/^(?:[%]+?\s*? myscript) $del $proteger $del $llaves/msx;
- my @proteger_in = $proteger_in;
- s/^\s*|\s*//mg foreach @proteger_in; # quitar espacios en blanco
- my @proteger_ok = quotewords('\,', 0,@proteger_in);
- push(@proteger_tmp,@proteger_ok);
- say "Esto contiene proteger_tmp: @proteger_tmp";
- ### borrar en el archivo de entrada
- my ($borrar_in) = $optin =~ m/^(?:[%]+?\s*? myscript) $del $borrar $del $llaves/msx;
- my @borrar_in = $borrar_in;
- s/^\s*|\s*//mg foreach @borrar_in; # quitar espacios en blanco
- my @borrar_ok = quotewords('\,', 0,@borrar_in);
- push(@borrar_tmp,@borrar_ok);
- say "Esto contiene borrar_tmp: @borrar_tmp";
- __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Obtengo lo que deseo, pero repito varias veces el mismo código para las palabras que irán en un array y en el futuro extenderé los casos que deseo capturar. ¿Puedo escribir esto como una función? ¿o escribir el código de manera más compacta?
Saludos.