我正在尝试使用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'消息无法呈现?
答案 0 :(得分:5)
如果您在网络服务器下运行(我无法想象为什么,您发送了"Content-Type"
标头),您使用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。
答案 1 :(得分:4)
您是否也将stderr发送到stdout流?根据您的HTML输出,您的所有打印件都将显示为可能与浏览器相关的标准输出。
但是,die
会写入stderr流。这可能不是浏览器窗口,而是某种错误日志。至于它的发展方向,它取决于Perl在其中运行的内容。
检查的一种方法是在print
条款中使用die
而不是or
。
所以,有些问题:
答案 2 :(得分:3)
die
向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解释器,并使用有效的标头将任何错误输出到标准输出(浏览器窗口)。
答案 3 :(得分:0)
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
执行后,您的程序已经死了。终止。它已经摆脱了这个凡人的CPU并加入了永恒的堆栈。如果你通过400万伏特,它就不会print "this is not displayed"
。这是一个前程序。
答案 4 :(得分:0)
编辑代码后,很明显你的骰子被视为一个命令,可能需要进行转义。注意它是如何在Stack Overflow上呈现为蓝色(表示它是关键字)。请尝试切换为"shutdown"
等同义词。