CGIスクリプトメッセージがブラウザでレンダリングされませんか?
質問
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";
「ダイ」メッセージがレンダリングされないのはなぜですか
解決
これをWebサーバーで実行している場合(理由は想像できませんが、&quot; Content-Type&quot;
ヘッダーを送信しています)、を使用して出力するエラーメッセージdie
と warn
はサーバーのエラーログに記録されます。
さらに、これをCGIとして呼び出している場合は、HTMLを送信しているのにHTMLを送信していないと主張することにより、ブラウザーに横たわっていることに注意してください。
特にPerlを学習している場合は、すべての i にドットを付け、すべての t をクロスするように努力する必要があります。
#!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が実行しているものに依存します。
チェックする1つの方法は、 or
句で die
する代わりに何かを print
することです。
だから、いくつかの質問:
- どのように実行していますか?
- コマンドラインの場合、正確なコマンドを表示します。
- 何らかのWebサーバーを使用している場合は、どのサーバーを使用するか教えてください。ログを見つけることができます。
die
は、メッセージをSTDERRに送信します。STDERRは、画面ではなく、Webサーバーのエラーログに記録されます。エラー処理をより細かく制御できる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";
これらのメッセージのいずれか1つだけが表示されるべきであり、どのメッセージについて質問しているのか明確ではありません。
says という質問は、 die
メッセージが表示されない理由です。私にとっては、「ファイルをコピーできません」というメッセージが表示されていないことを意味します。これの最も明白な理由はコピー操作が成功していることですが、これをCGIで実行している場合はエラーログを調べることに関する以前の応答も参照してください。
ただし、メッセージのテキストは、「これは表示されません」というメッセージが実際には表示されていないことを示唆しています。 (表示されないことを他に言うのはなぜですか?)その場合、表示されない理由は、 die
がプログラムを終了させるためです。 copy
が失敗し、 die
が実行されると、プログラムは停止します。終了しました。この致命的なCPUをシャッフルし、スタックに永遠に参加しました。 400万ボルトを入力した場合、印刷&quot;これは表示されませんとはなりません。元プロセスです。
コードを編集した後、ダイがコマンドとして認識され、おそらくエスケープする必要があることは明らかです。スタックオーバーフローで青色でレンダリングされることに注意してください(キーワードであることを示します)。代わりに&quot; shutdown&quot;
などの同義語に切り替えてみてください。