Сообщение CGI-скрипта не отображается в браузере? - PullRequest
1 голос
/ 28 октября 2009

Я пытаюсь скопировать некоторые файлы из одной сетевой папки в другую, используя 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» не отображается?

Ответы [ 5 ]

5 голосов
/ 28 октября 2009

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

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

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

4 голосов
/ 28 октября 2009

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

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

Одним из способов проверки является print что-то вместо die в предложении or.

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

  1. Как у вас это работает?
  2. Если в командной строке покажите нам точную команду.
  3. Если на каком-либо веб-сервере сообщите нам, какой из них мы можем найти для вас журналы.
3 голосов
/ 28 октября 2009

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 для содержимого этой переменной и печатает все ошибки в стандартный вывод (окно браузера) с допустимым заголовком.

0 голосов
/ 07 июня 2012

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

0 голосов
/ 28 октября 2009
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 ваша программа не работает. Отменено. Он сбросил этот смертельный процессор и присоединился к стеку вечно. Это не будет print "this is not displayed", если вы проведете через него четыре миллиона вольт. Это бывший процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...