Сообщение CGI-скриптов не отображается в браузере?

StackOverflow https://stackoverflow.com/questions/1636221

  •  06-07-2019
  •  | 
  •  

Вопрос

Я пытаюсь скопировать некоторые файлы из одной сетевой папки в другую, используя File :: Copy.

Это мой код:

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

Почему сообщение 'die' не отображается?

Это было полезно?

Решение

Если вы запускаете это на веб-сервере (я не могу понять почему, вы отправляете заголовок " Content-Type " ), любые сообщения об ошибках, которые вы отправляете с помощью die и warn попадут в журнал ошибок сервера.

Кроме того, если вы вызываете это как CGI, обратите внимание, что вы лжете браузеру, утверждая, что вы отправляете HTML, а не HTML.

Особенно, если вы только изучаете Perl, вы должны приложить все усилия, чтобы расставить все точки i и пересечь все ваши 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 для списков импорта функционально-ориентированного интерфейса.

Другие советы

Вы также отправляете свой stderr в поток stdout? Все ваши распечатки попадут на стандартный вывод, который предположительно подключен к браузеру, учитывая ваш вывод HTML.

Однако die выполняет запись в поток stderr. Это может произойти не в окне браузера, а в каком-то журнале ошибок. От того, куда он идет, зависит от того, на чем работает Perl.

Один из способов проверить это напечатать что-то вместо die в условии или .

Итак, несколько вопросов.

<Ол>
  • Как у тебя это работает?
  • Если в командной строке покажите нам точную команду.
  • Если вы используете какой-либо веб-сервер, скажите нам, какой из них мы можем найти для вас.
  • die отправляет сообщения в STDERR, которые попадают в журналы ошибок веб-сервера, а не на экран. Есть несколько модулей CGI, которые предлагают вам больший контроль над обработкой ошибок, или вы можете установить обработчик $ SIG {__ DIE __} (если вы не знаете, что это такое, не беспокойтесь - - вам не нужно), но когда я хочу быстрый и грязный способ отладки моих CGI-сценариев, я помещаю это в верхнюю часть сценария:

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

    Это загружает скрипт в переменную, использует eval для запуска интерпретатора Perl для содержимого этой переменной и печатает все ошибки в стандартный вывод (окно браузера) с допустимым заголовком.

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

    Только одно из этих сообщений должно отображаться, и неясно, о чем вы спрашиваете.

    Вопрос говорит , что вам интересно, почему сообщение die не отображается; для меня это означает, что вы не видите сообщение " Файл не может быть скопирован. " и наиболее очевидной причиной этого является то, что операция копирования выполняется успешно, но см. также предыдущие ответы о просмотре журнала ошибок, если вы выполняете это в CGI.

    Текст сообщений, тем не менее, предполагает, что вы на самом деле имеете в виду, что вы не видите сообщение "оно не отображается". (Почему еще вы упомянули бы, что он не отображается?) В этом случае причина, по которой вы его не видите, заключается в том, что die приводит к завершению программы. После сбоя copy и выполнения die ваша программа не работает. Отменено. Он сбросил этот смертельный процессор и присоединился к стеку вечно. Он не будет печатать " это не будет отображаться " , если вы пропустите через него четыре миллиона вольт. Это бывший процесс.

    После редактирования вашего кода становится очевидным, что ваш кубик рассматривается как команда и, вероятно, его необходимо экранировать. Обратите внимание, как он отображается в Stack Overflow синим цветом (указывая, что это ключевое слово). Попробуйте вместо этого использовать синоним, такой как " shutdown " .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top