Poseo este script el cual lo utilizo con cuatro opciones diferentes, traté (infructuosamente) de adaptarlo dentro de otro script (script-perl-pst2pdf-y-pdftex-t5369-30.html) con el que me han dado la mano en ocasiones anteriores, que sí utilizo con frecuencia, y me asaltan mis dudas con las maneras que tengo de leer el archivo de entrada (undef, local).
Sé que undef lee todo el archivo en memoria, pero, no sé cómo funciona local. El script es el siguiente:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use v5.14; # Versión mínima para que funcione
- use File::Basename; # Nombre de los archivos de entrada
- use Getopt::Long; # Leemos la opciones de entrada
- use autodie; # Vivir con honor o morir con gloria
- my $parserin = 0; # 1-> Comentamos código archivo entrada
- my $parserout = 0; # 1-> Descomentamos código archivo entrada
- my $tcolorbox = 0; # 1-> Reordenamos PSTexample para tcblising
- my $showexpl= 0; # 1-> Reordenamos PSTexample para swowxpl
- my $imageDir = "images"; # directorio de las imágenes (images por defecto)
- @ARGV == 0 && die "file name expected!\n";
- my @SuffixList = (".tex","",".ltx"); # extensión del archivo de entrada
- my ($name,$path,$ext) = fileparse($ARGV[0],@SuffixList);
- if ( $ext eq "" ) { $ext = ".tex"; } # fijamos la extensión
- my $TeXfile = "$path$name$ext";
- my $name_in_file = shift;
- my $name_out_file = "$name-tmp.tex";
- my $result = GetOptions ("parserin" => \$parserin, # Comentamos el archivo de entrada
- "imageDir=s" => \$imageDir, # string
- "parserout" => \$parserout, # Descomentamos el archivo de entrada
- "showexpl" => \$showexpl, # Reordenamos para showexpl
- "tcolorbox" => \$tcolorbox);# Reordenamos para tcblisiting
- if ($parserin) {
- $parserin = 1;
- }
- if ($parserout) {
- $parserout = 1;
- }
- if ($showexpl) {
- $showexpl = 1;
- }
- if ($tcolorbox) {
- $tcolorbox = 1;
- }
- if ($parserin) {
- ## Lectura del archivo
- open my $INEXAFILE, '<', $name_in_file;
- undef $/; # modo 'slurp'
- my $archivo_entrada = <$INEXAFILE>;
- close $INEXAFILE;
- ## Partición del documento
- my($cabeza,$cuerpo,$final) = $archivo_entrada =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
- ## Cambios a realizar
- my %cambios = (
- '\pspicture' => '\TRICKS',
- '\endpspicture' => '\ENDTRICKS',
- '\begin{pspicture' => '\begin{TRICKS',
- '\end{pspicture' => '\end{TRICKS',
- '\postscript' => '\POSTRICKS',
- '\begin{postscript}' => '\begin{POSTRICKS}',
- '\end{postscript}' => '\end{POSTRICKS}',
- );
- ## Variables y constantes
- my $no_del = "\0";
- my $del = $no_del;
- ## Reglas
- my $llaves = qr/\{ .+? \} /x;
- my $no_corchete = qr/(?:\[ .+? \])? /x;
- my $delimitador = qr/\{ (?<del>.+?) \} /x;
- my $verb = qr/verb [*]? /ix;
- my $lst = qr/lstinline (?!\*) $no_corchete /ix;
- my $mint = qr/mint (?!\*) $no_corchete $llaves /ix;
- my $marca = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1} /x;
- my $comentario = qr/^ \s* \%+ .+? $ /mx;
- my $definedel = qr/\\ (?: DefineShortVerb | lstMakeShortInline ) $no_corchete $delimitador /ix;
- my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves /ix;
- ## Cambiar
- while ($cuerpo =~
- / $marca
- | $comentario
- | $definedel
- | $indefinedel
- | $del .+? $del # delimitado
- /gimx) {
- my($pos_inicial, $pos_final) = ($-[0], $+[0]); # posiciones
- my $encontrado = ${^MATCH}; # lo encontrado
- given ($encontrado) {
- when (/$definedel/) { # definimos delimitador
- $del = $+{del};
- $del = "\Q$+{del}" if substr($del,0,1) ne '\\'; # es necesario "escapar" el delimitador
- }
- when (/$indefinedel/) { # indefinimos delimitador
- $del = $no_del;
- }
- default { # Aquí se hacen los cambios
- while (my($busco, $cambio) = each %cambios) {
- $encontrado =~ s/\Q$busco\E/$cambio/g; # es necesario escapar $busco, ya que contiene caracteres extraños
- }
- substr $cuerpo, $pos_inicial, $pos_final-$pos_inicial, $encontrado; # insertamos los nuevos cambios
- pos($cuerpo)= $pos_inicial + length $encontrado; # reposicionamos la siguiente búsqueda
- }
- }
- }
- ## Escritura del resultado
- open my $OUTEXAFILE, '>', $name_out_file;
- print $OUTEXAFILE "$cabeza\n$cuerpo\n$final\n";
- close $OUTEXAFILE;
- }
- if ($tcolorbox) {
- ## Lectura del archivo
- open my $INEXAFILE, '<', $name_in_file;
- my $archivo;
- {
- local $/;
- $archivo = <$INEXAFILE>;
- }
- close $INEXAFILE;
- ## cambios para tcblisting
- $archivo =~
- s/(?<inicio>\\begin\{PSTexample\}\[)(?<posicion>above|left) (?<opciones>.*?)(?:\]) \s+
- (?<graphics>(?<initpic>\\includegraphics\[ .+? \]\{) (?<picname>.+?) \})\s+(?<end>\\end\{PSTexample\})
- /$+{inicio}$+{posicion}$+{opciones}\]
- \\lstinputlisting[firstnumber=1,linerange=document-document]{$imageDir\/$+{picname}.tex}
- \\tcblower
- $+{graphics}
- $+{end}/gmxs;
- $archivo =~
- s/(?<inicio>\\begin\{PSTexample\}\[) (?<posicion>below|right) (?<opciones>.*?)(?:\]) \s+
- (?<graphics>(?<initpic>\\includegraphics\[ .+? \]\{) (?<picname>.+?) \})\s+(?<end>\\end\{PSTexample\})
- /$+{inicio}$+{posicion}$+{opciones}\]
- $+{graphics}
- \\tcblower
- \\lstinputlisting[firstnumber=1,linerange=document-document]{$imageDir\/$+{picname}.tex}
- $+{end}/gmxs;
- ## Grabar
- open my $OUTEXAFILE, '>', $name_in_file;
- print $OUTEXAFILE $archivo;
- close $OUTEXAFILE;
- }
- if ($showexpl) {
- ## Lectura del archivo
- open my $INEXAFILE, '<', $name_in_file;
- my $archivo;
- {
- local $/;
- $archivo = <$INEXAFILE>;
- }
- close $INEXAFILE;
- # cambios para showexpl
- $archivo =~
- s/(?<inicio>\\begin\{PSTexample\})(?:\[)? (?<opciones>.*?):? (?:\])? \s+
- (?<graphics>(?<initpic>\\includegraphics)(?<scale>\[ .+? \])(\{)(?<picname>.+?) \})\s+(?<end>\\end\{PSTexample\})
- /qq(\\LTXinputExample\[firstnumber=1,linerange=document-document,graphic=\{$+{scale}$imageDir\/$+{picname}}) . ($+{opciones} ? "," : "") . qq($+{opciones}\]
- {$imageDir\/$+{picname}.tex\})/gemxs;
- # Grabar
- open my $OUTEXAFILE, '>', $name_in_file;
- print $OUTEXAFILE $archivo;
- close $OUTEXAFILE;
- }
- # Vuelvo todo a la normalidad , debo cambiar el nombre del fichero de entrada
- if ($parserout) {
- ## Lectura del archivo
- open my $INEXAFILE, '<', $name_in_file;
- undef $/; # modo 'slurp'
- my $archivo_entrada = <$INEXAFILE>;
- close $INEXAFILE;
- ## Partición del documento
- my($cabeza,$cuerpo,$final) = $archivo_entrada =~ m/\A (.+? ^\\begin{document}) \s* (.+?) \s* (^ \\end{document}) \s* \z/msx;
- ## Cambios a realizar
- my %cambios = (
- '\TRICKS' => '\pspicture',
- '\ENDTRICKS' => '\endpspicture',
- '\begin{TRICKS' => '\begin{pspicture',
- '\end{TRICKS' => '\end{pspicture',
- '\begin{POSTRICKS}' => '\begin{postscript}',
- '\end{POSTRICKS}' => '\end{postscript}',
- );
- ## Variables y constantes
- my $no_del = "\0";
- my $del = $no_del;
- ## Reglas
- my $llaves = qr/\{ .+? \} /x;
- my $no_corchete = qr/(?:\[ .+? \])? /x;
- my $delimitador = qr/\{ (?<del>.+?) \} /x;
- my $verb = qr/verb [*]? /ix;
- my $lst = qr/lstinline (?!\*) $no_corchete /ix;
- my $mint = qr/mint (?!\*) $no_corchete $llaves /ix;
- my $marca = qr/\\ (?:$verb | $lst | $mint) (\S) .+? \g{-1} /x;
- my $comentario = qr/^ \s* \%+ .+? $ /mx;
- my $definedel = qr/\\ (?: DefineShortVerb | lstMakeShortInline ) $no_corchete $delimitador /ix;
- my $indefinedel = qr/\\ (?: UndefineShortVerb | lstDeleteShortInline) $llaves /ix;
- ## Cambiar
- while ($cuerpo =~
- / $marca
- | $comentario
- | $definedel
- | $indefinedel
- | $del .+? $del # delimitado
- /gimx) {
- my($pos_inicial, $pos_final) = ($-[0], $+[0]); # posiciones
- my $encontrado = ${^MATCH}; # lo encontrado
- given ($encontrado) {
- when (/$definedel/) { # definimos delimitador
- $del = $+{del};
- $del = "\Q$+{del}" if substr($del,0,1) ne '\\'; # es necesario "escapar" el delimitador
- }
- when (/$indefinedel/) { # indefinimos delimitador
- $del = $no_del;
- }
- default { # Aquí se hacen los cambios
- while (my($busco, $cambio) = each %cambios) {
- $encontrado =~ s/\Q$busco\E/$cambio/g; # es necesario escapar $busco, ya que contiene caracteres extraños
- }
- substr $cuerpo, $pos_inicial, $pos_final-$pos_inicial, $encontrado; # insertamos los nuevos cambios
- pos($cuerpo)= $pos_inicial + length $encontrado; # reposicionamos la siguiente búsqueda
- }
- }
- }
- ## Escritura del resultado
- open my $OUTEXAFILE, '>', $name_in_file;
- print $OUTEXAFILE "$cabeza\n$cuerpo\n$final\n";
- close $OUTEXAFILE;
- }
Coloreado en 0.008 segundos, usando GeSHi 1.0.8.4
Mi idea era poder ingresar esas cuatro opciones dentro del otro script como subfunciones, modificando los nombres de las variables y las rutas... en fin, quizás no es posible, por el momento me conformo con comprender las diferencias entre local y undef.
Saludos,
Pablo