dポイントプレゼントキャンペーン実施中!

PerlのReadPerseについて質問させてください。
以下少々長いですが、過程を書きます。


<form>タグにより、入力フォームのページをHTMLで作成したとします(form.html)。
その際、<form method="post" action="form.cgi">
と入力しておいて、別途form.cgiを作成するとします。

form.htmlには、<form>タグ内のname属性で、それぞれ'weight' 'height' 'age'という三種類のデータを入力してもらって、取得するようにしています。

そして<input type="submit" value="登録">による、
登録ボタンを押すことで、
form.cgiに処理をさせるようにしています。


form.cgiの中身ですが、まず、最初の三行を書きます。

#!/usr/local/bin/perl
require 'cgi-lib.pl';
&ReadParse(*form);

となるのですが、わからないのが、
三行目の

&ReadParse(*form);

です。
サブルーチンReadParseを引数*formで、
cgi-lib.plから呼び出しているということはわかるのですが、いきなり*formという形で、ハッシュを登場させているあたりがわかりません。(この際、ハッシュ名の前の%を*に変えなければならないことは、一応知っております。理由はわかりませんが。)

そこで質問なのですが、
いきなり、ハッシュであるformを登場させていいものなのでしょうか??

以下、form.cgiの内容です。


#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(*form);

$name=$form{'weight'};
$sex=$form{'height'};
$megane=$form{'age'};

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";

print "体重:${weight}<br>\n";
print "身長:${height}<br>\n";
print "年齢:${age}<br>\n";

print "</body>";
print "</html>";

_END_

A 回答 (15件中11~15件)

ご質問の件、任意の名前でOKです。


#1さんが回答されている通り、ReadParseを使うと入力された内容(値)は、フォームの入力欄に付けた名前を添え字(キー)として連想配列に自動的に格納されます。
添え字(キー)と入力内容(値)が対になるのはよいのですが、では、どんな名前の連想配列に格納するか・・・。それを決めるのが(*)の部分です。

&ReadParse(*form)とするとフォームの各内容が連想配列%formに格納されます。

それぞれの値を呼び出すときは
$form{'weight'}
$form{'height'}
$form{'age'}


&ReadParse(*sun)とするとフォームの各内容が連想配列%sunに格納されます。

それぞれの値を呼び出すときは
$sun{'weight'}
$sun{'height'}
$sun{'age'}

&ReadParse()と省略すると自動的に%inという連想配列に格納されます。これはこういう仕様なんです。

それぞれの値を呼び出すときは
$in{'weight'}
$in{'height'}
$in{'age'}

となります。


しかし、なんで動かないのでしょうねぇ・・・。
私も気になって仕方がありません(笑)。
しばらく締め切らないでおいてください。
何か解決策を思いついたら、また書き込みますので。
    • good
    • 0
この回答へのお礼

massasoytさん、ありがとうございます。

相変わらず、リモートでいろいろと試しているところで、状況は変わっていないところです。

それはさておき、ReadParseの説明、本当によくわかりました!!
これで自分でも使えそうです。
連想配列もやっと理解できた気がします。
本当に本当にご丁寧にありがとうございました!


本来なら、ここで締め切りまして、すぐにポイントを差し上げたいのですが、
やはり今回、ここまでお付き合いいただいたのですから、私も必死で解決策を探すことにしますので、
締め切るのはもう少々あとにさせていただきますね。

AN HTTPDのサイトをまずは見てきます。
ついでにApacheも導入してみて、いろいろと比べてみます。

何か発見しましたら補足に書き足していただきますね。

いろいろと本当にありがとうございました!

お礼日時:2003/04/18 20:04

三度、登場です(笑)。



そうなると、やはりローカル環境が怪しいですね。
ローカル環境でテストするのは今回が初めてでしょうか?
他のスクリプトでは正常に動作していましたか?

<思い当たるチェック箇所>
(1)まさかとは思いますが、Perlはインストールされていますよね?
(2)CGIスクリプトの1行目のPerlへのパスが実際のローカル環境と一致していますか?
(3)スクリプトの最終行の_END_を削除してみてください。

とりあえず、この3点を・・・。
なんとか動いてほしいですね。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

本当にお付き合いありがとうございます。
非常に頼もしい限りですm(_ _)m

ローカル環境でのスクリプトの実行は今までずっと正常に動いていました。
datファイルの読み込みもアクセスカウンタ作成時にうまく動作していました。
perlのインストールは、activeperlをインストールしています。xpですのでDOSプロンプトで、perl -vと入力して、念のため再度確認しましたがばっちりインストールされております。


早速、massasoytさんがおっしゃられるチェック箇所を
チェックしてローカルで確認してみました。

(1)上記に記述しましたようにperlはインストールされています。

(2)ANHTTPDのperlへのパスと同一です。
つまり、今までテストしてきたほかのスクリプトの一行目と同一です。

(3)ENDを削除してみましたが、やはり駄目でした。ENDというのは、そもそも必要ないものなんでしょうか?

私のローカル環境はどうなっているのでしょう。。
この際、Apacheに乗り換えようかと思います。
ただ英語なので敷居が高いかなと少し心配ですが。
不思議なのは、他のカウンターなどのcgiは問題なく動いてくれることなんです。はああ・・・。


massasoytさんにもう一点だけお尋ねしたいのですが、
form.cgiにおける、

&ReadParse( *form );

という部分の*formは、別に*sunというような、
別の名前でもきちんとform.htmlからname属性の値を受け取ることができるのでしょうか?

<form>タグで作成されたデータは、
必ず*formという名称で、ハッシュに格納しなければならないのでしょうか?

その部分だけかなり気になっていますので、どうかご教授ください。

宜しくお願いします。

お礼日時:2003/04/18 17:57

#2、修正です。



#2<正>の後半

print "年齢:form{'age'}<br>\n";



print "年齢:$form{'age'}<br>\n";

$マークが抜けてました。

この回答への補足

>ローカル環境のチェックしていなかったのですが



ローカル環境のチェックしか、していなかったのですが

の間違いです。紛らわしい書き方にしてしまいまして、済みません。

補足日時:2003/04/18 16:56
    • good
    • 0
この回答へのお礼

たびたび失礼します。

ローカル環境のチェックしていなかったのですが、
リモートのサーバーにアップして実行してみると、
なんとうまく値がform.cgiに表示されてしまいました。

となると、スクリプト自体は先ほど私がmassasoytさんにご確認をお願いした内容で正常のようです。

となると、なぜ、ローカルにおいてはform.cgiが実行されないのか、本当にわからなくなってしまいました。

私の環境で怪しい部分というのはあるでしょうか。

ローカルサーバー:ANHTTPD
ローカルにおいてはcgiファイルもhtmlファイルもすべて同一ディレクトリで実行。

リモートにアップする際は、cgi-binフォルダにcgiファイルをアップする必要があったので、パスだけはリモート用に変更しました。

お礼日時:2003/04/18 16:56

こんにちは。



&ReadParseの用法、意味については#1さんの仰っている通りですね。
では、私はスクリプトの修正を。

form.cgiの以下の部分に問題ありです。

<誤>
print "体重:${weight}<br>\n";
print "身長:${height}<br>\n";
print "年齢:${age}<br>\n";

<正>
print "体重:$name<br>\n";
print "身長:$sex<br>\n";
print "年齢:$megane<br>\n";

もしくは

print "体重:$form{'weight'}<br>\n";
print "身長:$form{'height'}<br>\n";
print "年齢:form{'age'}<br>\n";

です。


<アドバイス>
(1)以下の部分の意味はお分かりですか?

$name=$form{'weight'};
$sex=$form{'height'};
$megane=$form{'age'};

後々%formの内容を呼び出したり使いまわす際に、いちいち$form{'***'}と書かなくて済むように簡単な変数に代入しています。shevyさんのスクリプトでは折角簡単な変数に代入したのに、HTML表示の際に使っていませんね。簡単な変数$name,$sex,$ageを使わなくても呼び出せますが、shevyさんのスクリプトではその呼び出し方法も間違っています。簡単な変数を使う場合は<正>の前者、ReadParseで自動的に作られた%formから直接呼び出すのであれば<正>の後者です。

(2)このスクリプトは参考書か何かを見ながら例文を流用してお書きになったのでしょうか?

$name=$form{'weight'};
$sex=$form{'height'};
$megane=$form{'age'};

変数名と実際の数値の内容がバラバラですね。
$nameが体重、$sexが身長、$meganeが年齢。簡単な短いスクリプトや自分しか編集しないスクリプトならOKですが、複雑で長いスクリプトや他人が編集する可能性がある場合は混乱を避けるため変数名と中身を合わせた方が良いです。

例えば、
$weight=$form{'weight'};
$height=$form{'height'};
$age=$form{'age'};

変数名はあくまでも任意ですが・・・。

(3)from.cgi内のcgi-lib.plのパスは合ってますよね?

一応、上記修正後テストしたら表示されました。

この回答への補足

form.htmlのスクリプト
---------------------------------------

<html>
<body>
<form method="post" action="form.cgi">
体重:<input type="text" name="weight">
<p>
身長:<input type="text" name="height">
<p>
年齢:<input type="text" name="age">
<p>

<input type="submit" value="登録">
<input type="reset" value="クリア">

</form>

</body>
</html>

------------------------------------
もしこれでmassasoytさんの環境で実行されたとしますと、
私のローカルサーバーに何か問題があるのでしょうか?

お手数お掛けいたしますが、お返事をお待ちしております。宜しくお願いします。

補足日時:2003/04/18 16:41
    • good
    • 0
この回答へのお礼

非常にご丁寧にありがとうございました。

変数名、間違えておりました。ご指摘ありがとうございます。massasoytさんのご指摘どおりで、このスクリプトは某書籍の内容を自分でいじくったものです。

そこで、早速訂正してみました。
簡単な変数に代入するという方法で行いました。
ですが、やはりform.cgiには反映されないようです。
以下、長くなりますが、スクリプトを載せます。
お手数お掛けしますが、massasoytさんの環境でform.cgiにきちんと値が表示されるかどうかをご確認お願いできますでしょうか。
サーバーはANHTTPDを使用しています。これまでは何の問題もなくcgiのテストができていました。
form.cgi内のcgi-lib.plのパスはform.cgiと、cgi-lib.plが同一ディレクトリに置いておりますので下記スクリプトの書き方で正しいと思われます。

form.cgiのスクリプト
---------------------------
#!/usr/local/bin/perl

require 'cgi-lib.pl';
&ReadParse(*form);

$weight=$form{'weight'};
$height=$form{'height'};
$age=$form{'age'};

print "Content-type: text/html\n\n";
print "<html>\n";
print "<body>\n";

print "体重:$weight<br>\n";
print "身長:$height<br>\n";
print "年齢:$age<br>\n";

print "</body>";
print "</html>";

_END_


ここで一杯になりましたので、補足に、
form.htmlのコードを書きます。
お手数お掛けします。

お礼日時:2003/04/18 16:38

cgi-lib.plはPOSTまたはGETで送信した値を連想配列に格納するPerlライブラリです。


通常CGIにデータを渡す時の形式が、

key=value&key2=value2&key3=value3...

という感じで、キーと値を=で繋ぎ、
その組み合わせが複数ある場合&で繋がれてCGIに送出されます。
単純な説明ですが、cgi-lib.plは最初に&で区切り、
次に=で区切ったキーと値を連想配列に格納します。
ちなみに、&ReadParse();で引数を渡さないと%inに格納されます。
CGIに渡されcgi-lib.plで連想配列化されたデータをどう使おうと構いません。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。

少し難しくて、今頭を悩ませています。

実はform.htmlで入力した内容が、
form.cgiに反映されなくなってしまいました。

以下のhtml文書で、form.cgiが働いてくれるはずなんですが、form.cgiにはname属性が受け渡しされていない?ようです。間違いをご指摘してくださらないでしょうか。

<html>
<body>
<form method="post" action="form.cgi">
体重:<input type="text" name="weight">
<p>
身長:<input type="text" name="height">
<p>
年齢:<input type="text" name="age">
<p>

<input type="submit" value="登録">
<input type="reset" value="クリア">

</form>

</body>
</html>

お礼日時:2003/04/18 13:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!