2010-03-09 13 views
5

En el espíritu de la "Perl Preamble", donde un script funciona adecuadamente si es ejecutado por un intérprete de scripts de shell o intérprete Perl ...hacer que mi archivo legible ya sea como Perl o HTML

Tengo un script en Perl que contiene un documento HTML embebido (como "heredoc"), es decir:

#!/usr/bin/perl 

... some Perl code ... 

my $html = <<'END' ; 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML><HEAD> 

... more HTML ... 

</HTML> 
END 

... Perl code that processes $html ... 

me gustaría ser capaz de trabajar en el código HTML que hay dentro de la secuencia de comandos Perl y comprobar que funciona usando un navegador web, y sólo corren el script cuando el HTML es de la manera que quiero. Para lograr esto, necesito que el archivo se pueda abrir como un archivo HTML y como un script de Perl.

He intentado varios trucos con los comentarios de Perl y los comentarios HTML, pero no puedo conseguirlo del todo perfecto. El archivo como un todo no tiene que ser HTML "estrictamente legal" (aunque el documento incrustado debería ser) ... solo visualizable en un navegador sin (o mínimo) basura Perl visible.

EDITAR: ¡Solucionado! Ver mi propia respuesta

+2

Creo que su conjunto solución es el conjunto vacío. Si tiene la intención de asociar perl con el archivo mediante un shbang, entonces necesita la primera línea. Un comentario SGML no puede ocurrir antes de esta línea, por lo que mostrarás el shbang, y la mayoría de los navegadores lo colocarán como si fuera su propio documento, incluso si genera HTML no estándar. – Axeman

+0

¡Solo agrega un poco de Javascript para eliminar el shebang del DOM! – jrockway

+0

@Axeman, consulte el conjunto vacío a continuación;) – JoelFan

Respuesta

6

leerlo y WEAP Sr. @Axeman ... Me presento ahora el conjunto vacío:

</dev/fd/0 eval 'exec perl -x -S $0 ${1+"[email protected]"}' #> <!-- 
#!perl 

... some Perl code ... 

my $html = << '<!-- END' ; # --> 
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
<HTML><HEAD> 

... more HTML ... 

</HTML> 
<!-- END 

... Perl code that processes $html ... 

# --> 
+2

Buen truco. Aunque todavía recomendaría no hacerlo. Deberías tener cosas separadas en lugares separados. –

+3

Te felicito por tu astucia. – Axeman

+3

+1 por hackishness impresionante.Pero, para el código de producción o cualquier otra circunstancia donde la mantenibilidad es incluso una preocupación menor, sigo manteniendo que el uso de plantillas (como se sugiere en la respuesta que presenté ayer) le causará mucho menos dolor a largo plazo. –

5

Esto suena como un camino al dolor. Considere almacenar el HTML en un archivo separado y leerlo dentro del script.

0

¿Ha considerado poner Perl dentro de de HTML?

Me gusta ASP4 does does?

Es mucho fácil de esa manera - confía en mí ;-)

+1

Clearly Template :: Refine es el mejor enfoque;) – jrockway

+0

Interesante ... no ... ** impresionante **! – JDrago

4

Tal vez este es un trabajo para Markup::Perl:

# don't write this... 
    print "Content-type: text/html;\n\n"; 
    print "<html>\n<body>\n"; 
    print "<p>\nYour \"lucky number\" is\n"; 
    print "<i>", int rand 10, "</i>\n</p>\n"; 
    print "</body>\n</html>\n"; 

    # write this instead... 
    use Markup::Perl; 
    <html><body><p> 
    Your "lucky number" is 
    <i><perl> print int rand 10 </perl></i> 
    </p></body></html> 

También podría caer la línea use Markup::Perl y ejecutar la secuencia de comandos como

perl -MMarkup::Perl my_page_with_embedded_perl.html 

Luego, la página debería mostrarse bastante bien.

+0

Eso es definitivamente genial ... – JoelFan

3

Me parece que desea una solución de plantillas, como Template::Toolkit o HTML::Template. Incrustar HTML en tu código o incrustarlo en tu HTML es una receta para el dolor.

Cuestiones relacionadas