• ベストアンサー

この意味を教えて下さい。

よく、CGIを見ていると始めのほうにこのような行があるのですが、 これはどうゆう意味があるのでしょうか? if ($FORM{'mode'} eq 'view') { &view;exit; } elsif ($FORM{'mode'} eq 'delete') { &delete; } elsif ($FORM{'mode'} eq 'input') { &input; } また、「$FORM{'mode'} 」の意味も教えていただきたいのですが・・・。 よろしくお願いします。

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

  • ベストアンサー
noname#24096
noname#24096
回答No.2

下記のような感じではないかと思います。 >if ($FORM{'mode'} eq 'view') { &view;exit; } もし、$FORMという連想配列のmodeの値が「view」ならviewサブルーチンを実行してexit >elsif ($FORM{'mode'} eq 'delete') { &delete; } あるいは、$FORMという連想配列のmodeの値が「delete」ならdeleteサブルーチンを実行 >elsif ($FORM{'mode'} eq 'input') { &input; } あるいは、$FORMという連想配列のmodeの値が「input」ならinputサブルーチンを実行 恐らく、スクリプトのどこかに sub view{…} sub delete{…} sub input{…} という部分があるはずです。 &viewでsub view{…}を &deleteでsub delete{…}を &inputでsub input{…}を それぞれ呼び出しているということです。 このsub xxx{…}の部分の処理がサブルーチンです。

OUHO
質問者

お礼

分かりやすく本当にありがとうございます。 とても参考になりました。

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

その他の回答 (1)

  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

>$FORM{'mode'} これは連想配列と言います。 通常、配列というと、a(0),a(1),…,a(n)というように配列の添字には数値を指定します。 連想配列というのは、配列変数の添字に文字を指定してより直感的に配列変数が使えるようになります。 CGIフォームで入力項目が複数ある場合(例:カレンダー) # デコード(GETメソッドで指定された年月を受け取るためのもの) #パラメータ:y=年,m=月,d=日 local($Query_String) = $ENV{'QUERY_STRING'}; @pairs = split(/&/,$Query_String); foreach $pair (@pairs) {   ($name, $value) = split(/=/, $pair);   $value =~ tr/+/ /;   $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;   $QUERY{$name} = $value; } この場合ですと$QUERY{'y'},$QUERY{(m'},$QUERY{'d'}にそれぞれ年月日が入ります。

OUHO
質問者

お礼

本当にありがとうございます。

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

関連するQ&A

  • php と perl

    perlで掲示板を作成する際はだいたい、 ####メインルーチン if($FORM['mode']="write";){&write;} elsif($FORM['mode']="usr_delete";){&usr_delete;} elsif($FORM['mode']="user_edit";){&usr_edit;} elsif($FORM['mode']="admin";){&admin;} … &html; exit; ####サブルーチン sub write { #書き込み処理 } sub usr_delete { #削除処理 } … といったように記述しますよね。 これをphpでも同じように、 //メインルーチン switch ($_POST['mode'])  case "write":   write();  case "delete":   delete();   … //サブルーチン function write(){…} function delete(){…} … と書くのは効率的ではないでしょうか。 効率とは"速さ"や"実装の仕方として適切ではないかどうか"、という意味です. 他サイトで配布されているphpのスクリプトに目を通すと、そう記述しているものがあまりみられませんでした。 もう1つ疑問なのですが、掲示板のスクリプトにクラスを使っているサイトが多々ありました。もちろんつかってないスクリプトなどもありましたが、掲示板作成をする際、クラスを使うメリットはあるのですか?

    • ベストアンサー
    • PHP
  • 変数値に付いて

    数日前からCGIの勉強を始めた素人です。ご教授,よろしくお願いします。 実際のプログラムを見ながらのほうが覚えるだろうと思い、フリーのスクリプトをダウンロードしてきてそれを見ながら勉強しています。 で、つまずきました。 if ($FORM{'action'} eq 'regist') {&regist;} elsif ($FORM('action') eq 'remove') {&remove;} else {&html;} sub html{   if ($FORM{'action'} eq 'remove') { … 1行目で三つに場合分けしているんですよね? で、subはremoveではないとき。 なのにまたその関数の定義の中で、removeがでてくる。 どういうことなのでしょう? 教えてください。 お願いします。   

    • ベストアンサー
    • CGI
  • 短くできないでしょうか

    $Print0 = "0.htm"; $Print1 = "1.htm"; $Print2 = "2.htm"; ... $Print199 = "199.htm"; $Print200 = "200.htm"; と200程度変数があったとして sub _Test{ my $Print; if($FORM{CMD} eq '0'){ $Print0; } elsif($FORM{CMD} eq '1'){ $Print = "$Print1"; } elsif($FORM{CMD} eq '2'){ $Print = "$Print2"; } ... elsif($FORM{CMD} eq '199'){ $Print = "$Print199"; } else{ $Print = "$Print200"; } print <<HTML; $Print HTML } 何とか上記のような形で関数の外にある変数を取得する所まで設定出来たのですが、 このようにすると400行近くになる為、もし$FORM{CMD} eq '1'の値を変数に置き換え取得可能な場合ですと、 少ない行で済ませられるんじゃないのかな・・と考えたのですが可能でしょうか。 イメージとしまして 、 $Print$変数 = "$変数.htm"; if($FORM{CMD} eq '$変数'){ $Print$変数; } 上記のような形で取得可能でしたら物凄く短く済ませられそうに感じてしまいます。 先輩方のお知恵をお借りできましたら幸いです。ご教授宜しくお願い致します。

    • ベストアンサー
    • Perl
  • htmlからcgiに変数を配列にして渡すとき

    フォームにて、質問1,2,3…と入力してもらい、 1を答えないで2を答えるとか、 2を答えないで3を答えるとかを排除したいので、 変数を配列にして受け取りたいのです。 とりあえず今のところはこうなってます。↓ #htmlファイル# <INPUT type="text" size="30" name="situmon[1]"> <INPUT type="text" size="30" name="situmon[2]"> ... としてcgiに持っていき、 #cgiファイル# for($i=1; $i<=4; $i++){ if($form{'situmon[$i]'} eq "" && $form{'situmon[$i+1]'} ne ""){ &error; #→エラーメッセージサブルーチン exit; } } のようにして受け取ろうとしてるのですが、うまくいきません。 上のようにhtmlではどう書くべきか、cgiではどう受け取るべきかを教えてくだされば嬉しいです。

    • ベストアンサー
    • CGI
  • if ステートメントについて質問

    今ifステートメントについて勉強してるのですが 自分が調べた感じではこのように書いてありました。 If condition Then [statements] [ElseIf condition-n Then [elseifstatements]] . . . [Else [elsestatements]] End If しかし、以前に作った掲示板のメイン処理のあたりを見てみると、↑のようでなく if ($mode eq "howto") { &howto; } elsif ($mode eq "find") { &find; } elsif ($mode eq "usr_del") { &usr_del; } ・ ・ ・ 見たいな感じです。これは今自分が勉強しているところと違うところですか?

    • ベストアンサー
    • Perl
  • フォームのアクションから引数をとる

    <form action="test.cgi?ref=5" method="post"> このような感じで、引数を送ります。 my $cgi = CGI::new(); my $ref = $cgi->param('ref'); if ($ref eq 0){ (省略) }elsif ($ref eq 5){ こんな感じでプログラムを書きました。 アドレスを見ても、ちゃんとref=5となっていますし、 普通に<a href="test.cgi?ref=1">などのリンクから飛べば、指定したifの処理に入ります。 しかし、 <form action="test.cgi?ref=5" method="post"> 上のフォームのsubmitから送ると、ref=5のifが判別されません。 どうすれば、判別してくれるのでしょうか? ご存知の方がいらっしゃいましたら、ご教授ください

    • ベストアンサー
    • CGI
  • リダイレクト転送について

    URL一つで使用端末の種類別のURLに飛ばしたいのですが CGIぼんさんのところのUser Agent を使った方法のを採用したいと考えています。 # User Agent によるキャリア判別 @user_agent = split(/\//,$ENV{'HTTP_USER_AGENT'}); if ($user_agent[0] eq 'ASTEL') { # ドットi 用の処理 } elsif ($user_agent[0] eq 'UP.Browser') { # EZweb 旧端末用の処理 } elsif ($user_agent[0] =~ /^KDDI/) { # EZweb WAP2.0 対応端末用の処理 } elsif ($user_agent[0] eq 'PDXGW') { # H" 用の処理 } elsif ($user_agent[0] eq 'DoCoMo') { # i-mode 用の処理 } elsif ($user_agent[0] eq 'J-PHONE') { # J-SKY 用の処理 } elsif ($user_agent[0] eq 'L-mode') { # L-mode 用の処理 } else { # それ以外 } 具体的にはどのような記述にしてどこにアップすればよいのでしょうか? 初心者なので御教授戴ければ幸いです

    • ベストアンサー
    • CGI
  • 削除ボタンを押すとperlにてデータを削除するようにしたいんですができません。

    フォーム.html(一部) <form name="form1" method="post" action="admin.cgi"> <input type="hidden" name="mode" value="edit3"> <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><b>クライアント(ロードサイド)</b> <input type="hidden" name="group" value="1"> <br> ※前のページへ戻る場合には、ブラウザの戻るボタンでお戻りください。</td> </tr> </table> <br> <table width="740" border="1" cellspacing="0" cellpadding="10" align="center" bordercolor="#333333"> <tr> <td bgcolor="#FFEEEE">このデータを削除する場合には、下の削除ボタンをクリックしてください。<br> ※この作業は取り消しができませんので、よく確認してから削除ボタンをクリックしてください。<br> <br> <input type="button" value="物件NO: _%data_num%_ を削除する" onClick="location.href='admin.cgi?mode=del&group=_%group%_&data_num=_%data_num%_'"> <br> この「物件NO: 」のボタンを押すとadmin.cgiに飛び データファイル内のデータを空にします。 ----------------admin.cgi---------------------------------- if($param{'mode'} eq 'del'){ ##===================================== ## 物件データをオープン = ##===================================== if($param{'group'} eq '1'){ $datafile = $datafile1;} elsif($param{'group'} eq '2'){ $datafile = $datafile2;} elsif($param{'group'} eq '3'){ $datafile = $datafile3;} if(!stdio::lock($lock)){ error('システムエラー','只今混み合っております.'); } # ロック if(!open(DATA,"+<$datafile")){ stdio::unlock($lock); &error('システムエラー',"ファイル ( $datafile ) をオープンできませんでした。"); } @data = <DATA>; foreach(@data){ @data2 = split(/,/); if($data2[0] eq $param{'data_num'}){ $_ = ''; last; } elsif($data2[0] eq $param{'data_num2'}){ $_ = ''; last; } } seek(DATA,0,0); print DATA @data; truncate(DATA,tell(DATA)); close(DATA); stdio::unlock($lock); ##===================================== ## テンプレートオープン = ##===================================== if(!open(HTML,$html_finish)){ &error('システムエラー',"ファイル ( $html_finish ) をオープンできません。"); } @html = <HTML>; close(HTML); ##===================================== ## HTML出力 = ##===================================== print <<"EOF"; Content-type: text/html @html EOF exit; } # モード del ここまで ----------------------------------------------------- この「data_num2」の削除には成功するんですが 「data_num」の場合はボタンを押しても何も起こりません。 恐らく「data_num」のif文に行っていないのだと思うんですが、 何が原因か分かりません。 情報が少ないかもしれませんが 解決の糸口をお願いします。 データはcsv形式のファイルです。

    • ベストアンサー
    • HTML
  • cgiでのユーザーIDとパスワードの認証

    パスワードの確認しかないcgiにユーザーIDの認証も追加したいのですが、どのように変更すれば良いのかわかりません。皆さんのアドバイスよろしくお願いします。 ※ユーザーID $text = 'test' # パスワードの確認 if ($formdata{'pass'} eq $password or $cookies{'pass'} eq $password) { $access = $upload = $delete = 1; $cookie = "Set-cookie: pass=$password\n"; } elsif ($formdata{'pass'} or $cookies{'pass'}) { $form_log .= "パスワードが正しくありません。<br>"; }

  • 解析機能の拡張について

    おはようございます。いつもお世話になっています。 今回は解析機能の拡張についてお聞きしたいと思います。 解析機能については、かんたん作成.comさんのcgiをお借りしました。 http://www7a.biglobe.ne.jp/~wwwwww/analyzer/ これをベースに、検索ワードの集計機能を追加しようと思っております。 word1、word2に検索ワードの表示・分割がありますが、新たにword3を設けて分割されたものを集計し、表示する処理をしたいです。 集計については、前回までで教えていただいた正規表現を用いて自ら組んでみたのですが、変数が一致していないせいか上手く表示できません。 以下に検索ワードを処理しているプログラムを記載します。 elsif($FORM{'mode'} eq "word1" or $FORM{'mode'} eq "word2" or $FORM{'mode'} eq "word3") { #検索ワード my ($n, $pair, $word); if($referer =~ /\?/) { my ($url, $query) = split(/\?/, $referer); for($n = 0 ; $n < @search ; $n++) { if($url =~ /$search[$n][1]/) { foreach $pair (split(/&/, $query)) { my ($key, $value) = split(/=/, $pair); if($key eq $search[$n][2]) { $word = $value; last; } } last; } } if($word) { $word =~ tr/+/ /; $word =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; if($FORM{'mode'} eq "word1") { ++$freg{$word}; } elsif($FORM{'mode'} eq "word2") { my $word2; $word =~ s/\x81\x40/ /g; foreach $word2 (split(/\s+/, $word)) { if($word2) { ++$freg{$word2}; } } } #=====================================================================EDIT elsif($FORM{'mode'} eq "word3") { my %word_of = map {$_ => 0} %freg; foreach my $search_key ( keys %word_of ) { foreach my $word ( keys %word_of ) { $word_of{$search_key}++ if $word =~ /$search_key/; } } foreach ( sort ( keys %word_of ) ){ print "<table><tr><td>「$_」 </td><td> $word_of{$_} 件</td></table>\n"; } } #=====================================================================END } } } } word3の項目が現在私が編集している部分です。 プログラム全体を通して、私自身が望む動作を可能とする部分の追加は行ったと思うのですが、見落としている点があるかもしれません。 また前述したように、変数が一致していないのかもしれません。 おかしな点に気づかれたら、お手数ですがお教え願えますか。 もしかしたら初歩的なミスをしているかもしれませんが、よろしくお願いいたします。 不明な点などございましたら、随時対応します。 ここでは書ききれないため、現在編集中のcgiファイルを添付データとして貼り付けておきます。

このQ&Aのポイント
  • 宛名によって印刷時の差出人を切り替える方法について解説します。
  • Q&Aの「宛名によって印刷時の差出人を切り替える方法」で設定しても切り替えができない問題について説明します。
  • ソースネクスト株式会社の製品・サービスに関連する質問になります。
回答を見る