在perl脚本中使用POST数据的奇怪行为

在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")

服务器是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") {
    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脚本在请求之间一直运行肯定会解释我所遇到的许多奇怪的不一致。我不知道这是可能的。