- ベストアンサー
sub内をボタンで表示させるには
Perlを勉強しています。sub内を表示させるには&itemのようにすればいいようですが、送信ボタンなどで表示を切り替える場合の方法がわかりません。皆さんが作成されたスクリプトを見ては勉強しているのですが、意味がよくわかりません。 以下のtest.cgiを作成した場合に、表示1に移動するには、どのような送信ボタンを作成すればいいのでしょうか?よろしくお願いいたします。 sub item { 表示1 } sub regist { 表示2 }
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じで参考になるでしょうか。 例ではフォームに設定されたhiddenタグfuncの値を元にif文で分岐し、それぞれのサブルーチンを呼び出しています。 showForm→item→regist→showFormという感じでループして表示します。 #!/usr/bin/perl use CGI qw(:cgi); use strict; my $query = new CGI; print "Content-type: text/html\n\n"; my $func = $query->param('func'); if($func eq 'item'){ item(); }elsif($func eq 'regist'){ regist(); }else{ showForm(); } sub item{ print<<"EOL"; <html><body> <form action="thisscript.cgi" method="post"> <input type="submit" value="registを表\示"> <input type="hidden" name="func" value="regist"> </form></body></html> EOL } sub regist{ print<<"EOL"; <html><body> <form action="thisscript.cgi" method="post"> <input type="submit" value="showFormを表\示"> </form></body></html> EOL } sub showForm{ print<<"EOL"; <html><body> <form action="thisscript.cgi" method="post"> <input type="submit" value="itemを表\示"> <input type="hidden" name="func" value="item"> </form></body></html> EOL }
お礼
ありがとうございます。以下のようなことをやりたいのですが、この場合はどのようにすればいいのでしょうか?お手数ですが、よろしくお願いいたします。 <form action="thisscript.cgi" method="post"> <select size="2" name="func"> <option value="item">item</option> <option value="regist" selected>regist</option> </select> <input type="submit" value="選択したページを表\示"> </form> sub item{ print "<html><body>表示1</body></html>"; } sub regist{ print "<html><body>表示2</body></html>"; }
補足
あるCGIのdecodeを追加したところ、以下スクリプトで正常に動作しました。これで問題ありませんでしょうか? &decode; if ($mode eq "text") { &text; } elsif ($mode eq "del") { &del; } &enter; sub enter{ &header; print<<_HTML_; <form action="thisscript.cgi" method="post"> <select size="2" name="mode"> <option value="item">item</option> <option value="regist" selected>regist</option> </select> <input type="submit" value="選択したページを表\示"> </form> _HTML_ end_html; print "</body></html>\n"; } sub item{ } sub regist{ } sub decode{ if ($ENV{'REQUEST_METHOD'} eq "POST") { if ($ENV{'CONTENT_LENGTH'} > 51200) { &error("投稿量が大きすぎます"); } read(STDIN, $buf, $ENV{'CONTENT_LENGTH'}); } else { $buf = $ENV{'QUERY_STRING'}; } undef(%in); foreach (split(/&/, $buf)) { ($key, $val) = split(/=/); $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s/</</g; $val =~ s/>/>/g; $in{$key} .= "\0" if (defined($in{$key})); $in{$key} .= $val; } $mode = $in{'mode'}; }