• 締切済み

CGI.pmのパラメーターの名前と格納物の一括処理について

最近perlをはじめて、独学で勉強しております。 プログラム自体始めてで、なんとか各関数を覚えて、 現在初CGIとして自作メールフォームに挑戦しています。 そこでCGI.pmを使いたいのですが、項目追加時などの事を考えると 汎用性を持たせたいと思った時、 my @list = $cgi->param; foreach my $name ( @list ){   my $in{};     my $val = $cgi->param($name); $val = $cgi->escapeHTML($val); $in{$key} .= defined $in{$name} ? "\0$val" : "$val"; } ========================================================== この後その都度そのパラメーターを見極めて、 それようの自作のチェック関数へ引数として渡す。 ========================================================== しか思いつかず、同名複数データ(チェックボックスなどの時、 配列になっている)を どう処理していいかさっぱりわかりません。 どなたかCGI.pmにてフォームを受け取った時、汎用性を持たせる方法 をご存知でしょうか? 現在は仕方なくフォーム値を read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});で取得 ================================================= GET値はファイルアップロードとかを行わないので即undef $bufferを配列に格納、splitして$keyと$valに格納 10進数にもどして分割。foreachでまわして ====================================================== $val =~ s/&/&amp;/g; $val =~ s/"/&quot;/g; $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; $val =~ s/\r\n/\<BR\>/g; $val =~ s/'/'/g; $in{$key} .= defined $in{$key} ? "\0$val" : "$val"; としています。 また、オブジェクト指向がいまいちわからず、 メインルーチンには処理の流れ (最低限の呼び出しとゲッターとセッター?)だけを書いて、 他をモジュール化して参照をなんどもする方法を きちんと覚えるにはデザインパターン(?)とか言う物を 覚えたらいいんでしょうか? 初めてOKWAVEを使うのでわかり辛い説明になっているかもしれませんが、自分が気づかない分かりづらい部分はお手数ですがおっしゃっていただければ、できる限りのご説明をさせていただきます。 ご存知の方、よろしくお願いいたいます。 最後に 最終的なアップ先はレンタルサーバーなので、 もしモジュールが必要なら モジュールは最低限ピュアモジュールか依存関係の少ない アップできるだけで動くモジュールだとありがたいです。 アップ環境はperl5.8です。

みんなの回答

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.1

CGI.pmを使えば、あなたがされている処理はすべてCGU.pmで可能です。 こちらに詳しい説明があります。 CGI - 簡単なCGI(Common Gateway Interface)クラス http://homepage3.nifty.com/hippo2000/perltips/Cgi.htm フォームから受け取ったデータをCGI.pmで順番にキーの配列と値の配列に入れ、それを順番にShiftで取り出せばよいです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • チェックボックスで得た複数回答をCGIモジュールを用いて簡潔に取り出すには

     <input type="checkbox" name="id" value="0">  <input type="checkbox" name="id" value="1">  <input type="checkbox" name="id" value="2">  <input type="checkbox" name="id" value="3"> のようなフォームのキーと値を、CGIの方では%inで受け取ります。 まずCGIモジュールを用いてキーと値を$keyと$valに格納したのち、idというキーは4つの値を受け取るので、  foreach my $key ($q->param()) {   my $val=$q->param($val);   if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } 私のイメージでは、この処理で  $in{'id'}="0\01\02\03"; が得られるつもりでした。 ところが実際には$q->param('id')で取り出せるのは最初の"0"のみで、したがって得られる結果は  $in{'id'}="0"; となります。 CGIモジュールを使わなければ、  my $buf;  if(ENV{'REQUEST_METHOD'} eq "POST") {   read(STDIN,$buf,$ENV{'CONTENT-LENGTH'});  }  else {   $buf=$ENV{'QUERY_STRING'};  }    foreach(split(/&/,$buf)) {   my ($key,$val)=split(/=/);      if(defined($in{$key)) {    $in{$key}.="\0";   }   $in{$key}.=$val;  } のようにして、イメージ通り  $in{'id'}="0\01\02\03"; を得られますが、CGIモジュールは他でも使うので、どうせならCGIモジュールを使った簡便なコーディングが出来ないものかと思案する次第です。 しかしながら私に思いつく方法は  <input type="checkbox" name="id0" value="0">  <input type="checkbox" name="id1" value="1">  <input type="checkbox" name="id2" value="2">  <input type="checkbox" name="id3" value="3"> として、まずCGIモジュールを用いた上記の方法で$in{'id0'}~$in{'id3'}までを生成し、次に  if(/(\w+)\d/) {   if(defined($in{$1})) {    $in{$1}.="\0";   }   $in{$1}.=$val;  } とやる方法しか思いつきません。 チェックボックスを用いて複数回答を得るというのはよくある話なので、CGIモジュールにもっと良いコーディングの仕方がありそうな・・・と思ってしまうのですが、これが最善の方法なのでしょうか?

    • ベストアンサー
    • Perl
  • リクエストパラメタを一括置き換え

    リクエストパラメタを一括置き換え if( $ENV{'REQUEST_METHOD'} eq "GET" ) { $buffer = $ENV{'QUERY_STRING'}; } else { read( STDIN, $buffer, $ENV{'CONTENT_LENGTH'} ); } %req_params = map { /([^=]+)=(.+)/ } split /&/, $buffer; 上記のように書いていて、リクエストされたものを置き換える時は次のように一個一個書いています。 $req_params{name} =~ s/&/&amp;/g; $req_params{mail} =~ s/&/&amp;/g; $req_params{url} =~ s/&/&amp;/g; このリクエストされたパラメタを一括で置き換えするにはどうすればいいのでしょうか? 例えば、上記の書き方で以下のようなことをしたいです。よろしくお願いいたします。 if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } foreach ( split(/&/, $buf) ) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; $val =~ s/&/&amp;/g; $req_params{$key} .= "\0" if (defined($req_params{$key})); $req_params{$key} .= $val; }

    • ベストアンサー
    • Perl
  • メールフォームから自動返信される結果の文字が2回繰り返されます。

    perlでできたCGIメールフォームをカスタマイズしていますが、テストをすると、自動返信されるメールに、結果が一部、2重に表示されてしまいます。 尚、inputからパラメータを渡して、送信メールに反映できるようにしたいのです。 何度も試してみましたが、解決できませんでした。 この原因を探るにはどのあたりを疑っていけば早いでしょうか。 ざっくりでもかまいません。ヒントをいただけたら大変助かります。 全コードは難しいので、 疑わしいと思うコードと、カスタマイズの際追加した部分のコードのみ以下に掲載します。 よろしくお願いします。 ======================================================== ~ foreach my $key ($in->param) { my @list = $in->param($key); $in{$key} = join('/',@list); } ~ ======================================================== ~ my $q = new CGI; my $item_name = $q->param('item_name'); # HTMLテンプレート パラメータ $tmpl->param( 'type' => $type, 'item_name' => $item_name, 'error_count' => scalar keys %{$error_list}, ); ~ ========================================================

    • ベストアンサー
    • Perl
  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • テキストエリアの<br />を非表示にするには

    掲示板のようなCGIを利用し、入力フォームから送信された情報が保存されるプログラムを利用しています。 そのcgiファイルに記述されたコードに以下の記述があります。 sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key !~ /upfile/ ) { &Jcode'convert(*val, "utf8", "", "z"); if ( $key !~ /label_name/ ) { $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; } $val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g; } $in{"$key"} = "$val"; } $_v = $in{"_v"}; $del_img = $in{"del_img"}; } この記述によりテキストエリアで改行された際に「<br>」に変換されると思うのですが、これを<br>から<br />に変えるため、 $val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g;を $val =~ s/\r\n/<br \/>/g; $val =~ s/\r|\n/<br \/>/g;と変えました。 これにより、保存される改行コードが<br>から<br />に変わったのですが、その情報を編集するため再度保存された情報の入力フォームを呼び出すと、 テキストエリアでは改行されず、改行場所に<br />と入力されてしまいます。 もとのコードではテキストエリア内の改行は<br>が表示されず、ちゃんと改行されていました。 そこで以下のように書き直してみたのですが、やはり状況は変わりません。 sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key !~ /upfile/ ) { &Jcode'convert(*val, "utf8", "", "z"); if ( $key !~ /label_name/ ) { $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; $val =~ s/ / /g; } $val =~ s/\r\n/<br \/>/g; $val =~ s/\r|\n/<br \/>/g; } $in{"$key"} = "$val"; } $_v = $in{"_v"}; $del_img = $in{"del_img"}; } 改行コード<br>を<br />に変更し、保存された情報を呼び出してもテキストエリアで改行コード<br />は表示されることなく改行される記述方法を教えてください。 分かりにくい文章で申し訳ありませんがよろしくお願いします。

    • ベストアンサー
    • CGI
  • Perl BBS 掲示板 改行処理

    改行処理について教えてください。 今まで書き込み処理で unshift @DATA, "$tm,$FORM{'name'},$FORM{'title'},$FORM{'text'}\n"; としていたのですが、これを use CGI; my $form = new CGI; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); に変更しました。 すると sub loadFormdata が聞かなくなり、 改行処理他が対応しなくなってしまいました、 この場合、 loadFormdataの部分のどこを変えればよいでしょうか? |------書き込み処理------| sub printdata{ use CGI; my $form = new CGI; &loadFormdata(); open(FILE, "<$FILE"); eval{ flock(FILE, 1) }; @DATA = <FILE>; close FILE; my $tm = time; my $NAME = $form->param('name'); my $TITLE = $form->param('title'); my $TEXT = $form->param('text'); unshift(@DATA,"$tm,$NAME,$TITLE,$TEXT\n"); while(@DATA > $MAX) { pop @DATA; } open(FILE, ">$FILE") or die("error :$!"); eval{ flock(FILE, 2) }; print FILE @DATA; close FILE; } |------改行処理他------| sub loadFormdata { my ($query, $pair); if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } foreach $pair (split(/&/, $query)) { my $key = ("$NAME,$TITLE,$TEXT"); my ($key, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value =~ s/&/&amp;/g; $value =~ s/</&lt;/g; $value =~ s/>/&gt;/g; $value =~ s/\x0D\x0A\s*/<br>/g; $value =~ s/\s+/ /; $FORM{$key} = $value; } }

    • ベストアンサー
    • Perl
  • 指定ディレクトリからcookie取得

    $cook = $ENV{'HTTP_COOKIE'}; foreach ( split(/;/, $cook) ) { ($key, $val) = split(/=/); $key =~ s/\s//g; $cook{$key} = $val; } $cook{'name'} ./index.cgiで、上記のように$ENV{'HTTP_COOKIE'}でクッキーを取得しています。 このままでは./に保存されたクッキーが取得されてしまいますが、これを、任意のディレクトリ(./../html/等)に保存された場所から取得したいと考えていますが、可能でしょうか。 CGIが設置されているディレクトリ = 'http://hogehoge/cgi-bin/'; COOKIEを読み込むディレクトリ = 'http://hogehoge/html/';

    • ベストアンサー
    • Perl
  • CGI..pmを使っての画像のアップロードについての質問です。

    お世話になります画像ファイルをサーバーにアップロードしたいのですが、巧くいきません。以下のコードを実行しますと O.K. File(C:\Documents and Settings\Administrator\My Documents\My Pictures\mozi_g0.gif) was uploaded as /tmp/upload_1111735699_26448 と表示されますが、これで本当に画像ファイルがアップされているのでしょうか? 私見だとサーバー側にtmpというフォルダーに画像ファイルがアップロードされるものと思い /cgi-bin/upload.cgi と同じ所にtmpというフォルダーを作りパーミッションは755にしましたが アップロードをしても空フォルダーのままです、ローカルのフォルダーの画像をサーバー側に保存する方法を御教授お願い出来ませんでしょうか html側のコード <html> <body> <form action="/cgi-bin/upload.cgi" method="POST" ENCTYPE="multipart/form-data"> file <input type="file" name="uploadFile"><br> <hr> <input type="submit" value="OK"> </form> </body> </html> ファイルアップロード本体(upload.cgi) #!/usr/bin/perl use CGI; my($form) = new CGI; print $form->header("text/html"); my($filename) = $form->param('uploadFile'); $uniqid = time . "_" . $$; $newfile = "upload_$uniqid"; # ファイルの内容を表示する。 # このように、$filename をファイルハンドルのように使うこともできる。 #while(<$filename>){ # print $_ . "<br>\n"; #} # ファイルを保存する。 open (OUTFILE,">/tmp/$newfile") or die "Can't make serverside file!\n"; while ($bytesread = read($filename,$buffer,1024)) { print OUTFILE $buffer; } print "O.K. File($filename) was uploaded as /tmp/upload_$uniqid<br>\n";

    • ベストアンサー
    • Perl
  • デコードフォームについて。

    以下のスクリプトについて質問があります。かなり多いのですが・・・ sub DecodeForm #返り値:Name=>Val のハッシュ(グロブ) #使用例:*form = EncodeForm(); print $form{name}; { my($encoding) = @_; my($method) = $ENV{'REQUEST_METHOD'}; local($query, @in, $key, $val); require 'jcode.pl' if $encoding; if ($method eq 'GET') { $query = $ENV{'QUERY_STRING'}; } elsif ($method eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } local(@query) = split(/&/, $query); foreach (@query) { tr/+/ /; ($key, $val) = split(/=/); # %HH形式を元の文字にデコードする。 $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; jcode'convert(*key, $encoding) if ($encoding); jcode'convert(*val, $encoding) if ($encoding); $in{$key} = $val; } return *in; } 多いので先頭から順に箇条書きにさせて頂きます。 ・Name=>Val の意味。(#以下がメモであることは分かっています) ・グロブとは何か ・*form = EncodeForm(); print $form{name}; の意味。(特に、先頭の*が分かりません) ・my $encoding という変数も見たことがあるのですが、my($encoding) と my $encoding はどう違うのか。 ・クエリとは何か ・jcode.pl とは、インストールしたPerlに標準でついているライブラリなのか?そうでないのならjcode.plとは何か? ・%HH形式とは何か ・\rの意味 ・jcode'convert の意味 ・*key の * の意味 ・*in の * の意味 多くて申し訳ないです。分かる方いらっしゃいましたご教授くださると幸いです。よろしくお願いします。

    • ベストアンサー
    • Perl
  • 改行<br>を<br />に変える方法

    テキストエリアで改行した際に以下のコードですと改行は<br>になります。 これを<br />に変更したいのですが、自分なりに試してみたのですが全くうまくいきません。 sub decode { &ReadParse; while (($key,$val) = each %in) { if ($key !~ /upfile/ ) { &Jcode'convert(*val, "utf8", "", "z"); if ( $key !~ /label_name/ ) { $val =~ s/</&lt;/g; $val =~ s/>/&gt;/g; } $val =~ s/\r\n/<br>/g; $val =~ s/\r|\n/<br>/g; } $in{"$key"} = "$val"; } どなたか<br />に変更する記述を教えて頂けませんでしょうか?

    • 締切済み
    • CGI
このQ&Aのポイント
  • 飲食業や接客業の中でマスクを外す方向性の人や、お客の前ではマスクを外すように通達がある企業はどのくらい存在するのか気になります。
  • マスク不足を経験した上でマスクをすることの重要性を実感している人にとって、マスクをしない人やマスクを買わずにいる人の行動に疑問を感じることも多いです。
  • マスクを着用することで風邪を予防でき、健康になると感じている人にとって、マスクは必需品であり、大切な存在です。
回答を見る