• Publicidad

Escribir un bloque de texto basado en una opción

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Escribir un bloque de texto basado en una opción

Notapor pablgonz » 2015-04-19 20:18 @888

Hola a todos en el foro, tengo un script (que funciona) con opciones que paso por la línea de comando --xetex, --latex, --luatex y el archivo que paso como entrada guardado en $archivo, deseo agregar texto al principio dependiendo de la opción de entrada y luego guardar en un nuevo archivo. El código es el siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. else {
  2.     if ($xetex) {
  3.         my $preview = <<"EXTRA";
  4. \\AtBeginDocument\{
  5. \\RequirePackage\[xetex,active,tightpage\]\{preview\}
  6. \\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}%
  7. \\newenvironment\{postscript\}\{\}\{\}
  8. \\PreviewEnvironment\{postscript\}\}
  9. EXTRA
  10.  
  11.         # write
  12.         open my $SALIDA, '>', "$tempDir/$name-fig$ext";
  13.         print $SALIDA $preview . $archivo;
  14.         close $SALIDA;
  15.     }
  16.     elsif ($latex) {
  17.         my $preview = <<"EXTRA";
  18. \\AtBeginDocument\{
  19. \\RequirePackage\[active,tightpage\]\{preview\}
  20. \\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}%
  21. \\newenvironment\{postscript\}\{\}\{\}
  22. \\PreviewEnvironment\{postscript\}\}
  23. EXTRA
  24.  
  25.         # write
  26.         open my $SALIDA, '>', "$tempDir/$name-fig$ext";
  27.         print $SALIDA $preview . $archivo;
  28.         close $SALIDA;
  29.     }
  30.     else {
  31.         my $preview = <<"EXTRA";
  32. \\AtBeginDocument\{
  33. \\RequirePackage\[pdftex,active,tightpage\]\{preview\}
  34. \\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}%
  35. \\newenvironment\{postscript\}\{\}\{\}
  36. \\PreviewEnvironment\{postscript\}\}
  37. EXTRA
  38.  
  39.         # write
  40.         open my $SALIDA, '>', "$tempDir/$name-fig$ext";
  41.         print $SALIDA $preview . $archivo;
  42.         close $SALIDA;
  43.     }
  44. }                                              # close no preview
  45.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
Como varias partes del texto que deseo escribir son las mismas me gustaría escribirlo algo así (para ahorrar líneas y mantenerlo de forma más cómoda):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. else {
  2.     if ($xetex) {
  3.         my $opcion = 'xetex,';
  4.     }
  5.     elsif ($latex) {
  6.         my $opcion = '';
  7.     }
  8.     else {
  9.         my $opcion = 'pdftex,';
  10.     }
  11.  
  12.     my $preview = <<"EXTRA";
  13. \\AtBeginDocument\{
  14. \\RequirePackage\[$opcion active,tightpage\]\{preview\}
  15. \\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}%
  16. \\newenvironment\{postscript\}\{\}\{\}
  17. \\PreviewEnvironment\{postscript\}\}
  18. EXTRA
  19.  
  20.     # write
  21.     open my $SALIDA, '>', "$tempDir/$name-fig$ext";
  22.     print $SALIDA $preview . $archivo;
  23.     close $SALIDA;
  24. }
  25.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Es decir, deseo escribir un string que dependa de las opciones de entrada del script, lo he intentado un par de veces y no doy con la respuesta.

Agradecido,
Pablo

Cualquier ayuda se agradece.
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Publicidad

Re: Escribir un bloque de texto basado en una opción

Notapor explorer » 2015-04-19 21:29 @937

Solo tienes que definir la variable $opcion, como local, en el contexto adecuado.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. else {
  2.     my $opcion;
  3.  
  4.     if ($xetex) {
  5.         $opcion = 'xetex,';
  6.     }
  7.     elsif ($latex) {
  8.         $opcion = '';
  9.     }
  10.     else {
  11.         $opcion = 'pdftex,';
  12.     }
  13.  
  14.     my $preview = <<"EXTRA";
  15. \\AtBeginDocument\{
  16. \\RequirePackage\[${opcion}active,tightpage\]\{preview\}
  17. \\renewcommand\\PreviewBbAdjust\{-60pt -60pt 60pt 60pt\}%
  18. \\newenvironment\{postscript\}\{\}\{\}
  19. \\PreviewEnvironment\{postscript\}\}
  20. EXTRA
  21.  
  22.     # write
  23.     open my $SALIDA, '>', "$tempDir/$name-fig$ext";
  24.     print   $SALIDA $preview . $archivo;
  25.     close   $SALIDA;
  26. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

También hemos usado el truco de rodear la variable con llaves, para poder ponerla al lado del texto que le sigue ('active').

Otra forma de abreviar el código es usando el operador ternario '?:':
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $opcion = $xetex ? 'xetex,'
  2.            : $latex ? ''
  3.            :          'pdftex,'
  4.            ;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Escribir un bloque de texto basado en una opción

Notapor pablgonz » 2015-04-19 22:31 @980

Genial, era exacto lo que deseaba para poder modificar otras partes del script también.

La primera solución que propones la entiendo, pero, la segunda está más allá de mis posibilidades.

¿Podrías explicar un poco la segunda? Lo más entretenido de perl es ver que las cosas se pueden hacer de distinta forma y... mucha más cortas.

Agradecido.
Pablo
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)

Re: Escribir un bloque de texto basado en una opción

Notapor explorer » 2015-04-19 22:54 @996

El operador ternario (u operador condicional) es tan importante para los lenguajes de ordenador, que tiene su propia página en Wikipedia :) Ahí verás su definición y ejemplos en varios lenguajes.

Naturalmente, en Perl, también tiene su explicación, en las páginas de manual (en tu propio ordenador, ejecutando perldoc perlop). Te pongo la versión en español:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
  Operadores condicionales
    El ternario "?:" es el operador condicional, al igual que en C. Funciona
    como un if-then-else. Si el argumento que está antes del ? es verdadero,
    se devuelve el argumento que está antes del :, sino se devuelve el argumento
    después del :.

    Por ejemplo:

        printf "Tengo %d perro%s.\n", $n,
                ($n == 1) ? "" : "s";

    Contexto escalar o lista es propagado hacia adelante, en el segundo o
    tercer argumento, cualquiera que sea el seleccionado.

        $a = $ok ? $b : $c;  # obtiene un escalar
        @a = $ok ? @b : @c;  # obtiene un array
        $a = $ok ? @b : @c;  # ¡oops, esto solo cuenta!

    El operador puede ser asignado si tanto el segundo y tercer argumentos son
    valores-izquierda legales (lo que significa que se les puede asignar
    valores):

        ($a_or_b ? $a : $b) = $c;

    Debido a que este operador produce un resultado asignable, usar
    asignaciones sin paréntesis hará que se meta en problemas. Por ejemplo,
    esto:

        $a % 2 ? $a += 10 : $a += 2

    En realidad significa lo siguiente:

        (($a % 2) ? ($a += 10) : $a) += 2

    En lugar de esto:

        ($a % 2) ? ($a += 10) : ($a += 2)

    Esto, probablemente, se debería escribir de forma más sencilla como:

        $a += ($a % 2) ? 10 : 2;
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Escribir un bloque de texto basado en una opción

Notapor pablgonz » 2015-04-19 22:58 @999

Vale por la explicación, lo había visto antes en algunas soluciones del foro, pero no le había prestado la atención necesaria.

Saludos
pablgonz
Perlero nuevo
Perlero nuevo
 
Mensajes: 236
Registrado: 2010-09-08 21:03 @919
Ubicación: Concepción (Chile)


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron