Perl:CGI.pm:入力ボックスのクリア?

このQ&Aのポイント
  • PerlでCGIフォームの入力ボックスをクリアする方法について教えてください。
  • PerlのCGI.pmを使用して、フォームの入力ボックスをクリアする方法を知りたいです。
  • CGI.pmのperldocのサンプルコードを改造していますが、フォームの入力ボックスをクリアすることができません。どのようにすればクリアできるのでしょうか?
回答を見る
  • ベストアンサー

Perl:CGI.pm:入力ボックスのクリア?

お世話になります。 下のサンプルコードは、CGI.pmのperldocに載っていたサンプルを改造したものです。 #! /usr/bin/perl # # simple.cgi -- CGIフォームの実験 use CGI qw/:standard/; use CGI::Carp qw/fatalsToBrowser warningsToBrowser/; print header( -expires=>'-1d', -pragma => 'no-cache', 'Cache-Control' => 'no-cache'), start_html('Simple Script'), h1('Simple Script'), start_form, "What's your name? ",textfield(-name=>'name', -default=>""),p, submit, end_form, hr,"\n"; if (param) { print "Your name is ",em(param('name')),p, } print end_html; 改造点はheader関数にexpires、pragma、Cache-Controlを入れてみたこと、 textfieldに-default=>""を入れてみたこと、 UIと表示項目を1つに減らしたことです。 やりたいのは、上のテキストボックスに名前を入れて、submitを押した瞬間に、上のtextboxをクリアすることです。 ぼくの理解では、最初に上記のCGIがあるURLにアクセスしたときにはプログラムは全部走ってしまう、paramがゼロだからそのときは入力表示を出すだけ、 実行を押した後もう一度このプログラムは最初から走る、paramに値があるから出力が表示される、というものです。 となれば、2度目に(入力を得て)実行されるときは、headerのcache関係の項目や、textfieldのdefaultが効いて空白になりそうな気がしますが、現実には最初に入った値がそのまま動き続けます。 これをPerl側で空白になるように制御できるでしょうか。 サーバーはFreeBSD(レンタル)、Perlは5.12、WebサーバーはApacheです。 クライアントはWindows7でIE9、Firefox22、Chrome28を使っています。 よろしくお願いします。

  • Perl
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • kumoz
  • ベストアンサー率64% (120/185)
回答No.2

CGI.pm の v2.15 以降であれば、-override に真を設定すれば常に -default の値が表示されるようになると思います。 textfield(-name=>'name', -default=>"" -override => 1),

TYWalker
質問者

お礼

ありがとうございます!!! これでバッチリでした。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

$name = param('name') ; 等と先に値を取り出しておいて -value=>"" を指定するのは? もしかしたら、先に取り出す必要が無いかも。

TYWalker
質問者

お礼

ありがとうございます! #! /usr/bin/perl # # simple.cgi -- CGIフォームの実験 use CGI qw/:standard/; use CGI::Carp qw/fatalsToBrowser warningsToBrowser/; $name = param('name'); print header( -expires=>'-1d', -pragma => 'no-cache', 'Cache-Control' => 'no-cache'), start_html('Simple Script'), h1('Simple Script'), start_form, "What's your name? ",textfield(-name=>'name', -value=>""),p, submit, end_form, hr,"\n"; if (param) { print "Your name is ",em($name),p, } print end_html; ということですね。 これはなぜかダメでした。 改造後も、表示後のHTMLソースを見ると What's your name? <input type="text" name="name" value="さっき入力した値" /><p /><input type="submit" name=".submit" /></form><hr /> Your name is <em>さっき入力した値</em><p /> のようになりました。 不思議ですね~

関連するQ&A

  • CGI.pmのtextfieldのデフォルト文字列が文字化けしてしまいます。。

    CGI.pmのtextfieldの設定したデフォルト文字列が文字化けしてしまいます。。 以下のコードはちゃんと表示されるのですが。 print checkbox('only_exist', 'checked', 1, '削除済動画除外'); → <label><input type="checkbox" name="only_exist" value="1" />削除済動画除外</label> textfieldを使った以下のコードはちゃんと表示されません。。 print textfield('keyword', '削除済動画除外', 20); → <input type="text" name="keyword" value="&atilde;&sup2;&atilde;&atilde;‚‰&atilde;—" size="20" /> どっちもうまく表示されないのならわかるのですが、片方だけなので全く原因が分かりません。。 コードはUTF-8にて記述。(Non BOM) コード冒頭は #!/usr/bin/perl require 5.8.0; use utf8; use strict; use warnings; use Encode qw(decode encode); use CGI qw(:form param -nosticky -no_undef_params); use Data::Dumper; use POSIX 'strftime'; use LWP::UserAgent; use HTTP::Request; use open OUT => ":encoding(utf8)"; use open ":std"; use HTML::Entities 'encode_entities'; となっております。 アドバイスいただけると嬉しいです _ _

  • cgi.pmを使ったcgiに変更したのですが・・

    http://okwave.jp/qa/q7449935.html すみません、間違えて解決を押してしまいました・・・解決していないです。 前回返信いただいた内容を参考に、cgi.pmを使ってみることにしたのですが、 上手くいきません。 ボタンが表示されなくなってしまいました。 perlのcgiは作り方が色々あって選択が大変です・・・・・ #!/usr/bin/perl # wT付けるとエラー # 2012/05/01 cgi.pm使用開始 require 'cgi-lib.pl';# cgi-lib.plを呼び出す require "jcode.pl";# jcode.plライブラリを組み込む ########################################################################### use strict; use CGI; my $q = new CGI; print $q->header(-charset=>"Shift_JIS"); print $q->start_html(-title=>"てすと", -BGCOLOR=>'#ffffff'), $q->li, # 空白? $q->center($q->h1('CGI.PM')), # 文字を大きく書く $q->br, $q->br, $q->li('<FONT color="brack">テスト?</FONT><BR>'), $q->li('<form action = \"***.cgi\" method=\"post\">');# ***.cgiにpostで送信 $q->li('<BUTTON type="submit"> テストボタン </BUTTON>'), $q->li('</form>'), $q->br, $q->strong("強調文字"), $q->br, $q->end_html; $q->hr, # 線を引く print "以下のパラメータを受け取りました。<BR>"; my ( $name, $value ); foreach $name ($q->param ) { print "$name:\n"; foreach $value ( $q->param( $name ) ) { print " $value\n"; } } exit;

    • ベストアンサー
    • CGI
  • 次のcgiファイルを開くには? もう一度

    http://oshiete1.goo.ne.jp/qa3951263.html で質問している者です。 間違って、[回答への補足] に書いてしまいました。 もう一度質問させてください。すみません。 Location を 教えていただき、とても感謝しております。 でも、私の 001.cgi は 以下のように始まっております。 print header(-charset => 'Shift_JIS'); print start_html("001.cgi"); このprint header(-charset => 'Shift_JIS');を消して if (param('answer') eq $ans){ print ('Location:002.cgi\n\n'); } else{ print header(-charset => 'Shift_JIS'); ##省略## print endform; { としたのですが、だめでした。 if (param('answer') eq $ans) が 下の方にもう一度出てくるからでしょうか? ###### はじめ ##################### #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); print "Location:1266.cgi\n\n"; ###### おわり ##################### としたら、001.cgi を開くと 002.cgi へ飛ぶことができました。 どこに print "Location:1266.cgi\n\n"; を書けばよいのでしょうか? よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • Perl の use strict に付いて

    ●HTML <html><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>テスト5(UTF-8)</title> </head> <body> <form action="test5.cgi" method="post" > <input type="text" name="f1" value="" size="80"> <button type="submit" >送信</button> </form> </body></html> —————————————————————————————————————— ●Perl #!/usr/bin/perl #use strict; ※問題の行1 use warnings; use CGI; print "Content-type: text/html\n\n"; print "<meta charset=\"UTF-8\">\n"; # POST / GET パラメータを取得------------------------- my $q = new CGI; # パラメータ名を指定して取得する my $param1 = $q->param('name1'); my $param2 = $q->param('name2'); # FORM値の取得----------------------------------- # 全てのパラメータを取得する for my $param_name ($q->param) { print $param_name . ' = ' . $q->param($param_name) ; print "<br>\n"; ${$param_name} = $q->param($param_name); ※問題の行2 } #------------------------------------------------- print "テスト<hr>\n"; print "$f1<br>\n"; exit; —————————————————————————————————————— 【質問】 「※問題の行1」+「※問題の行2」 = エラー 「※問題の行1」のみ = 正常に動きます 「※問題の行2」のみ = 正常に動きます 「※問題の行1」の「use strict; 」と 「※問題の行2」の「${$param_name} = $q->param($param_name); 」 をどう書き換えれば、二つとも記述したまま正常に動くのでしょうか? よろしくお願いします。

    • ベストアンサー
    • Perl
  • ファイルをアップロードするCGI

    ファイルをアップロードしたいCGIが欲しく サンプルをみつけたのですが、このCGIだと ファイルをアップロードしたときに、ファイル名がアップロードした時刻になってしまいます。 ファイル名を変更することなく、アップロードするにはどう変更すればよいのでしょうか? お願いします。ちなみにアップロードしたいファイルの種類はエクセル形式のファイルです。 プログラムは以下のようになってます。 #!/usr/bin/env perl use strict; use CGI; use CGI::Carp qw(fatalsToBrowser); use POSIX qw(strftime); my $q = new CGI; print $q->header(), $q->start_html(); #print $q->dump; # for debug my $outputdir = "log"; # ファイルを置く先 (ディレクトリ) my $fh = $q->param('uploaded_file'); my ($ex) = ($fh =~ m|(\.[^./\\]+)$|); # 拡張子 if ($fh ne "") { my $timestamp = strftime "%y%m%d%H%M%S", localtime; my $outputfn = "$outputdir/$timestamp$ex"; open(F, "> $outputfn") or die; flock(F, 2); if (defined $fh) { while (<$fh>) { print F $_; } } close F; print qq{saved as <a href="$outputfn">$outputfn</a>}; } print $q->start_multipart_form(-name => 'myform'), $q->filefield(-name => 'uploaded_file'), $q->submit("OK"), $q->endform, $q->end_html(), "\n";

  • [Perl] CGI_Lite.pmでファイル名取得できない

    CGI_Lite.pmを使用してファイルをアップロードするCGIを書いていますが、ファイル名によっては、名前の途中までが消えてしまいます。 cgiとhtmlは、以下のとおりです。EUC、Shif-JISの両方で、また、LinuxとWindowsXPの両方で試してみました。 例 「可能性.txt」というファイルをアップすると、 「性.txt」というファイル名になります。 環境: CGI_Lite.pmは、2つのバージョンを試してみました。 (1), CGI_Lite 2.02 http://search.cpan.org/~smylers/CGI-Lite-2.02/Lite.pm (2), CGI_Lite 1.8 http://search.cpan.org/dist/CGI_Lite/ OSなど (1), WindowsXP + AnHTTPd + Perl5.8.8 (2), SuSE Linux + Apache2.0 + Perl5.8.3 ■アップするHTML <html> <form action='test.cgi' ENCTYPE='multipart/form-data' method='post'> <input type="file" name="file1"> <input type="submit"> </form> </html> ■アップされるCGI(test.cgi) #!/usr/bin/perl use CGI::Lite; my $cgi=new CGI::Lite; $cgi->add_timestamp(0); $cgi->set_directory('./') or die $!; $cgi->set_platform ('Unix'); $cgi->set_buffer_size (10000); my %in = $cgi->parse_form_data(); print"Content-type: text/html\n\n"; print"-->$in{'file1'}\n"; 以上、よろしくお願いします。

    • 締切済み
    • CGI
  • utf8使用時のフォーム入力文字コード

    use utf8; binmode(STDIN,":encoding(shiftjis)"); をすると、入力時に内部変換がかかり、UTF-8として扱える という認識で使っていたのですが、下記のコードを実行してみると 入力した文字は普通に sjisで表示されます。 binmode(STDIN~ はどのような意味を持つのでしょうか。 http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html http://www.hikoboshi.org/perl/doc/encode.html 他、いろいろなサイトで調べてみたのですが、いまひとつ 納得する回答を得ることができません。 //////////////////////////////////////////////////// use utf8; use open 'encoding(utf8)'; binmode(STDIN,":encoding(shiftjis)"); use CGI; print "content-type:text/html; charset=Shift_JIS \n\n"; print <<"EOM"; <form action="xxx.cgi"> <input type="text" name="hoe"> <input type="submit"> </form> ここは UTF-8文字列なので化ける<br> EOM $cgi = CGI->new; print $cgi->param('hoe'); //////////////////////////////////////////////////// 現在は下記のコードで自前で UTF-8に変換しています //////////////////////////////////////////////////// foreach( $cgi->param() ){ my $str = $cgi->param($_); $str = Encode::encode('utf-8', Encode::decode('shiftjis', $str)); $cgi->param( -name=>$_, -value=>$str ); }

    • ベストアンサー
    • Perl
  • perlがうごきません

    htmlファイルには <html> <form action="form2.cgi" method="get"> 食品名1<input type="text"name="form1"> <br> 食品名2<input type="text"name="form2"> <input type="submit"value="送信"> </form> </html> cgiファイルには #! /usr/bin/perl require "cgi-lib.pl"; &ReadParse(); print "Content-type:text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>フォーム</title>\n"; print "</head>\n"; print "<body>\n"; print "おいしい$in{'form1'}\n"; print "まずい$in{'form2'}\n"; print "</body>\n"; print "</html>\n"; exit; cgi-lib.plはサーバーにいれております。 どうしてうごかないのでしょうか。 perlの場所も正確です。

    • ベストアンサー
    • Perl
  • Perlで作成したCGIについて

    Perlで作成したCGIについて Perlで作成したCGIについて質問させていただきます。 #################### ##(1)system.cgi ## #################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); print "Content-type:text/html;charset=utf8\n\n"; system('C:\\test.txt'); ##################################################### C直下にあるtest.txtの中身は「abcd」など 簡単なものです。 ##################################################### ################### ##(2)win32.cgi ## ################### #!c:/Perl/bin/perl.exe use strict; use warnings; use CGI; use CGI::Carp('fatalsToBrowser'); use CGI qw(:standard); use Win32::API; print "Content-type:text/html;charset=utf8\n\n"; my $MessageBox = Win::API -> new("user32","MessageBoxA","NPPN","N"); $MessageBox -> Call(0,"HelloWorld","Message",0); ##################################################### ##################################################### 以下にスペックを書きます。 Microsoft Windows XP Professional version2002 Service Pack2 Genuine Intel(R)CPU L2300 @1.50GHz 1.50GHz,1.49GB RAM ・ActivePerl ver5.10.1 built for MSWin32-x86-multi-thread ・Apache Apache 2.2.14(Win32) ##################################################### 上記の(1)、(2)のプログラムをエクスプローラ上(ローカル)で実行させて(1)ではテキストファイルを、 (2)ではメッセージボックスを表示させたいです。 結果は時間がかかるだけでTimeOutの設定である5分で切れてしまい何も起こりません。 しかし、全く同じプログラムで拡張子を.plに変更してコマンドプロンプトで実行すると、 期待通り(1)はテキストファイルが開かれ、(2)ではメッセージボックスが出てきます。 (1)、(2)ともCGIではsystemおよびMessageBoxの部分をコメントアウトして print文などを書けば普通にエクスプローラに表示されます。 (かなりhtmlとしては不備があると思いますが・・・) どうすればCGIで(1)、(2)のプログラムが期待通りの動きをするのか どうぞご教授のほどよろしくお願いいたします。 何か足りない情報や意味の分かりづらい個所がありましたら、仰ってください。 ちなみにこのプログラムは公開するために作成しているのではありません。 下手な説明、長文すみません。

  • PerlのCGIでフォームのテキスト配列をPerlで取得するには?

    フォームで通常は同じ名前のデータを取得することは無いのですが 表計算のように同じ名前の場合、データの取り出し方がわかりません。 以下、通常の1件の場合のソースです。 #!/usr/bin/perl $| = 1; use strict; our %in; use CGI::Carp qw(fatalsToBrowser); use CGI qw(:standard); require 'jcode.pl'; require 'cgi-lib.pl'; # #-----分岐----- &ReadParse; # 配列でない場合 my $namae = $in{'namae'} print "$namaeで名前が1件表示される"; # これをフォームで namaeが配列になった場合、 #<input type="text" name ="namae"> #<input type="text" name ="namae"> #<input type="text" name ="namae"> # のような場合、3件取得する場合 exit; __END__

    • ベストアンサー
    • CGI