Primero, tendría que quedar claro qué es lo que pretendes hacer.
Por el código, parece que el usuario va a subir una imagen, que guardarás en un directorio; luego, obtendrás una serie de datos, como la IP y el puerto; luego, mostrarás una página con el efecto de tecleo; y, finalmente, eliminar todos los ficheros del directorio temporal.
Este último paso es el que no entiendo: si estás usando el módulo CGI, es el propio módulo el que se encarga de eliminar el fichero subido del directorio temporal, en cuanto se termina el programa: tú no tienes que hacer nada para que se borre. Si quieres aumentar la seguridad, puedes agregar la opción -private_tempfiles para aumentar más las opciones de seguridad en el borrado de los ficheros temporales, pero solo es una medida de seguridad extrema: el fichero seguirá siendo borrado al final de la ejecución.
use CGI qw(:standard -private_tempfiles);Lo que tampoco entiendo es porqué quieres enviar un print() después de los 30 segundos. Si no existiera ese print(), se podrían cerrar los canales estándar más rápido, y así dar la oportunidad de que la página se presente antes.
Esta versión sí que envía toda la página, cierra los canales, y permite seguir ejecutando el cgi.
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;
use CGI ':standard';
use CGI::Carp 'fatalsToBrowser';
$|++; # no caché
my $estilo_css = <<END_CSS;
<!--
.Estilo1 {
color: #FF0000;
font-weight: bold;
}
-->
END_CSS
my $javascript = <<END_JS;
var mensaje =
'Mensaje 1.' +
'Mensaje 2.' +
'Mensaje 3.' +
'Mensaje 4.'
;
var largo = mensaje.length - 1;
var i = 0;
var cursor = '_';
function teclear() {
if (i == largo) cursor = '';
var ttecleado = document.getElementById("ttecleado");
var texto = ttecleado.innerHTML;
var letra = mensaje.charAt(i);
texto = texto.substring(0,texto.length -1);
if (letra == '.') {
ttecleado.innerHTML = texto + '<br />' + cursor;
}
else {
ttecleado.innerHTML = texto + letra + cursor;
}
if (i++ < largo) setTimeout("teclear()",100);
}
END_JS
print
header(),
start_html(
-title => 'Mi pagina web',
-style => {
-code => $estilo_css,
},
-script => {
-type => 'text/javascript',
-code => $javascript,
},
-onLoad => "setTimeout('teclear()', 0)",
),
p({-align=>'center'},
img({-src => 'logo.gif', -width => 800, -height => 212}), br,
'Bienvenidos',
),
div({-class => 'Estilo1', -align=> 'center', -id => 'ttecleado'}
),
end_html(),
;
open my $oldout, ">&STDOUT"; # Duplicamos el canal de salida para que el system() funcione
close STDOUT; # cerramos los canales para indicar fin de salida
close STDERR; # con estos dos primeros sería suficiente
close STDIN; # pero cerramos la entrada estándar para estar más seguros
system("(sleep 30; rm -f /tmp/*) &"); # ejecución en segundo plano
exit(1);
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Hay muchas limitaciones en cuanto cierras los canales de comunicaciones. Quiero decir que no puedes hacer un
sleep 30; desde Perl, porque requiere que algunos de esos canales estén abiertos.
Ahora ya es posible ejecutar el system() con operaciones en segundo plano, mientras la página está completamente enviada y funcionando.
Seguro que se me ha pasado algo y se podría realizar de alguna otra manera, como por ejemplo, con fork(), como se comenta
aquí.
Los cambios principales con tu programa son:
* ';' en los finales de líneas en el código JavaScript
* ahora en la salida del texto en JavaScript no se ven los caracteres que forman parte del código HTML. Lo que se hace es analizar cada carácter y si es un '.' se traduce por un
br.
* generación de código HTML usando las funciones importadas desde CGI. Puede parecer un poco más largo, pero evitas algunos errores de escritura, como los que tienes en el <div>, que le faltan comillas a los atributos y sobra una '?'. Y header() me saca el Content-Type.