好的,这很奇怪。
我们所有的服务器都使用ActivePerl 5.8.8和Windows Server 2003。
在某些开发过程中,我们遇到了一个问题,我们正在处理的脚本开始抛出CGI错误。没有多少打印头可以工作,只是不断的CGI错误。该问题被降级为一个开发服务器。
经过一番挖掘,我发现问题与警告有关。当perl抛出某些警告时,页面从IIS返回时带有错误的CGI标题,并且没有任何内容。特别是关于连接未初始化字符串的警告。
这是我正在使用的测试脚本。
use strict;
Main();
sub Main {
my $Web = new CGI;
my $SQL = VIN::SQL->new('INDIGO');
print $Web->header();
print "Testing!";
print "/r/n/r/n/";
my ($Body, $Title) = ('', '');
my $Page;
eval{
$Page = "";
$Page = $Web->param('Page');
print "Page " . $Page;
};
}
添加无警告语句意味着它会运行。添加Page param也意味着它运行。
有什么可能导致它的想法吗?我想了解为什么在添加“无警告”声明并继续前进之前,好像这种情况发生在我们的现场环境中,我宁愿不添加任何警告;语句到系统中的每个perl脚本。
非常感谢你的帮助。
答案 0 :(得分:2)
$Page
不应该是undef
,因此|| ""
会确保分配空字符串。
sub Main {
my $Web = new CGI;
my $SQL = VIN::SQL->new('INDIGO');
print $Web->header();
print "Testing!";
print "/r/n/r/n/";
my ($Body, $Title) = ('', '');
my $Page = $Web->param('Page') || "";
print "Page ". $Page;
}
答案 1 :(得分:1)
在调用print $Web->header();
之前,某些内容正在收到一条指向服务器的错误消息。这意味着服务器的输出类似于:
Error on line 123: Cannot create foo
Content-Type: text/html; charset=ISO-8859-1
Testing
这是一个糟糕的标题。
轻松修复将标题打印到代码的早期部分。
交换线条:
my $SQL = VIN::SQL->new('INDIGO');
print $Web->header();
到
print $Web->header();
my $SQL = VIN::SQL->new('INDIGO');
可能会解决问题(错误的标题),而是将生成的错误消息打印到浏览器。