在perl脚本中使用POST数据的奇怪行为
服务器是linux。我在向脚本发送POST数据时遇到了无法解释的问题 例如,我发送以下POST数据:choice=update 以下是脚本:在perl脚本中使用POST数据的奇怪行为,perl,post,Perl,Post,服务器是linux。我在向脚本发送POST数据时遇到了无法解释的问题 例如,我发送以下POST数据:choice=update 以下是脚本: #!/usr/bin/perl -w print "Content-type: text/html\n\n"; if ( $ENV{'REQUEST_METHOD'} eq "GET" ) { $in = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST")
#!/usr/bin/perl -w
print "Content-type: text/html\n\n";
if ( $ENV{'REQUEST_METHOD'} eq "GET" ) {
$in = $ENV{'QUERY_STRING'};
} elsif ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN,$in,$ENV{'CONTENT_LENGTH'});
}
@in = split(/&/,$in);
foreach $i (0 .. $#in) {
# Convert plus's to spaces
$in[$i] =~ s/\+/ /g;
# Split into key and value.
($key, $val) = split(/=/,$in[$i],2); # splits on the first =.
# Convert %XX from hex numbers to alphanumeric
$key =~ s/%(..)/pack("c",hex($1))/ge;
$val =~ s/%(..)/pack("c",hex($1))/ge;
# Associate key and value
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator
$in{$key} .= $val;
}
print $in{'choice'};
我第一次访问脚本时,它会打印更新
第二次访问时,它会打印updateupdate
第三次,它打印updateupdateupdate
……等等
究竟是什么原因导致它在请求之间不断向自身追加字符串?我每次发送的帖子数据都完全相同,只需用浏览器刷新即可。没有使用Cookies。文件中没有其他未注释掉的内容
编辑:而且,当我打印时,它显示choice=每次更新。其他更新似乎没有添加到STDIN中我的猜测是脚本在请求之间保持运行。由于%in是一个全局变量,它永远不会被清除,因此,$in{$key}.=$value最终会使字符串越来越长。您可能可以通过使用词汇变量来避免这个问题 这意味着您需要了解web服务器是如何运行脚本的
您还需要了解如何使用模块为您完成所有这些解析工作,并了解如何编写perl代码以避免遇到的问题。我建议您看看并从那里开始工作。我的猜测是脚本在请求之间一直运行。由于%in是一个全局变量,它永远不会被清除,因此,$in{$key}.=$value最终会使字符串越来越长。您可能可以通过使用词汇变量来避免这个问题 这意味着您需要了解web服务器是如何运行脚本的
您还需要了解如何使用模块为您完成所有这些解析工作,并了解如何编写perl代码以避免遇到的问题。我建议您从这里开始查看和操作。听起来/看起来它与web服务器的配置有关,而不是脚本本身 但是,在代码开头,请尝试添加:
my %in;
这将限定正在打印的变量的范围
另外,在代码的末尾,我将添加:exit 0;
虽然通常不是必需的。听起来/看起来它与web服务器的配置有关,而不是脚本本身 但是,在代码开头,请尝试添加:
my %in;
这将限定正在打印的变量的范围
另外,在代码的末尾,我将添加:exit 0;
尽管通常不是必需的。您不使用CGI.pm有什么原因吗?您不使用use strict有什么原因吗;?对于这两个问题,我知道这些都是建议做的事情,但是我没有编写代码。我只是想让它为某人工作,而我的perl知识非常有限。你不使用CGI.pm有什么原因吗?你不使用use strict有什么原因吗;?对于这两个问题,我知道这些都是建议做的事情,但是我没有编写代码。我只是想让它为某人工作,而我的perl知识非常有限。这也是我的猜测,updateupdate实际上是update\0update,但没有显示\0。@Alex脚本在请求之间不断运行肯定会解释我所遇到的许多奇怪的不一致。我不知道这是可能的。这也是我的猜测,updateupdate实际上是update\0update,但是\0没有出现。@Alex脚本在请求之间一直运行肯定会解释我所遇到的许多奇怪的不一致。我不知道这是可能的。