- ベストアンサー
コントロールパネルを設置し、変数を変更できるようにする方法は?
- コントロールパネルをホームページ上に設置して、変数の変更を容易にする方法を教えてください。
- コントロールパネルから入力されたデータをCGIを使用して変数ごとにファイルに保存する方法が思いつきますが、処理速度やエラーのリスクが気になります。
- 一般的にどのような方法でコントロールパネルを実現しているのか、また初心者向けのサンプルがあれば教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
お礼に書いておられるスクリプトは実行されましたか? @Line="$in{'hoge1'},$in{'hoge2'},"; これは展開すると、 @Line="120,240,"; つまり、 $Line(0) … 120,240, となりますよね、これでは if($Line[$_] =~ /^[\$]/) にはヒットしないのはご理解いただけますか? #これは$で始まる文字列だったら…という意味です。 正しくヒットさせようと思うと、 $Line(0) … $hoge=120; $Line(1) … $hoge=240; という風に配列に格納されていなければなりません。 それから、前回の私のソースを見ていただければ解ると思いますが、 @Lineの中身はfile.datに格納されている文字列であって、 フォームから受け取った文字列を入れるのではありませんよ。 ソースの頭でprint "Content-Type~"; として要所要所でデバッグ用の文字列を表示させて、動きを確認してみてください。 あと、oomiyajiさんがfile.datとしておられる部分がinit.cgiのつもりだったのですが…(^^; ###フォーム <FORM method="post" action="main.cgi"> <INPUT type="submit" value="OK"> <INPUT type="hidden" name="hoge1" VALUE="120"> <INPUT type="hidden" name="hoge2" VALUE="240"> </FORM> ###init.cgi $hoge1=100; $hoge2=200; $hoge3=300; ###main.cgi #!/usr/bin/perl require "cgi-lib.pl"; $file="init.cgi"; &ReadParse(*in); ##ここに前回の私のソース #--- 確認用の表示 print "Content-Type/text/html\n\n"; open (FILE, "$file") while <FILE> { print "$_<BR>"; } close(FILE);
その他の回答 (4)
- yuizuian
- ベストアンサー率42% (103/245)
>全く見当はずれでしたら申し訳ありませんが >$key, $valというのは >フォームが ><INPUT name="key" VALUE="120"> ><INPUT name="val" VALUE="120"> >となる場合でしょうか。 いえ、イメージ的には <INPUT name=$key VALUE=$val> とう感じです。 init.cgiの中には、 $hoge1=120; $hoge2=240; $hoge3=360; という感じでデータが入っていますよね? それを=でsplit(分解)しているんです。 $keyには"$hoge1"や"$hoge2"が、$valには"120"や"240"がそれぞれ入ります。 ($hoge1という変数の中身が入るわけではなくて、"$hoge1"という文字列が入ります) oomiyajiさんはフォームから飛ばされてきたデータを連想配列に入れる時、 いつも&ReadParse();を使用しておられるんですか? でしたら面倒かもしれませんが、一度ご自身でデータを分解して連想配列に入れてみてはどうでしょう? splitの使い方や、連想配列についても解ると思いますよ。
お礼
ありがとうございました。splitや配列について少し調べて、フォームから受け取ったデータをファイルに保存し、それを取り出すCGIの作成を試みたのですが、色々試行錯誤したのですが、(せっかく教えていただいたにも関わらず)勉強不足のため、残念ながら上手くいきませんでした。 ●[フォーム] <FORM method="post" action="init.cgi"> <INPUT type="submit" value="OK"> <INPUT type="hidden" name="hoge1" VALUE="120"> <INPUT type="hidden" name="hoge2" VALUE="240"> </FORM> ●[ファイルに保存] #!/usr/bin/perl $file = "file.dat"; ###フォームから受け取ったデータを@Lineに入れるのはこのような感じでしょうか @Line="$in{'hoge1'},$in{'hoge2'},"; ###恐れ入りますが、一部をそのまま貼り付けさせていただきました。 for(0..$#Line) { if($Line[$_] =~ /^[\$]/) { my ($key, $val) = split (/=/, $Line[$_]); $key =~ s/\$//g; if ($in{$key} ne "") { $Line[$_] = "\$$key=$in{$key};\n"; } } } open(FILE,">$file"); print FILE @Line; close (FILE); ●[ファイルから取り出す] #!/usr/bin/perl $file = "file.dat"; open(FILE, "+<$file"); @hens = <FILE>; close(FILE); ###確認のために print "Content-type: text/html\n\n"; print "<HTML><BODY> $hens[0] $hens[1] </BODY></HTML>\n"; このような感じで理解したのですが、もしかして見当違いでしょうか。大変申し訳ございませんが、何卒ご教授の程よろしくお願いいたします。
- yuizuian
- ベストアンサー率42% (103/245)
すみません、今更のようにミスに気づきました。 #1: print "Content-Type:text/html\n\n"; print hoge; ↓ print "Content-Type:text/html\n\n"; print $hoge; です。
- yuizuian
- ベストアンサー率42% (103/245)
>この後、実際にどのように$hoge1、$hoge2、 $hoge3をファイルに保存すればよいのか、恐れ入りますが教えていただけないでしょうか。 >print FILE "hoge1=$hoge1・・・・?\n"; イメージ的にはそんな感じです。 open (FILE, "$file); @Line = <FILE>; close (FILE); for(0..$#Line) { if ($Line[$_] =~ /^[\$]/) { my ($key, $val) = split (/=/, $Line[$_]); $key =~ s/\$//g; if ($in{$key} ne "") { $Line[$_] = "\$$key=$in{$key};\n"; } } } open (FILE "> $file"); print FILE @Line; close (FILE); >また、init.cgiで、ファイルを開いて、$hoge1=120、$hoge2=240、 $hoge3=360と取り出すには、実際にはどのような記述をすることになるのでしょうか。教えていただけると、大変助かります。 既にinit.cgiに上記のデータが入っているとすると、 #1の例のように require 'init.cgi'; とすれば、それだけでその変数を使用する事が出来ます。 試しに一度実行されてみてはどうでしょう?
お礼
ご教授ありがとうございました。 色々試してみたのですが(申し訳ございませんが、配列なども含めて)勉強不足のため、残念ながら上手くいきませんでした。 全く見当はずれでしたら申し訳ありませんが $key, $valというのは フォームが <INPUT name="key" VALUE="120"> <INPUT name="val" VALUE="120"> となる場合でしょうか。 再三恐れ入りますが、何卒よろしくお願いいたします。
- yuizuian
- ベストアンサー率42% (103/245)
設定する変数用のファイルを一つ用意して、 それをメインのCGIからrequireしてはどうですか? そうすれば、「保存されているデータを変数に入れていく」なんて面倒な事をしなくても、そのまま変数が使用できますよ。 例) ##init.cgi hoge = 120; 1; ##main.cgi #!/usr/bin/perl require 'init.cgi'; print "Content-Type:text/html\n\n"; print hoge; 実行結果:120 Web上から変数を書き込むには、 init.cgiをopenして、 <INPUT TYPE=text NAME=hoge VALUE=120> のようにフォームを用意して、 またinit.cgiに書き込みます。 書き込む際は、 print FILE "hoge=$hoge"; のようにしても良いですし、 init.cgiを読み込んでforeach等でまわしつつ、正規表現で置き換えてファイルを更新するのでも良いと思います。 ご存知かとは思いますが、init.cgiの最後には”1;”と付けるのをお忘れなく。
お礼
ご返答いただきありがとうございました。 おかげさまで、「メインのCGIからrequireする」方法は理解することができました。 ただ、Web上から変数を書き込む方法につきましては、勉強不足のため残念ながら、(大変申し訳ありませんが)十分に理解できませんでした。 フォーム <FORM method="post" action="init.cgi"> <INPUT type="submit" value="OK"> <INPUT type="hidden" name="hoge1" VALUE="120"> <INPUT type="hidden" name="hoge2" VALUE="240"> <INPUT type="hidden" name="hoge3" VALUE="360"> </FORM> initCGI #!/usr/bin/perl &ReadParse(*in); $hoge1 = $in{'hoge1'}; $hoge2 = $in{'hoge2'}; $hoge3 = $in{'hoge3'}; $file = "file.dat"; open(FILE, "+<$file"); この後、実際にどのように$hoge1、$hoge2、 $hoge3をファイルに保存すればよいのか、恐れ入りますが教えていただけないでしょうか。 print FILE "hoge1=$hoge1・・・・?\n"; close(FILE); } また、init.cgiで、ファイルを開いて、$hoge1=120、$hoge2=240、 $hoge3=360と取り出すには、実際にはどのような記述をすることになるのでしょうか。教えていただけると、大変助かります。 お手数をおかけして申し訳ありませんが、何卒よろしくお願いいたします。
お礼
色々とありがとうございました。サンプルのソースまでいただき、本当にありがとうございました。教えていただいたことを整理させていただき、がんばってみようと思っております。
補足
おかげさまで、何とか解決できそうです。色々とお手数をおかけして申し訳ありませんでした。とても丁寧に教えていただきありがとうございました。