Estoy escribiendo un script y me asaltaron un par de dudas con algunas líneas que deseo se modifiquen si están dentro de un if(){...} (esa es mi duda principal) y respecto de cómo hacer un par de cosas.
Me explico. El esqueleto del script que poseo es el siguiente:
Using perl Syntax Highlighting
- #!/usr/bin/perl
- use v5.24;
- use Getopt::Long qw(:config bundling_values require_order no_ignore_case);
- ### Variables
- my $DPI = "150";
- my $arara = 0;
- my $latex = 0;
- my $dvips = 0;
- my $dvipdf = 0;
- my $xetex = 0;
- my $luatex = 0;
- my $pdf = 1;
- my $bmp = 0;
- my $tif = 0;
- my $png = 0;
- my $jpg = 0;
- my $gray = 0;
- my $verbose = 0;
- my $help = 0;
- my @clean = 'doc';
- ### Uso
- my $usage = <<'USAGE';
- Uso: myscript [options] <file>.<ext>
- myscript --latex <file>.<ext>
- USAGE
- ### Error
- sub errorUsage { die "@_ (Use --help para vel las opciones)\n"; }
- ### Getopt::Long configuration
- my $result=GetOptions (
- # formatos imagen
- 'd|dpi=i' => \$DPI, # entero
- 'b|bmp' => \$bmp, # gs
- 't|tif' => \$tif, # gs
- 'j|jpg' => \$jpg, # gs
- 'p|png' => \$png, # gs
- 'g|gray' => \$gray, # gray
- # compiladores
- 'arara' => \$arara, # arara compiler
- 'xetex' => \$xetex, # xelatex compiler
- 'latex' => \$latex, # latex compiler
- 'luatex' => \$luatex, # lualatex compiler
- 'dvips' => \$dvips, # dvips compiler
- 'dvipdf' => \$dvipdf, # dvipdfmx compiler
- # clean
- 'clean=s{1}' => \@clean, # pst doc tikz off all
- # default
- 'help' => \$help, # help
- 'pdf!' => \$pdf, # pdf
- 'verbose' => \$verbose, # verbose
- ) or die $usage;
- ### Help
- if ($help) {
- print $usage;
- exit(0);
- }
- ### Validar clean
- my %clean = map { $_ => 1 } @clean;
- ### Veamos clean
- if(exists($clean{off})){
- say "$clean{off}";
- }
- if(exists($clean{pst})){
- say "$clean{pst}";
- }
- ### --shell-escape
- my $write18 = '-shell-escape';
- $write18 = '-enable-write18' if defined($ENV{"TEXSYSTEM"}) and
- $ENV{"TEXSYSTEM"} =~ /miktex/i;
- ### Opciones del compilador
- my $opt_compiler = $verbose ? "$write18 -interaction=nonstopmode -recorder"
- : "$write18 -interaction=batchmode -recorder"
- ;
- ### Compiladores
- my $compiler = $xetex ? "xelatex $opt_compiler"
- : $luatex ? "lualatex $opt_compiler"
- : $latex ? "latex $opt_compiler"
- : $dvips ? "latex $opt_compiler"
- : $dvipdf ? "latex $opt_compiler"
- : $arara ? 'arara'
- : "pdflatex $opt_compiler"
- ;
- ### Probamos por defecto
- say "$compiler archivo.tex";
- ### Ahora si se usa $latex cambiamos
- $compiler = "pdflatex $opt_compiler" if $latex;
- say "$compiler archivo.tex";
- #### DEVICE usados por GS
- my $opt_gs_dev = $pdf ? '-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress'
- : $gray ? '-sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -sColorConversionStrategy=Gray -dProcessColorModel=/DeviceGray'
- : $png ? "-sDEVICE=pngalpha -r$DPI"
- : $bmp ? "-sDEVICE=bmp32b -r$DPI"
- : $jpg ? "-sDEVICE=jpeg -r$DPI -dJPEGQ=100 -dGraphicsAlphaBits=4 -dTextAlphaBits=4"
- : $tif ? "-sDEVICE=tiff32nc -r$DPI"
- : ''
- ;
- my $ghostcmd = "gs -q -dNOSAFER $opt_gs_dev";
- if($pdf){
- say "$ghostcmd -o salida entrada";
- }
- if($gray){
- say "$ghostcmd -o salida entrada";
- }
- if($png){
- say "$ghostcmd -o salida entrada";
- }
- if($bmp){
- say "$ghostcmd -o salida entrada";
- }
- if($tif){
- say "$ghostcmd -o salida entrada";
- }
- __END__
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Cuando defino $compiler se comporta como lo deseo, es decir, si paso alguna opción este va cambiando su valor acorde a la opción, claro. En este caso las opciones son mutuamente exclusivas y en algún punto del script deseo modificar un solo valor (línea 98)
Using perl Syntax Highlighting
- $compiler = "pdflatex $opt_compiler" if $latex;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
En las líneas 101 a la 111 donde defino $opt_gs_dev y $ghostcmd es donde está mi gran consulta. Las opciones (eps, pdf, png, tif, bmp) no son mutuamente exclusivas y se pueden pasar más de una a la vez. La idea es que cambie acorde al bloque en el que está escrito, es decir, si $ghostcmd está dentro de if($tif){...} debería valer
Y así con el resto de los bloques.
La pregunta es, ¿qué modificaciones debo hacer para lograr esto? O mejor dicho, ¿se puede hacer esto? Sé que si escribo el código por separado dentro de cada if funcionará, pero, me gustaría dejarlo de esta manera.
Y para terminar, una de las opciones que pasaré al script es clean la cual solo puede tomar cuatro valores (pst, doc, tikz, off, all). Me gustaría que al tomar la opción off "desactivara" todas las otras; al tomar all las activara todas y que pst o tikz activara doc también. Sé que jugando con exists, or y !exists lo puedo hacer pero, quizás exista una forma más cómoda de hacerlo.
Agradecido de antemano,
Pablo