2012-01-29 11 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データを送信しています。クッキーは使用されていません。コメントアウトされていないファイルはありません。

編集:また、私がprint <STDIN>と言うときは毎回choice=updateと表示されます。他のupdateは追加されていないようですSTDIN

+4

CGI.pmを使用していない理由はありますか? – mwp

+1

'use strict;'を使わない理由はありますか? –

+0

どちらの質問にも、これらはお勧めのことだと私は理解していますが、私はコードを書いていませんでした。私はそれを誰かのために働かせようとしているだけで、私のperlの知識は非常に限られています。 – Mike

答えて

3

私の推測では、スクリプトは依頼の間で実行されていると思います。 %inはグローバル変数であるため、決してクリアされないため、$in{$key} .= $valueは文字列の長短を長くします。おそらく、字句変数を使用して問題を回避できます。

これは、スクリプトがWebサーバーによってどのように実行されているかを調べる必要があることを意味します。

モジュールを使ってこのすべての解析作業を行い、遭遇した問題を避けるためにperlコードを書く方法について学びたいと思うでしょう。私はModern Perlを見てそこから作業することをお勧めします。

+0

これは私の推測でもあり、 'updateupdate'は実際には' update \ 0update'ですが、 '\ 0'は表示されません。 –

+0

@Alexスクリプトはリクエスト間で実行されているので、私が得ている奇妙な不一致の多くを間違いなく説明できます。私はこれが可能であることを知らなかった。 – Mike

1

Webサーバーの設定に関連しているように見えますが、スクリプト自体ではないようです。

しかし、コードの先頭に、追加してください:

これはスコープあなたが印刷している変数を希望
my %in; 

また、コードの最後には、exit 0; (通常は必要ありません)を追加します。

関連する問題