CGI-BBS > CGI > Perl > submitボタンを押した後でサブルーチンを再帰させたい


カレッヂ
カレッヂ


質問者 マルチ  投稿日 9/9(月) 13:50:06
数回サブルーチンを読み出して処理を行うのですが、
それらの処理の違いがほとんどないので
再帰を利用して1つのサブルーチンだけで済ませたいと思っています。

サブルーチン内に書かれた
<input type="button" value="submit">
のようなボタンを押すことによってこのサブルーチンを再帰させるというものです。
しかし実際にやってみるとボタンが押される前に
全ての処理を繰り返されてしまい再帰が終了してしまいます。

所有している書籍等を調べたのですが解決できなかったので
こちらの質問でお世話にならせていただこうと思いました。
アドバイス、どうかよろしくお願いいたします。

この改造は「PETROOM」というPerlで書かれたCGIを
アレンジする過程の1つとして生まれました。

PETROOM配布元 MissingLink様 
→ http://www.area-s.com/main/missinglink.html

プロバイダ参照:http://www.cside.ne.jp/
サーバのOS:UNIXサーバ
パソコンのOS:Win95系
エディタ:TeraPad
FTPソフト:FFFTP
サーバ移転:していない
改造:(未選択)
CGI習熟度:middle

質問者 マルチ  [削除]  投稿日 9/9(月) 13:59:18
具体的な改造中(悩んでいる)の周辺関連部分です。
この状態では期待できる作動はしてくれません。
このCGI独自の便宜上の仕様がかなりあるのでわかりづらいかと思いますが
どんな感じの処理の流れか確認ください。

# ------------------------- #
# Sub Explanation1
# 説明画面1
# ------------------------- #

sub explanation1{

    ($pagenum)=@_;

    &header;
    &bodytop('ゲーム内容説明');
    &tabletop;

    print "はじめまして!$nameさん。<br>\n";
    print "ゲームを始める前にしっかりと説明を読んでくださいね。<br>\n";
    print "読みづらい場合はスクロールバーで画面を動かしてみてください〜!<br>\n";
    print "</td>\n";
    print "</tr>\n";
    &tablebottom;

    &bar('','PETROOMの遊び方');

    print "<tr>\n";
    print "<td>\n";

    ($subexplain)=@_;
    &exurl(@_);

    print "</iframe>\n"; 

    print "</td>\n";
    print "</tr>\n";

    &bar('','ページ移動');

    print "<tr>\n";
    print "<td>\n";
    &tabletop;
	
    print "読み終わったら下のボタンを押して次のページへ移動してください。<br>\n";
    &input('hidden','name',$FORM{'name'},'','');
    &input('hidden','pass',$FORM{'pass'},'','');
    &input('submit','','次のページへ','class=button','');

    &tablebottom;
    &bodybottom;
    &footer;
}

# ------------------------- #
# Sub Explanation1 URL
# 説明画面1用URL
# ------------------------- #
sub exurl{
($subexurl)=@_;
print "<iframe src=\"http://localhost/prog/cat1.html\" scrolling=\"auto\" width=\"100%\" height=\"400\">"if @_ == 0; 
print "<iframe src=\"http://localhost/prog/cat2.html\" scrolling=\"auto\" width=\"100%\" height=\"400\">"if @_ == 1;
print "<iframe src=\"http://www.yahoo.co.jp/\" scrolling=\"auto\" width=\"100%\" height=\"400\">"if @_ > 1;
}

# ------------------------- #
# Sub Input
# インプット
# ------------------------- #
sub input {
    print "<input type=\"$_[0]\" name=\"$_[1]\" value=\"$_[2]\"$_[3]>$_[4]\n";
}
回答者 しあわせのツボ  [削除]  投稿日 9/9(月) 15:05:12
何をしたいのか、よくわからないのですが。
利用者から見て何度か画面遷移があり、それらを1つのルーティンで
処理したいというのなら、それは再帰処理という形にはなりませんし、
逆に本当にプログラム上の再帰処理をしたいのなら、
それはinputタグではなく&sub;で直接呼ぶことになりますが、
そのどちらなのか、それとももっと別のことなのか、読み取れません。
質問者 マルチ  [削除]  投稿日 9/9(月) 15:44:22
どうも申し訳ございませんでした、、、。
処理の流れを見直してもう一度質問を書き直してみます。(改善されてるかな?_汗)
ちなみに上のプログラムはいじっている最中のものなので
再帰に関する部分が抜けています。
最初は再帰ではなくサブルーチンの外からforループで読み出そうとしていたのですが
うまくいかなかったので再帰でやってみようと思いました。
処理がうまくいけばループでも再帰でもどちらでもいいかなと思っています。
----------------------------------------
----------------------------------------
まず、&explanation1が読み出されます。
&explanation1は
このゲームの説明が書かれたhtmlファイルを表示させる処理をします。
表示させたいhtmlファイルは&exurlにて指定します。
説明を読んだ後、2ページのhtmlファイルを読むために
「次のページへ」のボタンを押します。
----------------------------------------
表示させたいhtmlファイルが1つだったらよいのですが
2つ以上ある場合には&exurlに渡す引数の値を
ループを回す度に1つずつ増やさなければいけません。
引数を変えることでhtmlファイルを指定したいからです。
そこでforやwhileを使ってループを書いてみたのですが
増えたはずの引数が反映されてくれないのです。
○○++; と書いて値を1つ増やしてもサブルーチンを読み直した際に
値が初期化されてしまいます。
○○++;をサブルーチンの中に書いても外に書いても結果は同じでした。
-----------------------------------------
Perlでは指定しない限りグローバル変数として扱われるはずなので
どこに書いても値が反映されると思っていたのですが…違うのでしょうか?
変更した値が反映されてくれればおそらくすぐに今回のこの問題は
解決してくれると思っているのですが…。。。

不明な点があればまたご指摘下さい。
なるべくお伝えすることができるように努力しますので…よろしくお願いいたします。
回答者 しあわせのツボ  [削除]  投稿日 9/9(月) 16:10:29
HTMLファイルを3つ読み出し、それを1ページに同時に表示するのですか?
それとも、まず1つめのHTMLを読み出して表示し、
利用者が「次」を押したら2ページ目を表示するのですか?
両方やりたいように見えるのですが、違いますよね。

後者のように読んだ方が自然なようなので、そのつもりで説明しますと、
再帰処理は必要ありません。
submitされた値をとり、sub explanation1の引数として渡すだけです。

仮に前者だとするなら、ループ処理をどのように書いたか提示してください。
質問者 マルチ  [削除]  投稿日 9/9(月) 18:14:59
ご返答どうもありがとうございます!
後者の方をしようと思っています。
そうか…ではもう一度チャレンジしてみますね!
つまずいたらまたご厄介になるかもしれませんが
その際もどうかよろしくお願いいたします〜♪

それでは失礼いたします。

返信(回答)する


Web裏技