プログラムの意図が良く分からないのですが、Perlプログラムというよりは、まずCGIについてもう少し理解されてから再度質問されてはいかがでしょうか?
ソース、後でよく見せてもらいますが
とりあえず気づいた点としては
’や”や¥が全角になってますね(汗)
半角で書いたつもりなんですけど・・・もう一度書いておきます。
ここではブルダウンで選択した$Aを$AAに代入して投げてます。
foreach (@users) {
($A,$B,$C,$D,$E,$F,$G,$H) = split /
/;
$ii++;
if($ii eq 1){print ”</table>
¥n”;$AA = $form{’$select[$A]’};
print <<”_EOF_”;
_EOF_
多分これでOKです
サンプルメソッド
method=POST&cgifile=test%2ecgi&users=TEST&users=ASAD&users=asasa
ソース部
#!/usr/local/bin/perl
$mthd=$ENV{’REQUEST_METHOD’};
local($qu,@in,$key,$val);
if($mthd eq ’GET’){
$qu=$ENV{’QUERY_STRING’};
}
elsif($mthd eq ’POST’){
read(STDIN,$qu,$ENV{’CONTENT_LENGTH’});
}
*query = decode();
print qq(Content-type: text/html¥n¥n);
print ”</table><form><select>¥n”;
$ii=0;
foreach $A (@usr){
$ii++;
# ($A,$B,$C,$D,$E,$F,$G,$H) = split /<p>/;
print ”<option>$A¥n”;
if($ii eq 1){
$AA=$A;
}
# @select = ();
# $select[$A] = ”selected”;
}
print ”</select></form>¥n”;
# $AA = $form{’$select[$A]’};
print <<”_EOF_”;
<form action=$query{’cgifile’} method=$query{’method’}>
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=hidden name=$AA size=15>
<input type=submit name=login value=”Enter”>
</form>
_EOF_
exit;
sub decode
{
$enc=0;
#変数queryを & で分離して配列変数queryに代入
local(@query)=split(/&/,$qu);
#配列変数の数だけ解析を行う。
foreach(@query){
# ”+” を ” ”に置換する。
tr/+/ /;
# ”=” で キーと値に分離する。
($key,$val)=split(/=/);
# %nn(16進数)形式を考慮してキーと値を復元する。
$key=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack(”c”,hex($1))/ge;
# 改行コードを修正する。
$val=~s/¥r¥n/¥n/g;
# ハッシュ変数vinに最終的な値を入れる。
$vin{$key}=$val;
if($key eq ’users’){
$usr[$enc++]=$val;
}
}
return *vin;
}
難しすぎてわからない(泣
私でも使える処理があると助かるんですけど・・・
print <<”_EOF_”;
_EOF_
実際私はこの辺の処理が全く理解できてません
人力検索はてな - 質問一覧
URLはダミーです。
質問の意味はわかりましたが、プログラムの意味はわかりませんでした・・・。
Perlの初心者というわけでもないのですけど。
意味がわからない箇所としては、
(1) foreachループの中で毎回「@select = ();」と「$select[$A] = ”selected”;」をしている意味
(2) ループの後で出てくる「$form{’$select[$A]’}」の $formってなに?
(3) 上記(2)で、なぜ引数をシングルコーテーション「’」でくくるのか? 変数を展開したくないの?
という点です。
あと、「if($ii eq 1)」という条件文ですが、eqは文字列比較の演算子です。
数値として比較したいなら == では?
というか、この条件文全体をforeachの前に持ってきても良いのでは?
if (@users > 0) で判断できるでしょうし。
できれば、各変数の意味を書いておいたほうが、適切な回答を期待できると思います。
私が作ったプログラムではないので私には説明はむりです。
このソースは一部抜粋して貼り付けしているので全体からすれば、ちゃんとした処理になってます。
Learning CGI
やはりCGIとPERLについてかなりの誤解をされているように見えます
HTMLのフォームからプルダウンで選択されたものを受け取った場合
decode部分の仕様にもよりますが
$FORM{’sentaku’}といった変数にいったん入れる形が
多いと思います
<選択をして送信するHTML>
↓
<受け取って処理するPERL>
↓
<処理したPERLが表示するHTML>
こういう流れになるため
print <<”_EOF_”;
<form action=$cgifile method=$method>
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=hidden name=$FORM{’sentaku’} size=15>
<input type=submit name=login value=”Enter”></form>
_EOF_
で終わりです
この答えが的外れな場合はポイントは要りません
:: KENT WEB - CGIスクリプト ::
また、KENTさんなどで簡単なCGIを読んでみるといいかもしれません
正しいかどうかはおいておいて
読みやすく理解しやすいと思います
たぶんおおまかにはそれで合ってるはずなんですが・・・取得して投げるのがなかなかうまくいきません。
これが問題の稼動しているCGIです。コピペしてください。
http://k1ring.hp.infoseek.co.jp/cgi-bin/raira/gekipawa.cgi?k...
ここにメールいただければ問題のCGIごと送ります。kinkaiya0@hotmail.com
問題が解決すれば全ポイント差し上げたいと思います。
プルダウンメニューと、そこで選択した値をinputのname属性値として使うのは同一のページでのことなんでしょうか?
http://www.umechando.com/javascript/index.html
JavaScript と Dynamic HTML
だとしたら、サーバー側で処理を行うCGIではなく、クライアント側で処理を行うJavaScriptを使用する必要があります。
JavaScriptを使うのであれば、まずselectで選択された値を取得し、それをinputのname属性値に代入するという処理を行うというのが主な流れです。
http://richandpoor.fc2web.com/
無料オンラインゲームもMMOも タダのミニゲーム
foreach (@users) {
($A,$B,$C,$D,$E,$F,$G,$H) = split /<p>/;
$ii++;
if($ii eq 1){print ”</table><form><select>¥n”; $select_flag = 1;
}print ”<option>$A¥n”;@select = ();
$select[$A] = ”selected”;
}print ”</select></form>¥n”;
$AA = $form{’$select[$A]’};
この前半部分がおかしいと思います。
他の部分があってるとすると少なくとも、
・formにaction=$cgifileが指定されていない。
・selectにnameがない。
・optionにvalueがない。
・submitボタンがない。
これではプルダウンが表示されてませんよね?
おそらく、後半部分と混ぜたかったんだと思います。でしたら、正解は下記の通りになります。
foreach (@users) {
($A,$B,$C,$D,$E,$F,$G,$H) = split /<p>/;
$ii++;
if($ii eq 1){print ”</table><form action=$cgifile method=$method><select name=sentaku>¥n”; $select_flag = 1;
}print ”<option value=$A>$A¥n”;@select = ();
}
print <<”_EOF_”;
</select>
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=submit name=login value=”Enter”></form>
_EOF_
これで起動したCGIでは
$form{’sentaku’}に選択した$Aの値が代入されています。
やはりうまくいきませんでした。
$form{’sentaku’}や
では今回の一番の問題である
$form{’sentaku’}
にブルダウンで選択した値を代入するにはどうしたらいいのでしょうか?
この前のサンプルは、データが消えていたのでもう一度UPしておきます。すいません。
http://k1ring.hp.infoseek.co.jp/cgi-bin/raira/gekipawa.cgi?k...
http://www.hatena.ne.jp/1070843189#
Perlプログラムで教えてもらいたいのですが、複数ある中から選択した1つの値を変数として取得してそれを投げるソースを考えているのですがどうしてもうまくいきません。ど.. - 人力検索はてな
やりたいのはこういう事じゃないですかね?
※”と¥は半角に直してから実行して下さい。
print <<”_EOF_”;
<font color=”$tcolor” size=”$tsize”>管理モード画面</font>
チーム名を入力してください。
<form action=$cgifile method=$method>
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=text name=team size=15>
<select name=team>
_EOF_
foreach (@users) {
($A,$B,$C,$D,$E,$F,$G,$H) = split /<p>/;
print ”<option value=’$A’>$A¥n”;
}
print <<”_EOF_”;
</select>
<input type=submit name=login value=”Enter”>
</form>
_EOF_
蛇足ながら他人が配布しているスクリプトに関するものの場合は、配布元を提示した方が解決は早いと思います。
自作の場合も前後の関係がわからないと混乱の元になりますので、
可能な限り情報を提示するべきと思います。
すいません。配布元はここです。
これのgekipawa.cgiの中に含まれています。
多少中身を改造したので変わっていてややこしいと思います。元々はテキストフォームに手入力でチーム名を入力する形でしたので。
最初の<form>〜</form>は、カットして、こんな感じでどうだろう。
print ”<font color=¥”$tcolor¥” size=$tsize>管理モード画面</font>
¥n”;
print ”
¥n”;
print ”チーム名を選択してください。
¥n”;
print ”<form action=$cgifile method=$method>¥n”;
print ”<select name=team>¥n”;
foreach (@users) {
($A,$B,$C,$D,$E,$F,$G,$H) = split /<p>/;
print ”<option value=$A>$A</option>¥n”;
}
print ”</select>¥n”;
print <<”_EOF_”;
<input type=hidden name=login value=1>
<input type=hidden name=kanri_mode value=1>
<input type=submit name=login value=”Enter”>
</form>
_EOF_
みなさんのソースを参考に自分で作ってみましたがやはり失敗・・・動くことは動くんですがチーム名をブルダウンから送信して処理がうまくいきません。
sub kanri{
if($form{’kanripass’} ne $kanri_pass){ &error(’パスワードが違います。’); }
&header;
print <<”_EOF_”;
管理モード画面
チーム名を入力してください。
_EOF_
open(US,”$leaguefold/$userfile”) || &error(’指定されたファイルが開けません。’);
eval ’flock(US,1);’;
seek(US,0,0); @users = <US>; close(US);
eval ’flock(US,8);’;
$ii = 0;
foreach (@users) {
($saku,$dmy,$home,$team,$icon,$dmy,$dmy,$teamdata) = split /
/;
$ii++;
if($ii eq 1){ print ”</table>
¥n”;
print <<”_EOF_”;
_EOF_
主に自分で変えた処理は
↑でリストに名前をつけて
$sentakulist=$form{’sentaku’};
↑でその値を取得する
↑でその値を送信しています。
参考にじゃなくて、まずそのまま試して下さい。
それじゃ動かないのは当り前です。
kiyoshi917 さんが書いている通りFORMタグが二つにわかれています。
基本的に <form> 〜〜 </form> の間が送信されますので、
セレクトボックスとEnterボタンとでFORMが二つにわかれている状態では
Enterボタンを押しても、セレクトボックス内で選択した値は送信されません。
最初に書いた通り、提示した例文で試してみて、それの動作確認が取れてから自分流にカスタマイズして下さい。
すいません、とりあえず一応は全部そのまま試してみてるんですけども、form2つを1つにするということまではやっていませんでした。
さっそくkiyoshi917さんの方法をやってみましたが、うまくいきませんでした。
gabaさんmasiさんの方法も改めてもう一度試させていただきましたがやはりダメでした。
以下は自分でmasiさんのコードをそのまま真似たものです。
print <<”_EOF_”;
管理モード画面
チーム名を入力してください。
_EOF_
open(US,”$leaguefold/$userfile”) || &error(’指定されたファイルが開けません。’);
eval ’flock(US,1);’;
seek(US,0,0); @users = <US>; close(US);
eval ’flock(US,8);’;
$ii = 0;
foreach (@users) {
($saku,$dmy,$home,$team,$icon,$dmy,$dmy,$teamdata) = split /
/;
$ii++;
if($ii eq 1){ print ”</table>
_EOF_
以上です。
一応、kiyoshi917さんの方法も書いておきます。
open(US,”$leaguefold/$userfile”) || &error(’指定されたファイルが開けません。’);
eval ’flock(US,1);’;
seek(US,0,0); @users = <US>; close(US);
eval ’flock(US,8);’;
$ii = 0;
print ”
_EOF_
どちらの方法も直接form{’sentaku’}を直接どこにも使ってないのですが大丈夫なのでしょうか?
form{’sentaku’}はsentakuという名前のブルダウンの現在のリストインデックスの値を見に行くということで合ってますよね?
人力検索はてな - 質問一覧
URLはダミーです。
大元のスクリプトでは、
(1) FORM表示[team欄は、空欄の入力欄]
(2) team入力
(3) form送信[team欄は入力済]
となっています。
kinkaさんのスクリプトでは、
(1) FORM表示[team欄は、未定義の$sentakulist]
(2) sentaku選択
(3) form送信[team欄は、未定義のまま]
となっています。
Perlの実行は、Form(というかHTML)の表示後 すぐに終了しますので、formでチームをセレクトしても、$sentakulistに反映されません。
javascriptを使用せず、perlのみで処理するなら、<select name=sentaku>を<select name=team>にかえて、<input type=hidden name=team value=”$sentakulist”>を削除すればよいかと思います。
当然、
@select = ();
#$sentakulist = ”selected”;
と
$sentakulist=$form{’sentaku’};
は、不要になります。
できました!ありがとうございます。
まさにおっしゃる通りで
が間違っていましたね。
よく見たらgabaさんkiyoshi917さんも=teamにしているじゃありませんか。本当にすいません、気がつきませんでした。
とにかく本当にありがとうございます。
ポイントは3人に分けることにします。
失礼、では質問を変えます。
大量のデータファイル(@user)をブルダウンメニューにして選択肢の中から値を1つ選んでその選んだ値を取得して、(例えば$Aを)投げるプログラムを私が書いたソースに近い感じで書いてもらえないでしょうか?