• ベストアンサー

Use of uninitialized value ---

初心者です。フォームに文字を入力してもらい、↓ print blockquote( textfield( -name => 'die Antwort', 省略----条件にあえば、 my $value = param('die Antwort');#として if (($value eq $ans || $value eq $ans2) and ($c eq $num)){ 「正解」と表示することにしました。すると、うまくいくのですが、 if (($value eq $ans || $value eq $ans2) and ($c eq $num)){ について「Use of uninitialized value ----」とApacheのerror logに書かれてしまいます。このためerror logがすぐに巨大なファイルになってしまいます。これを避ける方法をお教えください。よろしく、お願いいたします。

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

  • ベストアンサー
  • t-okura
  • ベストアンサー率75% (253/335)
回答No.3

コードに use warnings が入っているのですよね。 デバッグも済んでいるのでしたら、 no warnings qw ( uninitialized ); で、この警告の表示を抑制してもよいと思います。

ttaa100kkaa
質問者

お礼

ありがとうございました。やってみます。

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

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

今回一番の問題は $value という変数ですよね? 参照前にいちいち defined で変数をチェックして回るのも面倒ですから、 サブルーチン param が undef の代わりに空文字列を返すようにするように変更するとか、 サブルーチンを変更できないのであれば、呼び出しの箇所で undef が返されたかどうかを確認し、 undef だったら適当に内容を書き換えるというやり方はどうでしょうか? こんな感じ。 #!/usr/bin/perl use strict; use warnings; use feature ':5.10'; sub foo { undef; } my $var = foo; #my $var = foo || 'dummy'; say $var; これを実行すると Use of uninitialized value $var in say at okw.pl line 15. のような警告が出されますが、下のコメントアウトされている行と入れ替えると dummy のようになります。

ttaa100kkaa
質問者

お礼

ありがとうございました。わたしには、むずかしいです。挑戦してみます。

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

回答になっているかわかりませんが、貼っときます。ペタ --- # 方法1 予め不正解となる値で初期化しておいて "処理" で更新する my $value = ''; # 処理 if ( ( $value eq $ans1 || $value eq $ans2 ) and ( $c eq $num ) ) { print '正解', "\n"; } else { print '不正解', "\n"; } # 方法2 definedで初期化されたか確認する my $value; # 処理 if ( ( defined $value ) and ( $value eq $ans1 || $value eq $ans2 ) and ( $c eq $num ) ) { print '正解', "\n"; } else { print '不正解', "\n"; }

ttaa100kkaa
質問者

お礼

ありがとうございました。じっくり考えてみます。

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

関連するQ&A

  • テキストファイルを読んで次のcgiファイルを動かすには?

    お願いします。初心者です。 0001.cgi で 正解 Einstein を Send すると  file.txt に -1 と書き込むようにしました。 さらに  0002.cgi へのリンクが出て、これをクリックすると 0002.cgi が動くようにしました。  そして、 file.txt に -1 が ない場合に 0002.cgi が動き始めないようにしようとしています。 0001.cgi の問題に正解しないと、0002.cgi へ行けない ようにしようとしています。どうしたらよいのでしょうか? どうか、お教えください。 よろしく、お願いいたします。 0001.cgi は、こんなふうになっています。 ↓ ---------------------------------------- print header; # -------------------------------------- print start_html('0001'); #ここに問題を入れました 答は Einstein です。 print startform( -method => 'POST', -action => '0001.cgi' ); print blockquote( textarea( -name => 'die Antwort', -rows => '3', -columns => '40' ) ); print br; print submit(-value => 'Send'); print reset; print endform; # -------------------------------------- if (param('die Antwort') eq 'Einstein'){ print h2('Einstein'); print h2('<a href="0002.cgi">next page</a>'); open(FILE, '>>file.txt') or die "$!"; print FILE ("-1"); close(FILE) } else{ print h3('false'); } # -------------------------------------- print end_html; # --------------------------------------

    • ベストアンサー
    • CGI
  • jspでこんなエラーが出ます

    <%@ page contentType="text/html;charset=Windows-31J" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <c:if test="${param.num le 50}"> クエリ情報numは50以下です </c:if> <c:if test="${param.num gt 50 and param.num le 100}"> クエリ情報numは50より大きく、かつ、100以下です </c:if> <c:if test="${param.num gt 100 and param.num le 500}"> クエリ情報numは100より大きく、かつ、500以下です </c:if> <c:if test="${param.num gt 500}"> クエリ情報numは500より大きいです </c:if> と入力してしるんですが type 例外レポート メッセージ 説明 The server encountered an internal error () that prevented it from fulfilling this request. 例外 org.apache.jasper.JasperException: 絶対URI: http://java.sun.com/jsp/jstl/core はweb.xmlとこのアプリケーションを配備したJARファイルのどちらかでも解決できません と言ったエラーが出てしまいます。なにか設定を間違えているのでしょうか?

    • ベストアンサー
    • Java
  • 初心者です。

    初心者です。 以下の質問(1),(2)を、よろしくお願いいたします。 perl で したことを php でしようとしています。 (1) Perl では フォームで、入力・送信された文字に応じて表示を変えるとき、 たとえば、 elsif (param('antwort') =~ /^Er/){ print ('Er まで OK 次 heisst<br>'); } とすると 入力:Erg 表示:Er まで OK, 次 heisst となりました。 これを php で実行しようとしています。 elseif($_POST['antwort'] == "Er"){ print ('Er まで OK, 次 heisst'); } としました。 入力:Er 表示:Er まで OK, 次 heisst となりますが 入力:Erg 表示:空白 でした。 入力:Erg 表示:Er まで OK, 次 heisst となるようにするには、 どうしたらよいでしょうか? よろしく、お願いいたします。 (2) perl で print startform( -method => 'POST', -action => "1001.cgi"); print blockquote(textfield(-name => 'antwort')); print submit(-value => 'Send'); print endform; と、すると フォームに文字を入力後 Send をクリックしても フォームに文字が表示されたままです。 しかし、php で <form method="post" action="1001.php" enctype="application/x-www-form-urlencoded"> <blockquote> <input type="textfield" name="antwort" /> </blockquote></form> と、すると、 フォームに文字を入力後 Send をクリックすると フォームに入力された文字が消えてしまいます。 php で フォームに文字を入力後 Send をクリックしても フォームに文字が表示されたまま、にするには、どうしたらよいでしょうか? お教えください。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • ランダムに1行読込み フォーム文字との同異を 判定するには?

    txt ファイル から ランダムに 1行読み込んで それが フォームの入力文字と同じかを 判定し、 同じならば、次のファイルへ飛ぶ には、 どうしたらよいのでしょうか? お教えください。 ------------------------------------------------------ mondai.txt に 問題を 1行に 1題ずつ kotae.txt に 解答を 1行に ひとつずつ 書きました。 mondai.txt の 1行目の 解答が kotae.txt の 1行目 (2行目-10行目、同じ)としました。 001.cgi で 正解すれば 002.cgi を開く 不正解なら もう一度 001.cgi を実行。 問題は ランダムに 表示する。 まず、mondai.txt と kotae.txt を それぞれ 10行にして やってみました。 ------------------------------------------------------ すると、問題は ランダムに表示されました。 しかし、 ##################################################### if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; ・・・ { ##################################################### が、うまくいきません。 ↓こうしてあります。どうしたら、よいでしょうか? ↓解答したことを file.txt に記録しよう、ともしています。 ↓ ################ はじめ ############################## #!/usr/bin/perl -T use strict; use warnings; use CGI qw(-debug :standard); my ($sec,$min,$hour,$day,$mon,$year,$wday,$yday,$isdst) = localtime(time); $year += 1900; $mon = sprintf("%02d", $mon + 1); $day = sprintf("%02d", $day); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); my $num = ('1267'); my $num2 = $num + 1; my $value = param('answer'); open(FILE, "../../mondai.txt"); my @data2 = <FILE>; close(FILE); open(FILE, "../../kotae.txt"); my @data3 = <FILE>; close(FILE); my $i = int(rand(10)); my $ans = $data3[$i]; if (param('answer') eq ("$ans")){ print "Location:$num2.cgi\n\n"; open(FILE, '<+file.txt') or die "$!"; my @DATA = <FILE>; close(FILE); open(FILE, '>file.txt') or die "$!"; print FILE ("$num,$ans,$year年$mon月$day日 $hour時$min分$sec秒\n"); print FILE (@DATA); close(FILE); } else { print header(-charset => 'Shift_JIS'); print start_html("$num.cgi"); print ('<font face="century">'); print $data2[$i]; #####---問題表示 print br; print startform( -method => 'POST', -action => "$num.cgi" ); print blockquote( textfield( -name => 'answer', -size => '70', -id => "next", -accesskey => '[' ) ); print <<END; <script type="text/javascript" language="JavaScript"> document.getElementById('next').focus(); </script> END print submit(-value => 'Send ( ↑Alt+[ )'); print endform; } ################ おわり ############################## よろしく、お願いいたします。

    • ベストアンサー
    • Perl
  • #VALUE!エラーが出てしまいます

    エクセルで下記計算表を作成したのですが #VALUE!が出てしまいます、どなたか解決策をご指導ください。 (A)今日の使用数 28個            使用数  B列    C列     D列 (B)  6個~(C) 10個 (D)5個 (B1)11個~(C1) 20個 (D1)5個 (B2)21個~(C2)30個 (D2)8個 (B3)  ~(C3)50個 (D3)#VALUE! 上記のように使用数を(A)に入力した場合 各行で使用数を出してみたいのですが (B3)の箇所は30と表示させたいのですが空白になってしまいます 結果(D3)で#VALUE!とエラーが出てしまします。 (B3)に30 (D3)が0と表示されるようにしたいのですが? 現在あてまめてる式は (B)=IF($B$7>5,"6","") (C)=IF(AND($B$7>=6,$B$7<=10),$B$7,10) (B1)=IF($B$7>11,"12","") (C1)=IF(AND($B$7>=11,$B$7<=20),$B$7,20) (B2)=IF($B$7>20,"21","") (C2)=IF(AND($B$7>=21,$B$7<=30),$B$7,30) (B3)=IF($B$7>30,"31","") (C3)=IF(AND($B$7>=31,$B$7<=50),$B$7,50) D列は=C-B+1 これでわかりますでしょうか?

  • 削除ボタンを押すとperlにてデータを削除するようにしたいんですができません。

    フォーム.html(一部) <form name="form1" method="post" action="admin.cgi"> <input type="hidden" name="mode" value="edit3"> <table width="740" border="0" cellspacing="0" cellpadding="0" align="center"> <tr> <td><b>クライアント(ロードサイド)</b> <input type="hidden" name="group" value="1"> <br> ※前のページへ戻る場合には、ブラウザの戻るボタンでお戻りください。</td> </tr> </table> <br> <table width="740" border="1" cellspacing="0" cellpadding="10" align="center" bordercolor="#333333"> <tr> <td bgcolor="#FFEEEE">このデータを削除する場合には、下の削除ボタンをクリックしてください。<br> ※この作業は取り消しができませんので、よく確認してから削除ボタンをクリックしてください。<br> <br> <input type="button" value="物件NO: _%data_num%_ を削除する" onClick="location.href='admin.cgi?mode=del&group=_%group%_&data_num=_%data_num%_'"> <br> この「物件NO: 」のボタンを押すとadmin.cgiに飛び データファイル内のデータを空にします。 ----------------admin.cgi---------------------------------- if($param{'mode'} eq 'del'){ ##===================================== ## 物件データをオープン = ##===================================== if($param{'group'} eq '1'){ $datafile = $datafile1;} elsif($param{'group'} eq '2'){ $datafile = $datafile2;} elsif($param{'group'} eq '3'){ $datafile = $datafile3;} if(!stdio::lock($lock)){ error('システムエラー','只今混み合っております.'); } # ロック if(!open(DATA,"+<$datafile")){ stdio::unlock($lock); &error('システムエラー',"ファイル ( $datafile ) をオープンできませんでした。"); } @data = <DATA>; foreach(@data){ @data2 = split(/,/); if($data2[0] eq $param{'data_num'}){ $_ = ''; last; } elsif($data2[0] eq $param{'data_num2'}){ $_ = ''; last; } } seek(DATA,0,0); print DATA @data; truncate(DATA,tell(DATA)); close(DATA); stdio::unlock($lock); ##===================================== ## テンプレートオープン = ##===================================== if(!open(HTML,$html_finish)){ &error('システムエラー',"ファイル ( $html_finish ) をオープンできません。"); } @html = <HTML>; close(HTML); ##===================================== ## HTML出力 = ##===================================== print <<"EOF"; Content-type: text/html @html EOF exit; } # モード del ここまで ----------------------------------------------------- この「data_num2」の削除には成功するんですが 「data_num」の場合はボタンを押しても何も起こりません。 恐らく「data_num」のif文に行っていないのだと思うんですが、 何が原因か分かりません。 情報が少ないかもしれませんが 解決の糸口をお願いします。 データはcsv形式のファイルです。

    • ベストアンサー
    • HTML
  • 次のcgiファイルを開くには?

    すみません。初心者です。 001.cgi というファイルで フォーム に 正解を入力して Enterキー を 押したら 次の 002.cgi を 開く(実行する)ようにするには どうしたらよいでしょうか? 今は↓このようにして 「次のファイルへ」をクリックしてもらっています。 Enterキーを押すだけで 次の002.cgi (=$num2.cgi)へ行きたいのです。よろしく、お願いいたします。 #-------- if (param('answer') eq $ans){ print ('正解'); print ("<a href=$num2.cgi accesskey=]>次のcgiファイルへ (Alt+])</a> "); #--------

    • ベストアンサー
    • Perl
  • #VALUE! エラーについて

    Excel97使用ですが入力文字数が多いため2つのセルに分割して記載し、(例えばA1とA2) =A1+A2 とした場合タイトルのエラーが表示されます、1つのセルに収まるものはエラー表示はありません、尚、f4 に数字を入力したら正常に計算されます、エラーが表示されないようにする方法を教えて下さい、 =if(f4=0,"",if(and(c15=0,d15=0,e15=0),(c6+d6+f6)/(c5+d5+e5+f5), if(and(c15<>0,d15=0,e15=0),(c22*c23+d6+e6+f6)/(c23+d5+e5+f5), if(and(・・・・・・・・・・・・・

  • ショッピングカートのカスタマイズ

    WEB寺小屋のショッピングカートで当サイトは、現在サポートしていないようで、商品登録する際のサブルーチン処理は 下記です。下記のソースで「id_num」が同じ場合、単純にエラーを返す場合は、どのように返したら分かりません。 わかるかた教えて下さい。ちなみに下記はオリジナルソースで3行目と6行目は同じ処理をしています。 どちらか、削除しても問題ないでしょうか? sub goods_regist { if ( $in{'id'} eq '' ) { &error ('エラー','IDが未選択です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'goods'} eq '' ) { &error ('エラー','商品名が未入力です'); } if ( $in{'tanka'} eq '' ) { &error ('エラー','商品単価が未入力です'); } if ( $in{'id_num'} eq '' ) { &error ('エラー','商品個別番号が未入力です'); } if ( $in{'ad_amount'} eq 'text' && $in{'ad_amount2'} eq '' ) { &error ('エラー','個数設定が不正です'); } if ( $in{'ad_amount'} eq 'list' && $in{'ad_amount3'} eq '' ) { &error ('エラー','個数設定が不正です'); } $goods_data = "$goods_dir/$in{'id'}.cgi"; open (DATA,"$goods_data") || &error('オープンエラー','商品データファイルが開けません。'); @LINES = <DATA>; close (DATA); $count = @LINES; if ( $count == 0 ) { $num = 1; } else { @lists = $LINES[-1]; $num = $lists[0]; $num = $num + 1; } #if ( $in{'id_num'} != $num ) { &error ('エラー','商品個別番号が間違っています'); } &lock2; open (OUT,">>$goods_data") || &error('オープンエラー','メール設定ファイルが開けません。'); print OUT "$num\t$date_now\t$in{'id'}\t$in{'id_num'}\t$in{'goods'}\t$in{'tanka'}\t"; print OUT "$in{'ad_amount'}\t$in{'ad_amount2'}\t$in{'ad_amount3'}\t$in{'rem'}\t\n"; close (OUT);

  • EXCEL VALUEを出さない方法を教えてください

    =if(**="","",**)の式を使っているA1とA2のセルを下記の例1のようにするとC3にVALUEのエラーが出てしまいます。 エラーが出ないようにする方法を教えていただけると助かります。 説明が足りないかもしれませんが、すぐ補足で付け足しますので よろしくお願いします。 (0にすればエラーは出なくなりますがそのほかの方法をお願いします) 例1)C3に =A1+A2