Странное поведение с использованием данных POST в сценариях Perl - PullRequest
1 голос
/ 29 января 2012

Сервер 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'};

При первом обращении к сценарию он печатает update
При втором обращении к нему печатается updateupdate
В третий раз печатается updateupdateupdate
... ии так далее.

Что может заставить его продолжать добавлять строку к себе между запросами?Я посылаю одни и те же данные POST каждый раз, просто обновляя браузер.Файлы cookie не используются.В файле нет ничего, что не закомментировано.

Редактировать: Кроме того, когда я print <STDIN> каждый раз говорит choice=update.Другие update не добавляются к STDIN

Ответы [ 2 ]

3 голосов
/ 29 января 2012

Я предполагаю, что скрипт продолжает работать между запросами. Поскольку %in является глобальной переменной, она никогда не очищается, поэтому $in{$key} .= $value в итоге делает строку длиннее и длиннее. Вероятно, вы можете избежать этой проблемы, используя лексические переменные.

Это означает, что вам нужно выяснить, как скрипт запускается веб-сервером.

Вы также захотите взглянуть на использование модулей, чтобы выполнить всю эту работу за вас, и узнать, как написать код на Perl, чтобы избежать проблемы, с которой вы столкнулись. Я бы посоветовал взглянуть на Modern Perl и работать оттуда.

1 голос
/ 29 января 2012

Звучит / похоже, что это связано с конфигурацией веб-сервера, а не с самим сценарием.

Однако, в начале кода попробуйте добавить:

my %in;

Это будетдобавьте в область видимости переменную, которую вы печатаете.

Кроме того, в конце кода я бы добавил: exit 0; (хотя обычно это не обязательно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...