• ベストアンサー

フォームから値を配列に渡すときの処理方法

フォームから値を配列に渡すときの処理方法 PERLでフォームからのデータの受け取り方、処理の仕方でご教授頂ければ助かります。 よろしくお願いいたします。 配列の要素数の調べ方、処理方法についてご教授頂ければ幸いです。 HTMLよりフォームのデータをcgi-lib.plの[&ReadParse(*in);]受け取っているのですが ●HTML側 セレクトボックスを5つ用意し同じNAME (select01)のnameを付けて CGI側で受け取りたいと考えております。 (基本的に間違えでしょうか?セレクトボックスの個数分用意したほうがいいでしょうか?) 受け取った値をCGI側で受け取り要素の個数をカウントさせ 条件に合わせてERRORを出したいと考えたのですが・・・ エラーの内容は 1っこ選んであればOKでそれ以外 0の場合はNG 2個以上選択した場合は NGという形を取りたいのですが。 配列の要素数で分岐できるのかと考えたのですが そもそもこの考え、処理方法は間違えでしょうか? アドバイスを頂ければ幸いですm(__)m require 'cgi-lib.pl'; &ReadParse(*in); ------------------------- # データ代入 @aaa =$in{'select01'}; #フォームデータを配列に代入 $count= @aaa; この場合だと 要素の数($count)は 1になっております。 いろいろ調べていますと cgi-lib.pl を使用した場合はブラウザ上で スペースに見えるが \0 だそうで・・・・ カンマで区切って 要素数を正しく表示させたいと思ったのですがうまくいきません。。 @aaa = split(/\0/,$in{'select01'}); などいろいろ試してみたのですが区切りがうまくいきません また、 $" = ','; @aaa = split(/\0/,$in{'select01'}); とすると カウントが変わったのですが・・・・ フォーム側の一番目を選択して送信するとカウントが 1!!  1と5番目を選択して送信したら 5!え?? で要素数を正しくカウントされていないようです。 ちなみに print @aaa; としてみると aaa,,,,eee と空の内容がカウントされてる?ようなかたちになりました。 ここで、行き詰ってしまいまして、もともとの私の安易な考えが間違えなのか? 書き方が間違えなのか。 と思い皆さまのアドバイスを頂ければ幸いです。 ・プログラムの考え方的には間違えなのか ・一般的な正しい処理方法はどうなのか それとも。。。。要素数で分岐することが可能であるのか。 お手数ですがアドバイス頂ければ幸いです。

  • Perl
  • 回答数3
  • ありがとう数18

質問者が選んだベストアンサー

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.2

> $count= @aaa; のようにすると、$count には $#aaa が代入されると勘違いしていました。 書かれているように要素数になるのですね。 質問の件は、 @aaa = split(/\0/,$in{'select01'}) で、正しく取り出せています。 ただ、"aaa\0\0bbb\0\0\0" という文字列を split /\0/ すると ("aaa","","bbb") という配列になり、途中にある空文字列は残りますが、行末の空文字列はなくなります。 なので、 @bbb = grep /./, @aaa; とでもして @aaa から空文字列の要素を取り除いてから要素数を求めればよいです。

2525web
質問者

お礼

t-okura さま。 早速アドバイスいただきありがとうございますm(__)m お返事が遅くなりすいません。先ほど試して実行してみました。 grepを使うのですね・・・条件, 調査対象とWEBで見たのですが なぜ grep/./,@ /./ ドットを使うのか無知なもんで勉強してみます。 実行した結果 無事に解決することができました!!!!ほんとにほんとにありがとうございます。 カウント数で分岐もできました。ありがとうございます! ただ今回の処理はプログラム的に邪道なのでしょうか??配列の要素数をカウントして 処理する。 初心者でよくわからないながら・・・この方法をとったのですが ほかの方法をもしご存知でしたら今後のためにもアドバイスいただければ幸いです。 よろしくお願いいたします。

その他の回答 (2)

  • kumoz
  • ベストアンサー率64% (120/185)
回答No.3

cgi-lib.pl には、\0 区切りの文字列を分割するためのサブルーチン SplitParam が用意されていると思います。 @aaa = &SplitParam($in{'select01'});

2525web
質問者

お礼

ありがとうございます。 そちらもやってはいたのですが 要素数をカウントできず困っておりました。 他の方がご回答いただいた @aaa = &SplitParam($in{'select01'}); のあと @bbb = grep/./,@aaa; とすると要素数をカウントすることができました。 ありがとうございます。

  • t-okura
  • ベストアンサー率75% (253/335)
回答No.1

> @aaa =$in{'select01'}; #フォームデータを配列に代入 > $count= @aaa; > この場合だと 要素の数($count)は 1になっております。 $count が 1 になっているのでしたら、 $aaa[0], $aaa[1] の 2つの要素が存在します。

2525web
質問者

お礼

ありがとうございます。 セレクトボックスで5個選んだ場合も1 何個選んでも1になるのですが。 要素数を正確に数えたいのですが。 一個選んだら 0 2個選んだら1 三個で 2 五個で4と・・ その要素数で分岐をしたいと考えております。

関連するQ&A

  • cgi.pmとcgi-lib.pl

    こんばんは。 cgi-lib.plを引用したCGIが動かないので、cgi.pmでためしにやろうと思っています。 そこでひとつ調べてもわからないのですが、cgi-lib.plのReadParseでは%inにフォームで送信したデータが全て入るのに対し、cgi.pmではいったいどこに全てのデータが格納されているのでしょうか?要素ごとに取り出す方法は調べることができましたが、配列ごとまとまって入っているところがわかりません。 ご存知のかた教えてください。よろしくお願いします。

  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI
  • cgi-lib.plの&ReadParse();の()の中

    cgi-lib.plのReadParseを使う時、  require 'cgi-lib.pl';  &ReadParse(*---); こんな風に書きますよね? ()の中はどういう意味なんでしょうか? 何でもいいんですか?

    • ベストアンサー
    • Perl
  • cgi-lib.plのReadParse関数

    あるパールからcgi-libを呼び出して、ReadParse関数を使おうとするとInternal Server Errorがでてしまいます。 パールの中身は #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse(*in); です。 そこで3行目と5行目の行頭に#をつけて飛ばすとパールは正常に動きます。 これってcgi-lib.plのReadParse関数がいけないんでしょうか? ダウンロードしたまま何も変更していないのに..... ちなみにサーバーのパールのバージョンは5.004のようです。

    • ベストアンサー
    • CGI
  • &ReadParseでフォームの値が取れない

    require "./cgi-lib.pl"; ・ print << "END"; <FORM method="POST" action="$self"> <TABLE border="0" cellspacing="6" width="600"> <TR> <TD valign="top" width="116">■メッセージ(※)</TD> <TD colspan="3" width="371"><TEXTAREA rows="10" cols="50" wrap="soft" name="message">$message</TEXTAREA></TD></TR> <TR> <TD valign="top" align="right" colspan="2"><INPUT TYPE="file" NAME = "file" size ="50"></TD> </TR> </TABLE> <INPUT TYPE=HIDDEN NAME=mycmd VALUE=do_write> <INPUT TYPE=HIDDEN NAME=time VALUE="$time"> <INPUT type="submit" value=" 送 る "> <INPUT type="reset" value="やり直す"> </FORM>・ ・ ・ ・ sub do_write { &ReadParse; $message = $in{'message'}; これでmessageの値が取れるはずなのですが、空のようです。同じプログラムで使えてたときもあったのですが、いじっているうちにReadParseが機能しなくなりました。といっても、cgi-libの中をいじったわけではありません。 確実にmessageフォームの中身を取る方法があったら 教えてください。 あるいは原因を探る方法でも結構です。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォームからの値

    今、pealで作成した CGIのフォームからの値を下記のように受け取っております。 $a = $in{"name"}; $b = $in{"pass"}; これを、配列で受け取りたいのですが、 $aを@aに変えただけでは、 $a[0]にすべての文字が入ってしまいます。 配列での受け取り方は、何か特殊な方法であるのでしょうか? また、一度変数にいれてしまった文字を、 配列に入れ替える、またはある1文字だけ抽出する方法など ありましたら、どうか教えてください。

    • ベストアンサー
    • CGI
  • フォームの値を取得できません、その他

    初心者です。フォームに日付が入ったとき、イベント処理でCGIプログラムを実行し、結果をインラインフレーム内にホットテキストとして表示したいのですが、 まず、イベントに自信がありません。フォームの値が取得できず、それ以降の処理もできていません。詳しくご教示いただけないでしょうか。 <FORM name="dateFORM" action="dateFORM.cgi" target="heute_artikel"><INPUT type="text" name="day" onfocus="dateFORM.cgi"><INPUT type="text" name="month"></FORM> としておいて、日付を増減するボタンを押すたびに、下のfunction setDatumIntoForm()を呼んで、数字をこのフォームに入れ、その数字をフォーム側がonfocus イベント処理で取得して、dateFORM.cgiを呼び、以下のような処理をさせたいのです。 function setDatumIntoForm(gkibakday, globalmonth) ////フォームに月日をいれる { document.dateFORM.day.value= globalday; document.dateFORM.year.value= globalmonth; } ** 以下はイベントで呼び出される dateFORM.cgi です ************************* #!/usr/local/bin/perl require 'cgi-lib.pl'; ##フォーム(dateFORM)の数字を取得したい。 &ReadParse(*dateFORM);  $day = $dateFORM{'day'}; $mon = $dateFORM{'month'}; ##これができません opendir(DIR, "kalender"); while ($file = readdir(DIR)) closedir(DIR); $todaystr=$mon'.'$day; #次に検索する/表示する for (@file) { $FLname = $_; $find = index $FLname, $todaystr; # 検索 if ($find =1) { <a href=$FLname>todaysKalenderFiles; #関連づけして、インラインフレームtodaysKalenderFilesにタイトルだけを表示したい。 } } exit;

    • ベストアンサー
    • Perl
  • ファイルから読み込んで配列へ

    PerlでCGIスクリプト(掲示板もどき)を作成しています。 配列の操作がうまくいかず、ご教授頂きたいと思います。 <やりたい事> 1.ブラウザ上のフォームからの入力を、カンマ区切りでテキストファイルに追記して保存。 2.そのテキストの一部を使ってHTMLで表を作る。 <実際の作業> 1.フォームからのデータはcgi-lib.plで連想配列として受け取り、unshiftでテキストファイルへ追記する。 &ReadParse; #フォームからデータを受け取る $o=$in{'name'}; $p=$in{'mail'}; $q=$in{'title'}; $r=$in{'comment'}; open(IN,"xxx.txt"); @tmp1=<IN>; close(IN); #1件1行として新規データを追加する unshift (@tmp1,"$oo" , "," , "$pp" , "," , "$qq" , "," , "$rr","\n"); open(OUT,">xxx.txt"); print OUT @tmp1; close(OUT); 2.xxx.txtのデータを読み込んで、1列目(name)と3列目(title)だけを使った表を作る。 データを読み込む時点でつまづき、先に進めません。 <テキストファイルの例> 1行目:a,b,c,d 2行目:e,f,g,h 3行目:i,j,k,l 以下同様 <症状> print @tmp1;とすると、a~lの全てのデータが表示される。 $tmp1[0];とすると、(a)のみ表示される。 $tmp1[1];とすると、カンマ(,)が表示される。 $tmp1[2];とすると、(b)が表示される。 <質問> 一つの行(配列)に対して2回繰り返す処理(nameとtitle)と、行単位で繰り返す処理(1行目、2行目…)を合わせればいいのだろうと思っていますが、どうすればいいのかわかりません。 気分的には↓こんな感じです。 foreach { "行の処理" foreach { "列の処理" } } そもそも、区切り文字であるカンマが、配列に格納されている時点で失敗しているのかな?とも思っています。 宜しくお願いします。 なお、不足している情報がありましたら補足いたします。

    • ベストアンサー
    • Perl
  • Perlでuse strictと %inの共存

    use strictを使うと、変数の使用に厳密にチェックしてくれるので、便利だと思い使いましたが、ReadParse後の%inを利用する場合に宣言されていないエラーが表示されます。意味的には正しいですが、$in{'test'}など CGIで受け取った内容が扱えなくなるので、困っております。何か解決方法は有るのでしょうか? use strict; require 'cgi-lib.pl'; require 'jcode.pl'; &ReadParse; my $x = $in{'md'};

    • ベストアンサー
    • Perl
  • POSTで受けたデータを jcode.pl するには

    あまりに初歩的で書き込むのが恥ずかしいです。 今、フォームからアンケートを自分宛にE-Mailで もらえる CGI を書いています。 日本語処理以外の部分はほとんど全部動きました。 しかし、日本語のテキストは、メーラ(NC4.7付属) で受信すると、「%ほにゃらら」みたいな表現に なっていて、そのままでは読めません。 jcode.pl の使い方が間違っているらしいことは 簡単に推測できますが、ではどうまちがっている のか見当がつきません。 内容: アンケートのフォームで使用しているフィールド名 は、value01~value66です。 そこで、Actionで指定している cgi で、以下のように 記述してみました。 #!/usr/local/bin/perl require './cgi-lib.pl'; require './jcode.pl'; #日本語コード変換処理 &jcode'convert(*value,'jis'); #連想配列に読み込み &ReadParse (*value); $to = 'nydela@imasy.or.jp'; $ipaddr = $ENV{'REMOTE_HOST'}; この後、メール・ファイルを開いてSendMail してやると、66個のフィールドが全部届き ますが、日本語は読めません。jcode.pl と cgi-bin.pl は、この cgi と同じディレクトリに あります。 日本語が入力される可能性のあるフィールド 番号は分かっているので、&ReadParse の後で 個別に convert したらいいのかと思ったのですが、 今度は連想配列の要素を jcode'convertに どうやって渡したらいいのかわからなくなりました。 アドバイスお願いします。 あと、どういうわけか、 $ipaddr = $ENV{'REMOTE_HOST'}; も、ブランクしか帰しません。ちなみに$ENVを たとえば PATH に変更しますと、きちんとその 値を返します。これもアドバイスお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう