2009-06-01 11 views
5

Tengo un programa de Perl que lee en un montón de datos, lo combina y luego da salida a varios formatos de archivo diferentes. Me gustaría hacer que Perl sea uno de esos formatos (en forma de un paquete .pm) y permitir que las personas usen los datos munged dentro de sus propios scripts de Perl.¿Cuál es una manera fácil de imprimir una cadena de varias líneas sin sustitución de variables en Perl?

La impresión de los datos es fácil usando .

También me gustaría imprimir algunas funciones auxiliares para el paquete resultante.

¿Cuál es una manera fácil de imprimir una cadena de múltiples líneas sin sustitución de variables?

me gustaría ser capaz de hacer:

print <<EOL; 
    sub xyz { 
    my $var = shift; 
    } 
EOL 

Pero entonces tendría que escapar todos los $ 's.

¿Hay una manera simple de hacer esto? Tal vez puedo crear un submarino real y tener algo de magia. Impresora bonita. ¿Imprimir los contenidos? El código impreso no tiene que coincidir con la entrada o incluso ser legible.

+0

Recomendaría mirar Data :: Dump :: Streamer porque es más exacto que Data :: Dumper. – Schwern

Respuesta

1

Intente escribir su código como una subrutina de perl real, luego use B::Deparse para obtener el código fuente en tiempo de ejecución.

+3

B :: Deparse no captará correctamente los cierres, que son más comunes de lo que uno podría pensar. Utilice Data :: Dump :: Streamer. – Schwern

+0

@Schwern: B :: Deparse hace una cosa con los cierres (suponiendo que el contexto eval es correcto), Data :: Dump :: Streamer hace otro (suponiendo que las variables cerradas no son utilizadas por otra cosa que no sea el código objeto de dumping). Ninguno podría decirse que "no es apropiado". – ysth

+1

Si está creando una subrutina de Perl real, no la escriba en absoluto. Haz que sea una biblioteca. Este no es un juego de Mousetrap :) –

40

Incluya el nombre del delimitador en comillas simples y no se producirá la interpolación.

print <<'EOL'; 
    sub xyz { 
    my $var = shift; 
    } 
EOL 
+4

No hay amor" aceptado "por la respuesta correcta. ( –

+2

Está bien, supongo que tendré que llorar para dormir sobre una pila de puntos de reputación monstruosamente grandes –

4

Se puede usar un paquete de plantillas como Template::Toolkit o Text::Template.

O, usted podría rodar su propio sistema de plantillas primitiva que se ve algo como esto:

my %vars = qw(foo 1 bar 2); 
Write_Code(\$vars); 

sub Write_Code { 
    my $vars = shift; 

    my $code = <<'END'; 

    sub baz { 
     my $foo = <%foo%>; 
     my $bar = <%bar%>; 

     return $foo + $bar; 
    } 

END 

    while (my ($key, $value) = each %$vars) { 
     $code =~ s/<%$key%>/$value/g; 
    } 

    return $code; 
} 

Esto parece agradable y simple, pero hay varias trampas y trucos que le esperan si bricolaje. ¿Notaste que no usé quotemeta en mis nombres clave en la sustitución?

Recomiendo que utilice una biblioteca de plantillas probada por el tiempo, como las que he mencionado anteriormente.

+1

+1 para la recomendación de usar un módulo de plantilla. Por favor, no haga rodar el suyo :-) –

2

Utilice una sección de datos para almacenar el código Perl:

#!/usr/bin/perl 

use strict; 
use warnings; 

print <DATA>; 
#print munged data 

__DATA__ 
package MungedData; 

use strict; 
use warnings; 

sub foo { 
    print "foo\n"; 
} 
2

En realidad se puede seguir una cadena literal en la línea siguiente, así:

my $mail = "Hello! 

Blah blah."; 

En lo personal, me parece que sea más legible que heredocs (la cosa <<<EOL mencionada en otro lugar).

doble cita "interpola las variables, pero se puede utilizar 'Tenga en cuenta que tendrá que escapar de cualquier' en su cadena para que esto funcione.

Perl es en realidad muy rica en cosas convenientes para hacer las cosas más legible , por ejemplo, otras operaciones de cotización.qq y q corresponden a "y" y se puede utilizar cualquier delimitador tiene sentido:

my $greeting = qq/Hello there $name! 
Nice to meet you/; # Interpolation 

my $url = q|http://perlmonks.org/|;  # No need to escape/

(Nótese cómo los colores de sintaxis aquí no acababa de mantenerse al día)

Leer perldoc perlop (encontrar en la página:" Quote and Quote-like Operators ") para más información

Cuestiones relacionadas