Pergunta

Eu estou tentando copiar alguns arquivos de um compartilhamento de rede para outro usando File :: Copy.

Este é meu 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 que a mensagem 'die' não processar?

Foi útil?

Solução

Se você estiver executando isso em um servidor web (eu não posso imaginar por que, você está enviando um cabeçalho "Content-Type"), quaisquer mensagens de erro que emitem usando die e warn vai para o log de erro do servidor.

Além disso, se você está invocando este como CGI, nota que você está mentindo para o navegador, alegando que você está enviando HTML e não envio de HTML.

Especialmente se você está apenas aprendendo Perl, você deve fazer um esforço para pontilham toda a sua i S e atravessar toda a sua 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";
}

CGI para as listas de importação de interface de função orientada.

Outras dicas

Você está enviando o seu stderr para o fluxo de saída padrão também? Todas as suas impressões tem que stdout que é presumivelmente ligado a um navegador, dada a sua saída HTML.

No entanto, die grava no fluxo stderr. Esta é provável que vá, não para a janela do navegador, mas para um log de erro de algum tipo. Como para onde ele está indo, isso depende do que Perl está sendo executado dentro.

Uma maneira de verificar é print algo em vez de dieing na cláusula or.

Assim, algumas perguntas:

  1. Como você está executando-o?
  2. Se na linha de comando, mostra-nos o comando exato.
  3. Se em um servidor web de algum tipo, nos diga qual deles para que possamos encontrar os logs para você.

die envia mensagens para STDERR, que acabam em logs de erros do servidor web, não na tela. Existem alguns módulos CGI que oferecem maior controle sobre o tratamento de erros, ou você pode instalar um manipulador $SIG{__DIE__} (se você não sabe o que é isso, então não se preocupe - você não precisa), mas quando Eu quero uma maneira rápida e suja para depurar meus scripts CGI, eu coloquei isso no topo do script:

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

Isso carrega o script em uma variável, usos eval para executar o intérprete Perl em conteúdos que de variáveis, e imprime erros na saída padrão (a janela do navegador) com um cabeçalho válido.

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

Apenas uma destas mensagens nunca deve ser exibido e não está claro o que você está perguntando sobre.

A questão diz você está se perguntando por que a mensagem die não está sendo exibido; para mim, isso implica que você não está vendo a mensagem "O arquivo não pode ser copiado." e a razão mais óbvia para isso é que a operação de cópia está tendo sucesso, mas ver também as respostas anteriores sobre a procura no log de erro se você estiver executando isso em CGI.

O texto das mensagens, no entanto, sugere que você realmente quer dizer que você não está vendo a mensagem "este não é exibido". (Por que mais você mencionar que não é exibido?) Nesse caso, a razão que você não está vendo é porque die faz com que o programa para sair. Após a copy falha e executa a die, seu programa está morto. Encerrado. Ele tem baralhado fora desta CPU mortal e se juntou a pilha eterna. Não seria print "this is not displayed" se você colocar quatro milhões de volts através dele. É um ex-processo.

Depois de editar o seu código, é evidente que o dado é visto como um comando e provavelmente precisa ser escapado. Observe como ele é processado no Stack Overflow em azul (indicando que é uma palavra-chave). Tente mudar para um sinônimo como "shutdown" vez.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top