Pregunta

Estoy intentando copiar algunos archivos de un recurso compartido de red a otro usando File :: Copy.

Este es mi código:

#!C:/strawberry/perl/bin/perl.exe
use File::Copy;
print "Content-type: text/html\n\n";
print "<H1>Hello World</H1>\n";
copy("s:\\nl\\cover\\config.jsp", "s:\\temp\\config.jsp") 
    or die "File cannot be copied.";
print "this is not displayed";

¿Por qué no se muestra el mensaje 'morir'?

¿Fue útil?

Solución

Si está ejecutando esto en un servidor web (no puedo imaginar por qué, está enviando un encabezado " Content-Type " ), cualquier mensaje de error que emita usando die y warn irán al registro de errores del servidor.

Además, si está invocando esto como CGI, tenga en cuenta que está mintiendo al navegador al afirmar que está enviando HTML y no HTML.

Especialmente si solo estás aprendiendo Perl, debes hacer un esfuerzo para puntear todas tus i sy cruzar todas tus t s:

#!C:/strawberry/perl/bin/perl.exe

use strict;   # every time
use warnings; # every time

use CGI qw(:cgi);
use CGI::Carp qw(fatalsToBrowser); # only during debugging

use File::Copy;
use File::Spec::Functions qw(catfile);

$| = 1;

# prefer portable ways of dealing with filenames
# see http://search.cpan.org/perldoc/File::Spec

my $source = catfile(qw(S: n1 cover config.jsp));
my $target = catfile(qw(S: temp config.jsp));

print header('text/plain');

if ( copy $source => $target ) {
    print "'$source' was copied to '$target'\n";
}
else {
    print "'$source' was not copied to '$target'\n";
    # you can use die if you want the error message to
    # go to the error log and an "Internal Server Error"
    # to be shown to the web site visitor.
    # die "'$source' was not copied to '$target'\n";
}

Consulte CGI para ver las listas de importación de interfaces orientadas a funciones.

Otros consejos

¿Estás enviando tu stderr a la secuencia stdout también? Todas sus impresiones llegarán a stdout, que presumiblemente está conectado a un navegador, dada su salida HTML.

Sin embargo, die escribe en la secuencia stderr. Es probable que esto no vaya a la ventana del navegador, sino a un registro de errores de algún tipo. En cuanto a dónde va, depende de lo que Perl esté ejecutando.

Una forma de verificar es imprimir algo en lugar de morir en la cláusula o .

Entonces, algunas preguntas:

  1. ¿Cómo lo estás ejecutando?
  2. Si está en la línea de comando, muéstrenos el comando exacto.
  3. Si está en un servidor web de algún tipo, díganos cuál puede encontrar los registros para usted.

die envía mensajes a STDERR, que terminará en los registros de errores del servidor web, no en la pantalla. Hay algunos módulos CGI que le ofrecen un mayor control sobre el manejo de errores, o puede instalar un controlador $ SIG {__ DIE__} (si no sabe qué es eso, entonces no se preocupe: - no es necesario), pero cuando quiero una forma rápida y sucia de depurar mis scripts CGI, pongo esto en la parte superior del script:

    #! /usr/bin/perl
    $src = join'',<DATA>;
    eval $src;
    print "Content-type: text/plain\n\n$@\n" if $@;
    __END__
    ... my cgi script starts here ...

Esto carga el script en una variable, usa eval para ejecutar el intérprete de Perl en el contenido de esa variable e imprime cualquier error en la salida estándar (la ventana del navegador) con un encabezado válido.

copy("s:\\nl\\cover\\config.jsp", "s:\\temp\\config.jsp") 
     or die "File cannot be copied.";
print "this is not displayed";

Solo se debe mostrar uno de estos mensajes y no está claro sobre qué está preguntando.

La pregunta dice te preguntas por qué no se muestra el mensaje die ; para mí, eso implica que no estás viendo el mensaje "El archivo no se puede copiar". y la razón más obvia para esto es que la operación de copia está teniendo éxito, pero vea también las respuestas anteriores sobre buscar en el registro de errores si está ejecutando esto en CGI.

El texto de los mensajes, sin embargo, sugiere que realmente quiere decir que no está viendo el mensaje "esto no se muestra". (¿Por qué si no mencionarías que no se muestra?) En ese caso, la razón por la que no lo estás viendo es porque die hace que el programa salga. Después de que la copy falla y el die se ejecuta, su programa está inactivo. Terminado. Se ha barajado esta CPU mortal y se ha unido a la pila eterna. No se imprime " esto no se muestra " si le pones cuatro millones de voltios. Es un ex proceso.

Después de editar su código, es evidente que su dado se ve como un comando y probablemente necesita escapar. Observe cómo se representa en Stack Overflow en azul (lo que indica que es una palabra clave). Intente cambiar a un sinónimo como " shutdown " en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top