2012-01-29 52 views
1

服務器是linux。當我將POST數據發送到腳本時,我遇到了莫名其妙的問題。在Perl腳本中使用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
第二時間訪問它,它打印​​
第三次,它打印updateupdateupdate
...等等。

究竟是什麼原因導致它在請求之間不斷追加字符串?我每次只通過瀏覽器刷新發送完全相同的POST數據。 Cookies未被使用。文件中沒有其他內容沒有被註釋掉。

編輯此外,當我print <STDIN>它說choice=update每一次。其他update s似乎並沒有被添加到STDIN

+4

你有沒有理由不使用CGI.pm? – mwp 2012-01-29 03:03:35

+1

你有沒有理由不使用'嚴格使用';? – 2012-01-29 03:10:09

+0

對於這兩個問題,我都明白這些是推薦的事情,但我沒有編寫代碼。我只是想讓它爲某人工作,而且我的知識非常有限。 – Mike 2012-01-29 03:33:01

回答

3

我的猜測是腳本在請求之間保持運行。由於%in是一個全局變量,它永遠不會被清除,因此$in{$key} .= $value最終會使字符串變長和變長。你可以通過使用詞法變量來避開這個問題。

這意味着您需要了解腳本如何由Web服務器運行。

您還需要查看使用模塊爲您完成所有這些解析工作,並瞭解如何編寫perl代碼以避免遇到的問題。我建議看看Modern Perl並從那裏工作。

+0

這也是我的猜測,'updateupdate'實際上是'update \ 0update',但'\ 0'不顯示。 – 2012-01-29 03:16:16

+0

@Alex腳本在請求之間保持運行,肯定會解釋我得到的很多奇怪的不一致。我不知道這是可能的。 – Mike 2012-01-29 03:52:20

1

它聽起來/看起來像它與Web服務器的配置有關,而不是腳本本身。

然而,在代碼的開始,試着加入:

my %in; 

這將範圍你打印的變量。

此外,在代碼的末尾,我會添加:exit 0; (雖然通常不是必需的)。