• ベストアンサー

サブルーチンの呼び出しに変数を使うには。

初心者なので頓珍漢な事をお聞きしているかもしれないですがお願いします。 htmlページの分岐を行いたいと思ってまして、1ページ、1サブルーチンにしてhtmlを埋め込んでいます。その分岐の呼び出しに以下のような、命令で処理したいと思ったのですが上手くいきません。 &html$FORM{page}; 舌足らずな質問の仕方だと承知なのですが、サブルーチンの呼び出しに変数を使うにはどうしたらよいのでしょうか?よろしくお願い致します。

noname#107402
noname#107402
  • Perl
  • 回答数3
  • ありがとう数5

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

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.3

&html$FORM{page}; という書き方はできません。 サブルーチンを実行する部分を次のようにしてみてはどうでしょう。 eval "&html$FORM{page}"; evalは次に書かれている式をperlのプログラムとして解釈して、 実行してくれる命令です。 $FORM{page}が1のときは、 "&html$FORM{page}"→'&html1' となり &html; が実行されます。 もしサブルーチンがないなどのエラーがevalで生じたときは、 $@という特殊変数にそのエラーがセットされています。 下のようにエラー処理をするのが普通ですね。 eval "&html$FORM{page}"; if($@){ # エラー処理。 if($@ =~ /Undefined subroutine/){ .... } } ご参考まで。 認証とか関係あるのかどうかは謎ですねえ。 どんなことをするCGIなんだろう。@:-)

noname#107402
質問者

お礼

やっぱり書き方を変えれば、動くんですねー。確認できました。 evalって結構使うんですかね。 フォーム入力でパスワードを管理していて、その値でページの分岐、生成をしています。(実際には値でなくて、パスワード入力で生成されたページからのリンクの引数で分岐なんですけど、、) この自分の文章で伝わるものか、プログラムは質問するのも難しいです。 どーも、ありがとうございました。

その他の回答 (2)

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.2

えと、アンカーのために一応書いておきます。 > で、本体プログラムファイルで、フォームで入ってきた値を見てページを分岐させたいと思っています。 > ページ生成する形だと認証が取れるのでそうしています。 認証と言うのが解らないのですが…… とにかく必然が解りません。 サブルーチンで関数を定義しているのだから、funaさんのやりたい事との 可読性や手間は変わらないはずなのですが。 どうも変数からコード生成しないとメインにサブルーチンの内容をメイン に埋め込まないといけないように考えているように読み取れるのですが、 もしそうなら私の先の例を良く見て下さい。

noname#107402
質問者

お礼

何度もありがとうございます。 認証って変かな?と思っていたのですが、つまり、フォーム入力でパスワードを管理していて、その値でページの分岐、生成をしています。 htmlを埋め込んである別ファイルに sub html { if($_[0] eq 'pagename1') { …… また、別のファイルに sub html { if($_[0] eq 'pagename2') { …… とすれば良いということでしょうか?正直、初心者なものでニュアンスがわからないです。別ファイルに同じsub htmlを書くのに抵抗がありますし、htmlを埋め込んである別ファイルのif文をページごと変えなくてはいけないこともネックです。 元々、htmlが埋め込んである別ファイルのperl文は更新管理のため、一切修正したくないと思っているのです。 まだ、ちょっと自分の書き方が悪いです。スミマセン。

  • marimo_cx
  • ベストアンサー率25% (873/3452)
回答No.1

変数からコードの生成は出来ますが、この目的で使って有意義と 思えません、面倒くさいし…… &haml('pagename1'); sub html { if($_[0] eq 'pagename1') { …… } elsif($_[0] eq 'pagename2') { …… と、引数でたらたらたら、と、書いていけば良いと思いますが。 htmlを別ファイルにして埋め込まないほうが管理し易いと思いま すけども。

noname#107402
質問者

お礼

ありがとうございます。 でも、自分の言いたい事と違ったように思います。 もう一度、補足で書いて見ます。スミマセン。

noname#107402
質問者

補足

sub html1が埋め込んであるファイル sub html2が埋め込んであるファイル sub html3が埋め込んであるファイル         :         : とたくさんhtmlファイルがあるんです。 で、本体プログラムファイルで、フォームで入ってきた値を見てページを分岐させたいと思っています。ページ生成する形だと認証が取れるのでそうしています。 if($FORM{page} ==1){ &html1; }elsif($FORM{page} ==2){ &html2; }elsif($FORM{page} ==3){ &html3; } というに書くのを止めて &html$FORM{page}; この一行で処理したいんですけど上手くいかない。。。 やっぱりif文でツラツラと書かないと駄目なんでしょうか。 伝わりましたでしょうか?

関連するQ&A

  • PHPからHTMLへの変数の受け渡し

    form.html→page1.php→page2.php というようなページをつくり、form.htmlでテキストエリア等<form>を使いpage1.phpにデータ:nameを送るとします。 その際$name = $_POST['name'];とするとphpでの変数になってしまってpage1のhtml上では認識されませんよね? page1からpage2に移動するときにform.phpでいれたnameのデータも <input type="hidden" name="名前" value="name"> というように使いたいのですがその際page1内でphpでの$nameをhtmlのnameに代入というかデータの受け渡しが必要になるかと思うのですがそれはどのように記述すればいいのでしょうか? ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPで変数のデータ受け渡しについて

    HTMLで下記のようにして入力された データを次ページに受け渡し、 issetで変数に値が代入されていれば ifで分岐処理させたいのですが、 elseの処理しかできません。    <FORM action="次ページ.php" method="GET">    キーワード<BR>    <INPUT type="text" name="keyword">    <INPUT type="submit" value="ボタン"> ボタンをクリックしたら次ページで    if (isset($keyword)) {     分岐処理1;     }    else{     分岐処理2;     } と行いたいのですが、$keywordに値が 代入されているにも関わらず elseの処理がされてしまいます。 どこか構文が間違っているのでしょうか。 どうか教えてください。

    • ベストアンサー
    • PHP
  • ヒアドキュメントでHTMLを書いて次へをクリックするとサブルーチンが表示される方法は?

    こんにちわ。perlでCGI学んでます。初心者です。 CGIの中にヒアドキュメントでHTMLを書きました。 そのページの最後に「次のページへ」というフォームボタンをつけました。ボタンをクリックするとサブルーチンの次ページが表示されるようにしたいのですが、うまくいきません。ボタンはinputタグのボタンにしたいので、テキストリンクにはしません。 「次のページへ」をクリックするとサブルーチンのpage1の中が表示されるようにするにはどうしたらいいですか?hiddenタグをボタンの下に書けばいいといわれたのですが、どうもうまくいきません。ご存知のかた、ご教授願います。 以下のようにソースを書きましたがうまくできません。。。。 #!/usr/bin/perl $script="test.cgi" print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> あなたの注文したものは●●です。 よろしかったら次のページへを押してください。 <form method="post" action="$script"> <input type="submit" value="次のページへ"> <input type="hidden" name="page1" value="page1"> </form> </body> </html> EOF ####サブルーチン###################### sub page1{ print <<"EOF"; Content-type: text/html <html> <head> <meta content="text/html; charset=shift_jis"> <title></title> </head> <body> お買い上げありがとうございました。 </body> </html> EOF }

    • ベストアンサー
    • CGI
  • Perl/JavaScript/サブルーチン

    はじめまして。 今ちょっといじってるプログラムについてお聞きしたいことがあります。 index.htmlのtextareaからmy.cgiを呼び出したい のですが。my.cgiというのは 1.textareaに入力された文章をデータベースに保存。 2.日付順にソートし新しいものを一つだけ取り出す。 3.index.htmlに表示する というものなのですが。 デフォルトでtextareaに一番新しい情報が入るようにしたいのです。valueで指示したのですがJavaScriptが邪魔してブラウザに反映されません。ソースを見るとvalue="********"とはいっています。 my.cgiを呼び出す命令を記述したmy.jsというファイルを作ってサブルーチンのように扱うという方法も考えているのですが、呼び出しやindex.htmlに表示させる記述の仕方が分かりません。 どなたか分かる方は、どうぞ宜しくお願いいたします。

  • javascriptにphpの変数を用いる

    JavaScriptでサブウインドウのフォームから親ウインドウのフォームにデータを送るプログラムを書いています。 親ウインドウのページによって処理を変えているのですが、phpの変数を使うと関数自体がエラーになってしまいます。 どう書くのが正しいのでしょうか?教えてください。 プログラムは下記です。 if(page=="0"){ window.opener.document.form_name.input_name.value=input_data; window.close(); } else{   for(i=1; i<6; i++){     var pagename = "page_"+i;     if(page == pagename){ window.opener.document.<?php echo $_GET[form_name]; ?>.<?php echo $_GET[input_name]; ?>.value=input_data; window.close();   } }

  • use strictを宣言してlocal変数を使うには?

    Perl初心者です。初歩的な質問ですが、 サブルーチンの中で my だと、その下の{ } ブロックではmyで宣言したローカル変数がスコープされないので  localを使うのではないかと思いますが、 それだと、use strictではエラーになります。 こんなときどう処理したらよいのでしょうか。

    • ベストアンサー
    • Perl
  • foreachでループした変数を他のサブルーチンに受け渡す方法を教えてください。

    ループして変数に入る値を他のサブルーチンに渡すにはどのようにしたらいいのでしょうか?以下に記述を書きましたが、sub mainの中の$dataをsub htmlの中で表示させて、sub mainでループさせた値をすべてsub mailへわたしたいのです、hiddenタグで<input type=\"hidden\" name=\"all\" value=\"$all\">とやってもうまくいきませんでした。@inの中をループさせるので@inをそのままかけばいいのでしょうか?これもうまくいきませんでした。。ようはループさせた値をすべてメールで送信したいのです。どうしたらうまくできますでしょうか? sub main{ foreach(@in){ ($name1,$value1) = split(/=/,$_); $data="$name1 : $value1"; print "$data"; print "<br>"; } sub html{ print "Content-type: text/html\n\n"; print <<EOF; <html> <head> </head> <body> &main; <form action="" method=""> <input type=\"hidden\" name=\"all\" value=\"$all\"> <input type=\"submit\" value=\"送信する\"> </form> </body> </html> EOF } sub mail { ####省略しますが、ここはメールの送信の記述です。 }

    • ベストアンサー
    • Perl
  • エクセルマクロのサブルーチン引数で配列を使用したい

    VBA初心者です。 エクセルのマクロを組んでいるですが、サブルーチンの引数を配列にしたいのですが、どうすればよろしいでしょうか? 下記に例を示します。 呼び出し(Call)とサブルーチンの配列変数の記載方法がわかりません。 特に気になるのは、サブルーチンの配列に配列数(下記であれば10)を記入する必要があるのか? 必要な場合、元の配列数を変更した場合、どうすればミスなく、漏れなく修正できるか、良い方法はありまんせんか? (例) (呼び出し側) Dim AA(10) As Integer Call Test(AA)     ← 引数はAAでよい?それともAA() Sub Test(ByRef AA As Integer) ← AA or AA() or AA(10) ? AA(3) = AA(2) + AA(1) 以上、お手数をおかけしますが、よろしくお願いします。

  • 変数の受け渡しについて

    MS-DOSのBATファイル内に「VBで作成したEXEファイルをCALLする」記述を 追記しようと思っています。 全体の流れは、BATファイルの処理中に使用している変数をEXEファイルに引き渡し、 EXEファイルは受け取った変数の条件分岐処理をし、その結果を再びBATファイルに 返すことです。 教えていただきたい内容は、変数を受け取る際および引き渡す際の記述の仕方についてです。 ちなみにEXEファイルの処理内容は、受け取った変数(日付:YYMMDD書式)のMMの箇所が 「01~03」の場合はAを、「04~09」の場合はB、「10~12」の場合はCを 新しい変数としてBATファイルに返すことです。 どうかよろしくお願い致します。

  • equals() を使って、変数に入っている文字列を比較

    いつも大変お世話になっております。 下記のように、変数に入った値によって条件分岐をしたいのですが、 うまくいきません・・。 どのように書くべきでしょうか。  変数aaaに入っている値がnaninaniだったら”~~~”と処理したいのですが。 if(aaa.equals("naninani")){ ~~~省略~~~ } 何卒、初心者なので途方もない質問かもしれませんが、よろしくお願いします。

    • ベストアンサー
    • Java