• ベストアンサー

変数値に付いて

数日前から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がでてくる。 どういうことなのでしょう? 教えてください。 お願いします。   

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

  • ベストアンサー
  • yatokesa
  • ベストアンサー率40% (201/496)
回答No.2

if ~else の処理の分岐は action というキーに対して regist (登録)、remove(削除)という処理を行い、どれも該当しない場合は html 処理を行う。ということですよね。 ここで、htmlの処理内容を見てみると、想像するに HTMLを吐き出す処理と思われます。regist / remove処理のあとに html処理を使って HTMLを吐き出す処理をする、と言うのはイレギュラーなものとは感じません。 また、html処理の中で再度 actionにより処理を分けているのは、前の if ~ elseで処理を分けたものとは意味が異なります。html処理で HTMLを吐き出す場合に remove(削除)処理だけは特別なことをしたい、ということは良くあることです。 プログラム全体が見えないので想像で書いていますが、そんな感じではないでしょうか。

noname#3339
質問者

お礼

>html処理の中で再度 actionにより処理を分けているのは、前の if ~ elseで処>理を分けたものとは意味が異なります。 まだまだ漠然としていますが,なんとなくわかってきたような気がします。 "そういうものなのか"、ぐらいの理解ですけど。 とりあえず前進してみます。 これからもよろしくお願いします。 勉強します。

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

その他の回答 (1)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

htmlというサブルーチンは、ほかのところで呼び出されていませんか? 汎用性を持たせるために、こうなっているのでしょう。

noname#3339
質問者

補足

さっそくのご回答ありがとうございます。 >htmlというサブルーチンは、ほかのところで呼び出されていませんか? >汎用性を持たせるために、こうなっているのでしょう。 検索したら、後のほうでも使われていました。 ただ分からないのは、結局、最初に出てくるremoveと、&html内のは違うものなのか、同じ物なのか、ということなんです。 同じ物だとするとなんだか矛盾を感じますし、(removeでなかったら&htmlへ、ですよね?) 違うものだとすると、プログラム内で両者が混同される事がないのか。 不思議です。 よろしくお願いします。

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

関連するQ&A

  • 再帰処理で変数が戻ってきません

    下記プログラムで$viewdataの値が再帰処理時にうまく渡されません。 $actionのregistは渡されるのですが、なぜでしょうか? <html> <head></head> <?php $data_file="new_bbs.log";//ログファイル if(!isset($PHP_SELF)){$PHP_SELF=$_SERVER["SCRIPT_NAME"];} if(!isset($action)){$action=$_POST['action'];} if(!isset($viewdata)){$viewdata=$_POST['viewdata'];} ?> <body> ■TEST<br> <FORM ACTION="<?php echo $PHP_SELF; ?>" METHOD="POST" ENCTYPE="multipart/form-data" style="margin: 0px;"> <INPUT TYPE="HIDDEN" NAME="action" VALUE="regist"> <INPUT TYPE='SUBMIT' VALUE='---UP---'> <?php if($action != "regist"){ $viewdata= file_get_contents( $data_file );//ログファイルのデータ読込 echo "<br>データ:".$viewdata; }else{ echo "再帰データ:".$viewdata; } ?> </FORM> </body> </html>

    • ベストアンサー
    • PHP
  • この意味を教えて下さい。

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

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

    $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
  • フォームのアクションから引数をとる

    <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
  • perl-cgiのサイズと実行速度について

    perl-cgiのサイズと実行速度について 下記のように、$ENV{'QUERY_STRING'}の値によって、使う、サブルーチンを振り分けているCGIが2つあります。 sub app*は非常に似たような内容で、ひとつの大きさが200KB程度あります。 sample1.cgi と sample2.cgi ではサーバのCPU時間にどの程度の影響がありますか? CGIの内部でベンチマークを取得してみたところ、sample2.cgiでは、0.02cpu程度上昇した程度で、大きな差は見られませんでした。 しかし、共有の、レンタルサーバで使う予定ですが、その場合、毎回、200KBのCGIをコンパイルして実行と、毎回、400KBのCGIをコンパイルして実行されるため、ベンチマークでは計りきれないところが心配です。 また、CPU時間に差が出たとしても、それは、無視できる程度の物でしょうか? まったく持って、見当が付きませんので、どなたか、ご存知の方、教えていただけると幸いです。 宜しくお願い致します。 =sample1.cgi============== $qs = $ENV{'QUERY_STRING'}; if($qs eq 1){ &app1(); }else{ &app2(); } sub app1(){ #いろいろ } sub app2(){ #いろいろ } =sample2.cgi============== $qs = $ENV{'QUERY_STRING'}; if($qs eq 1){ &app1(); }elsif($qs eq 2){ &app2(); }elsif($qs eq 3){ &app3(); }else{ &app4(); } sub app1(){ #いろいろ } sub app2(){ #いろいろ } sub app3(){ #いろいろ } sub app4(){ #いろいろ }

  • ひとつのCGIファイルに複数のページの動作を管理

    CGI超初心者です。 HTMLファイルにいくつかラジオボタンを設置し、 これとこれを選んだらこのページを開く、 次のページで、 これとこれを選んだらこのページを開く・・・ というような構成でサイトを作っています。 CGIで条件分岐させていますが 書き方が良く分からないので教えてください。 第一ページ用の条件分岐CGIの下に、第二ページ用の条件分岐CGIを書きましたが うまく動いてくれません。 どちらかを削除するとうまく動きます。 ひとつのCGIファイルに、 複数のページの条件分岐をまとめて書くことは出来ないのでしょうか? ページごとに別々のCGIファイルを作成しなければならないですか? 以下具体例です。 ---第一ページ.html--- <form name="q1" action="test.cgi" method="POST" > ・・・ <input type="submit" value="送信する" /> </form> ---第二ページ.html--- <form name="q2" action="test.cgi" method="POST" > ・・・ <input type="submit" value="送信する" /> </form> ---CGI--- #====================下準備====================== if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $str, $ENV{'CONTENT_LENGTH'}); } else { $str = $ENV{'QUERY_STRING'}; } foreach $i (split('&', $str)) { $i =~ tr/+/ /; $i =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg; ($t1, $t2) = split('=', $i); $FORM{"$t1"} = $t2; } #===================変数の設定=================== $q11 = $FORM{'q11'}; $q12 = $FORM{'q12'}; #=================条件分岐_質問1================= if ($q11 eq "q11_a") { print "Location: ./ba1.html\n\n"; } elsif ($q11 eq "q11_c") { print "Location: ./ba2.html\n\n"; } ・ ・ ・ else { print "Location: ./go2.html\n\n"; } #===================変数の設定=================== $q21 = $FORM{'q21'}; $q22 = $FORM{'q22'}; #=================条件分岐_質問2================== if ($q21 eq "q21_a") { print "Location: ./co3.html\n\n"; } elsif ($q22 eq "q22_a") { print "Location: ./ba4.html\n\n"; } ・ ・ ・ else { print "Location: ./go3.html\n\n"; }

    • ベストアンサー
    • CGI
  • アンケートフォーム複数ページ間のテキストフォームデータのの受け渡し

    こんにちわ、1ページ目の名前のテキストフォームに入力した内容のデータと2ページ目のメールアドレスのテキストフォームに入力したデータをのデータを確認画面で表示させたいのですがうまくできません。わらをもすがる思いでここに書きました。 1ページ目 名前を入力 2ページ目 メールアドレスを入力 3ページ目 確認画面 4ページ目 サンクスページ わたしが書いたソースは以下のとおりです。。 どうしてもデータをうまく確認画面にもっていくことができませんよろしければ詳しい方、アドバイスをお願いいたします。よろしくお願いします! ※ここの文字数制限が800文字なのでかなり省略化しています。 if ($FORM{'action'} eq "page2") {&page2;} elsif ($FORM{'action'} eq "") {&page1;} elsif ($FORM{'action'} eq "kakunin") {&kakunin;} elsif ($FORM{'action'} eq "kanryou") {&kanryou;} #1ページ目 sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> </head> <body> <form method="post" action="$script"> □お名前(漢字)<br> <input type="text" size="12" name="name1" value="$FORM{'name1'}" > <input type="hidden" name="name1" value="$name1"> <input type="hidden" name="action" value="page2"> <input type="submit" value="次へ"> </form> </body> </html> EOF exit; } #2ページ目 sub page2{ 文字数制限のため省略 メールアドレス } #■フォームのデコード処理 sub decode{ 文字数制限のため省略 } #確認画面 sub kakunin{ 文字数制限のため省略 } #送信完了画面 sub kanryou{ 文字数制限のため省略 }

    • ベストアンサー
    • Perl
  • アンケートフォーム複数ページ間のテキストフォームデータのの受け渡し

    こんにちわ、1ページ目の名前のテキストフォームに入力した内容のデータと2ページ目のメールアドレスのテキストフォームに入力したデータをのデータを確認画面で表示させたいのですがうまくできません。わらをもすがる思いでここに書きました。 1ページ目 名前を入力 2ページ目 メールアドレスを入力 3ページ目 確認画面 4ページ目 サンクスページ わたしが書いたソースは以下のとおりです。。 どうしてもデータをうまく確認画面にもっていくことができませんよろしければ詳しい方、アドバイスをお願いいたします。よろしくお願いします! ※ここの文字数制限が800文字なのでかなり省略化しています。 if ($FORM{'action'} eq "page2") {&page2;} elsif ($FORM{'action'} eq "") {&page1;} elsif ($FORM{'action'} eq "kakunin") {&kakunin;} elsif ($FORM{'action'} eq "kanryou") {&kanryou;} #1ページ目 sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> </head> <body> <form method="post" action="$script"> □お名前(漢字)<br> <input type="text" size="12" name="name1" value="$FORM{'name1'}" > <input type="hidden" name="name1" value="$name1"> <input type="hidden" name="action" value="page2"> <input type="submit" value="次へ"> </form> </body> </html> EOF exit; } #2ページ目 sub page2{ 文字数制限のため省略 メールアドレス } #■フォームのデコード処理 sub decode{ 文字数制限のため省略 } #確認画面 sub kakunin{ 文字数制限のため省略 } #送信完了画面 sub kanryou{ 文字数制限のため省略 }

    • ベストアンサー
    • CGI
  • cgiのカスタマイズが上手く行きません

    http://www.rescue.ne.jp/ のサイトにあります 「簡易データベース」http://www.rescue.ne.jp/cgi/database/ のカスタマイズが上手く行きません。 登録の項目を「名前」「星座」「血液型」に絞り登録をし、 「星座」「血液型」の項目選択で両方が一致した人の 「名前」を検索結果に出そうと思っています。 「改造箇所 index.html・・・フォームのカスタマイズ regist.html・・・フォームのカスタマイズ regist.cgi・・・#入力チェック部分、{'EMAIL'}の削除(未使用のため) search.cgi・・・      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data);      とし、それぞれ $data = $data2 = $BASE[$num]; &jcode'convert(*data,'euc');      ($d,$NAME,$BLOOD,$BIRTH) = split(/\,/,$data); # 血液型 if ($FORM{'BLOOD'} ne 'all') { if ($BLOOD eq $FORM{'BLOOD'}) { ; } else { next; } } # 誕生日 if ($FORM{'BIRTH'} ne 'all') { if ($BIRTH eq $FORM{'BIRTH'}) { ; } else { next; } } と改造。と、最小限のカスタマイズをしたつもりですが、どうしても ●ご指定の条件では見当たりませんでした. となり、検索に引っかかりません。 データ自体はcsvedit.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