Perlプログラムで教えてもらいたいのですが、複数ある中から選択した1つの値を変数として取得してそれを投げるソースを考えているのですがどうしてもうまくいきません。どうしたらいいでしょうか・・・以下は見様見真似で作った失敗作ソースです。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]’};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=$AA size=15><input type=submit name=login value=”Enter”></form>_EOF_

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答11件)

id:ohmix1 No.1

回答回数235ベストアンサー獲得回数14

プログラムの意図が良く分からないのですが、Perlプログラムというよりは、まずCGIについてもう少し理解されてから再度質問されてはいかがでしょうか?

id:kinka

失礼、では質問を変えます。

大量のデータファイル(@user)をブルダウンメニューにして選択肢の中から値を1つ選んでその選んだ値を取得して、(例えば$Aを)投げるプログラムを私が書いたソースに近い感じで書いてもらえないでしょうか?

2003/12/08 10:28:43
id:aki73ix No.2

回答回数5224ベストアンサー獲得回数27

ソース、後でよく見せてもらいますが

とりあえず気づいた点としては

’や”や¥が全角になってますね(汗)

id:kinka

半角で書いたつもりなんですけど・・・もう一度書いておきます。

ここではブルダウンで選択した$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_

2003/12/08 11:26:48
id:aki73ix No.3

回答回数5224ベストアンサー獲得回数27

多分これで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;

}

id:kinka

難しすぎてわからない(泣

私でも使える処理があると助かるんですけど・・・

print <<”_EOF_”;

_EOF_

実際私はこの辺の処理が全く理解できてません

2003/12/09 00:44:32
id:sasada No.4

回答回数1482ベストアンサー獲得回数133

ポイント70pt

http://www.hatena.ne.jp/list

人力検索はてな - 質問一覧

 URLはダミーです。

 質問の意味はわかりましたが、プログラムの意味はわかりませんでした・・・。

 Perlの初心者というわけでもないのですけど。

 意味がわからない箇所としては、

 (1) foreachループの中で毎回「@select = ();」と「$select[$A] = ”selected”;」をしている意味

 (2) ループの後で出てくる「$form{’$select[$A]’}」の $formってなに?

 (3) 上記(2)で、なぜ引数をシングルコーテーション「’」でくくるのか? 変数を展開したくないの?

という点です。

 あと、「if($ii eq 1)」という条件文ですが、eqは文字列比較の演算子です。

 数値として比較したいなら == では?

 というか、この条件文全体をforeachの前に持ってきても良いのでは?

 if (@users > 0) で判断できるでしょうし。

 できれば、各変数の意味を書いておいたほうが、適切な回答を期待できると思います。

id:kinka

私が作ったプログラムではないので私には説明はむりです。

このソースは一部抜粋して貼り付けしているので全体からすれば、ちゃんとした処理になってます。

2003/12/09 00:49:44
id:will0 No.5

回答回数34ベストアンサー獲得回数0

やはり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_

で終わりです

この答えが的外れな場合はポイントは要りません

http://www.kent-web.com/

:: KENT WEB - CGIスクリプト ::

また、KENTさんなどで簡単なCGIを読んでみるといいかもしれません

正しいかどうかはおいておいて

読みやすく理解しやすいと思います

id:kinka

たぶんおおまかにはそれで合ってるはずなんですが・・・取得して投げるのがなかなかうまくいきません。

これが問題の稼動しているCGIです。コピペしてください。

http://k1ring.hp.infoseek.co.jp/cgi-bin/raira/gekipawa.cgi?k...

ここにメールいただければ問題のCGIごと送ります。kinkaiya0@hotmail.com

問題が解決すれば全ポイント差し上げたいと思います。

2003/12/09 07:20:09
id:GEAR No.6

回答回数33ベストアンサー獲得回数0

プルダウンメニューと、そこで選択した値をinputのname属性値として使うのは同一のページでのことなんでしょうか?

だとしたら、サーバー側で処理を行うCGIではなく、クライアント側で処理を行うJavaScriptを使用する必要があります。

JavaScriptを使うのであれば、まずselectで選択された値を取得し、それをinputのname属性値に代入するという処理を行うというのが主な流れです。

id:masi No.7

回答回数356ベストアンサー獲得回数0

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の値が代入されています。

id:kinka

やはりうまくいきませんでした。

$form{’sentaku’}や

¥n”; }

print ”

@select = ();

#$sentakulist = ”selected”;

}

$sentakulist=$form{’sentaku’};

print ”¥n”;

print <<”_EOF_”;

_EOF_

主に自分で変えた処理は

↑でその値を送信しています。

2003/12/17 07:23:32
id:gaba No.10

回答回数90ベストアンサー獲得回数1

参考にじゃなくて、まずそのまま試して下さい。

それじゃ動かないのは当り前です。

kiyoshi917 さんが書いている通りFORMタグが二つにわかれています。

基本的に <form> 〜〜 </form> の間が送信されますので、

セレクトボックスとEnterボタンとでFORMが二つにわかれている状態では

Enterボタンを押しても、セレクトボックス内で選択した値は送信されません。

最初に書いた通り、提示した例文で試してみて、それの動作確認が取れてから自分流にカスタマイズして下さい。

id:kinka

すいません、とりあえず一応は全部そのまま試してみてるんですけども、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>

¥n”;

print <<”_EOF_”;

_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 ”

¥n”;

print <<”_EOF_”;

_EOF_

どちらの方法も直接form{’sentaku’}を直接どこにも使ってないのですが大丈夫なのでしょうか?

form{’sentaku’}はsentakuという名前のブルダウンの現在のリストインデックスの値を見に行くということで合ってますよね?

2003/12/17 15:06:34
id:sasada No.11

回答回数1482ベストアンサー獲得回数133

http://www.hatena.ne.jp/list?

人力検索はてな - 質問一覧

 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’};

は、不要になります。

id:kinka

できました!ありがとうございます。

まさにおっしゃる通りで