Question

J'essaie de copier certains fichiers d'un partage réseau à un autre en utilisant Fichier :: Copier.

Ceci est mon code:

#!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";

Pourquoi le message 'die' ne s'affiche-t-il pas?

Était-ce utile?

La solution

Si vous exécutez cette opération sous un serveur Web (je ne vois pas pourquoi, vous envoyez un en-tête "Content-Type" ), les messages d'erreur que vous émettez à l'aide de . die et warn iront au journal des erreurs du serveur.

De plus, si vous appelez cela en tant que CGI, notez que vous mentez au navigateur en prétendant que vous envoyez du HTML et non du HTML.

Surtout si vous apprenez tout simplement Perl, vous devriez essayer de placer tous vos i et de les croiser :

#!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";
}

Voir CGI pour les listes d'importation d'interface orientée fonction.

Autres conseils

Envoyez-vous également votre stderr au flux stdout? Toutes vos impressions devront être sur stdout, qui est probablement connecté à un navigateur, en fonction de votre sortie HTML.

Cependant, die écrit dans le flux stderr. Cela risque d’aller non pas dans la fenêtre du navigateur, mais dans un journal d’erreurs quelconque. Pour ce qui est de l’orientation, tout dépend de ce que Perl exécute.

Une façon de vérifier consiste à imprimer quelque chose au lieu de die dans la clause ou .

Donc, quelques questions:

  1. Comment ça se passe?
  2. Si vous êtes sur la ligne de commande, montrez-nous la commande exacte.
  3. Si vous êtes sur un serveur Web, dites-nous lequel pour que nous puissions trouver les journaux pour vous.

die envoie des messages à STDERR, qui s’afficheront dans les journaux d’erreurs du serveur Web et non à l’écran. Certains modules CGI vous offrent un meilleur contrôle de la gestion des erreurs. Vous pouvez également installer un gestionnaire $ SIG {__ DIE __} (si vous ne savez pas ce que c'est, alors ne vous inquiétez pas - - vous n’avez pas besoin de), mais lorsque je veux un moyen rapide de déboguer mes scripts CGI, je mets ceci en haut du script:

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

Ceci charge le script dans une variable, utilise eval pour exécuter l'interpréteur Perl sur le contenu de cette variable et affiche les erreurs éventuelles sur la sortie standard (la fenêtre du navigateur) avec un en-tête valide.

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

Un seul de ces messages devrait jamais être affiché et il est difficile de savoir de quoi vous parlez.

La question dit que vous vous demandez pourquoi le message die n'est pas affiché; Pour moi, cela signifie que vous ne voyez pas le message "Le fichier ne peut pas être copié". et la raison la plus évidente est que l'opération de copie a réussi, mais consultez aussi les réponses précédentes concernant la recherche dans le journal des erreurs si vous l'exécutez sous CGI.

Cependant, le texte des messages suggère que vous voulez dire que vous ne voyez pas le message "ceci n'est pas affiché". (Dans le cas contraire, pourquoi ne mentionnez-vous pas qu'il n'est pas affiché?) Dans ce cas, la raison pour laquelle vous ne le voyez pas est parce que die entraîne la fermeture du programme. Après que la copie ait échoué et que le die soit exécuté, votre programme est mort. Terminé. Il a mélangé ce processeur mortel et rejoint la pile éternelle. print "ne sera pas affiché" si vous y mettez quatre millions de volts. C'est un ex-processus.

Après avoir modifié votre code, il est évident que votre dé est considéré comme une commande et doit probablement être échappé. Notez comment il est rendu sur Stack Overflow en bleu (indiquant qu'il s'agit d'un mot clé). Essayez de passer à un synonyme tel que "arrêt" & <; code> à la place.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top