• 締切済み

cgiのif文で行を指定。

ログファイルから任意の行を取り出すために、フォームで行を指定(入力)後、送信ボタンを押すと 表示させるようにしました。 if文はこんな感じです。 if ($NO == ''){ print &all; } else{ print &no; } 1より大きい時と、何も入力しないときはきちんと希望したものが表示されるのですが、 問題は0を入れたとき(ログファイルの1行目を出したい時)に、何も入力されてないと 認識されてしまうのです。 どうしたらよいでしょうか? ※$NOの後の==をeqに変えると何も入っていなくても0と認識されてしまいます。

  • CGI
  • 回答数4
  • ありがとう数1

みんなの回答

回答No.4

&noのサブルーチンがどうなっているのか分かりませんので、普通に全部書き出す時と1行書き出す時の スクリプトを書いておきます。 ##ログファイルを開く open(IN,"開くファイル名") @lines = <IN>; close(IN); ##ナンバーが記入されてなければ全部(下の例は1行ごとに改行)、されていれば その行だけを書き出し if($NO eq ""){ foreach $line (@lines){ print $line."<BR>"; } }else{ print $lines[$NO]; }

回答No.3

ぐはっ おおぼけをかましていまいました。全面的に訂正します。 実は、FORMで入力した値を parseする部分を間違えてました。 if ($NO eq '') { で正常に動作しているようですよ。 (補足依頼) FORMで入力した値の取得はどうやってます? Sub no($NO) はどうなってます?

回答No.2

ちょっと姑息だけど、簡単な手段。 if ($NO eq '') {   $NO = -1; } if ($NO < 0){   print &all; } else {   print &no; } でも、普通は 0 や「リターン」が入力された時は特別な処理というのが一般的なプログラミングじゃないですかね。 この例でいえば全てが対象とか、処理終了とか。 「リターン」のみはケースバイケースではねることも。

  • leaz024
  • ベストアンサー率75% (398/526)
回答No.1

== は数値比較用の演算子なので、比較対照が文字列の場合は数値化して比較します。(数値への変換方法は、Cの atof と同じです。) したがって '' は数値の 0 と認識されるので、$NO が 0 の時は「等しい」と判断されるのです。 で、普通は $NO eq '' として、“何も入っていない場合は” という条件にするのですが、 > ※$NOの後の==をeqに変えると何も入っていなくても0と認識されてしまいます。 ということは、何も入っていないはずの $NO に、何らかの値が入っていることが考えられます。 実際、   $NO = '';   if ($NO eq '') { print "Empty\n" } というスクリプトでは Empty と表示されますから、if文の直前で次のようにして $NO の値を確認してみる必要があります。   printf "\$NO="$NO", length=%d\n", length($NO);

関連するQ&A

  • if文中で@***(配列変数)って・・・。

    if文中で配列変数って使用できるのでしょうか? やりたいことは、 フォームを使って入力されたデータと、ログファイルの中身を1行ずつ比べて、 同じものがあったら、そこで比較を終了させる、というようなことをやりたいのです。 たとえでこんな感じでif文つくりました。(これもあってるかどうか微妙なのですが。) for($i=0; $i<5){ @FILELOG2 = split(/&/,$FILELOG[$i]); if (@FILELOG2 eq @log){ print "ok\n"; }else{ print "ng\n"; } exit; } フォームを使って入力されたデータは、 read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; @log =split(/&/,$buffer); のような感じで処理してあります。 ログファイルは #ログファイルをオープン。 open FILE,"<02.log"; flock(FILE,2); @FILELOG=<FILE>; flock(FILE,8); close FILE; のようにしてあります。 おわかりの方、よろしくお願いします。

    • ベストアンサー
    • CGI
  • if文について

    if文を利用してリストの表示をしようとしています。 ドロップダウンリストは <SELECT name="type"> <OPTION value="all">指定しない </OPTION> <OPTION value="1">タイプA系列</OPTION> <OPTION value="2">タイプB系列</OPTION> となっています。 データはチェックボックスで1か空白で保存されていて、A系列は「s_1」「s_2」、B系列は「s_3」「s_4」「s_5」にチェックが入っているかどうかを振り分けしたいんです。 なので、ドロップダウンリストで「タイプA系列」を選択したら「s_1」「s_2」に1が入っている物のみ表示するというものです。 現在のところこの形です。 if ($FORM{'type'} ne 'all') { if ($FORM{'type'} eq '1'){ if ($s_7 || $s_8 eq 1) { ; } else { next; } }else{ if ($s_9 || $s_10 || $s_11 eq 1) { ; } else { next; } } } このようにやってみましたが全部表示されてしまいます。 どのように直したらOKでしょうか? お願いします。

    • ベストアンサー
    • Perl
  • if 文  わかんない・・・

    都道府県セレクトoptionフォームにて 都道府県を選択しない場合のエラーを なんとか2行で出せるようになったのですが 選択して下さい = value="0" if ($in{'pre'} eq '0') { &error("都道府県の選択!!"); } if ($in{'pre'} eq "") { &error("都道府県の選択!!"); } これを1行にするにはどうしたらいいのでしょう? ↓↓はダメでした(≧m≦) if ($in{'pre'} eq "" || '0') { &error("都道府県を選択!!"); }

    • ベストアンサー
    • Perl
  • CGIでの表示の不具合について。

    座席表を作成しようと思い以下のようにしました。 最初の画面で行と列の数を入力。    ↓ その分でテーブルを作成し、入力画面を出す。    ↓ 名前と一緒に数字も入れ、机の向き(1:横向き、2:縦向き)も入力する。    ↓ 完成。 ある程度はうまくいくのですが、なぜか一定のものだけ表示がおかしくなります。 ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┃ ┃    ┃      ┃  ┃ ┗━━━┻━━━━┻━┛ とならなければならないところが ┏━━━┳━━━━┳━┓ ┃    ┃      ┃  ┃ ┣━━━╋━━━━┫  ┣━━┓ ┃    ┃      ┃  ┃   ┃ ┗━━━┻━━━━┻━┻━━┛ となることがあります。 この右端のものは全然関係ない行のログからひっぱられてきます。 でも出るものと出ないものがあります。 表示のコードは $gyou = @FILES; for($i=0;$i<$gyou;$i++){ @log = split(/&/,$FILES[$i]); foreach(@log){ ($key,$value)=split(/=/,$_); $FORM{$key} = $value; } if ($searchkey eq $FORM{'BUSYO'}){ last; } }#for終わり でログファイルを開いて分解し、 for($n=0;$n<$TATE;$n++){ print "<TR>\n"; for($r=0;$r<$YOKO;$r++){ if ($FORM{"NO$n$r"} eq '1'){ print "<TD COLSPAN=2 CLASS=TD WIDTH=100 HEIGHT=50 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } elsif ($FORM{"NO$n$r"} eq '2'){ print "<TD ROWSPAN=2 CLASS=TD WIDTH=50 HEIGHT=100 ALIGN=CENTER>$FORM{\"NAME$n$r\"}</TD>\n"; } } #列の終了 print "</TR>\n"; } #行のfor終了 のように表示させています。

    • ベストアンサー
    • CGI
  • IFのネストについて(PERL/CGI)

    データファイルからHTMLへの吐き出しについての質問です。 CSVデータ用ファイルに 「1,0」(データNO,表示フラグ) 「2,1」 「3,1」 と並んでいて、そこから  (1)表示フラグが1のときのみ、HTMLの表の中にサブウィンドウが開くボタンを表示させたい  (2)表示フラグが0の時は何も表示させない というところまで出来ているものに  (3)データNOごとにサブウィンドウのサイズを変えたい ということを考えているのですが 現在(3)の盛り込み方が分からず、全て同サイズのサブウィンドウを表示させるだけになってしまっています。 そもそもPERLを全然分かっていないような状況で、前の製作者のソースを触っているので 単純なIF文でいけるのかと思い、  if($DATA[1] == 1){   print <<END;    【<a href="JavaScript:openwin(ボタン)</a>】   END  }else{   print<<END;   <br>   END  } というのを  if($DATA[1] == 1){   if($DATA[0] == 1 ){    print <<END;     【<a href="JavaScript:open_big(ボタン)</a>】→大きいサブウィンドウ    END   }elsif($DATA[0] == 3 ){    print <<END;     【<a href="JavaScript:open_little(ボタン)</a>】→小さいサブウィンドウ    END   }  }else{   print<<END;    <br>   END  } のように変えてみたら、エラーになりました。 たぶん、参考書でも初歩中の初歩みたいな質問かと思いますが、さっぱり分からないんです。。 回答例か、このレベルの質問でも答えてくれているサイトを教えてください。 よろしくおねがいします。

    • ベストアンサー
    • CGI
  • CGIで何%の指示の仕方

    CGI勉強中です。 表の中に文章を表示させるのですが、表の幅が狭い場合、自動改行によりとデザインが崩れてしまうのを防ぐためif文で分岐させています。 ----------------- if ($all_width(表の全幅) >= "xxx") {1行で表示} else{2行<br>で表示} -------------------- といった感じです。 でも、この場合、$all_width を%で指示した場合、もちろん100以下なので2行表示してしまいます。 で、もうちょっとカスタマイズして、 ----------------- if ($all_widthに%が使われていたら) {   if ($%使用時の行指定==1){1行で表示} else{2行<br>で表示}   } else{ if ($all_width >= "xxx") {1行で表示} else{2行<br>で表示} } ----------------- こうしたいのですが…文法的におかしくは無いですよね。 で、この「$all_widthに%が使われていたら」という表現方法がわかりません。 何か良い方法は無いでしょうか?よろしくお願いします。

    • ベストアンサー
    • CGI
  • IF文でページ振り分けがうまく出来てない。

    CGI勉強中です。 ある掲示板CGIを改造して会員のみに使用可にしようと考えています。パスワード自体は無事組み込むことが出来たのですが、1つ問題が出ました。 掲示板なので、過去ログがありますよね。その過去ログページを表示しようとするとまた認証ページに戻ってしまい、パスワードを再度入力→最新10件のページに戻ってしまいます。どうにかして、1度入ったらパスワードを入力しなくてもいいようにしたいのですが… 今のところこうなってます。 /////////////// if ($pass_mode == '1'){ ←もしパスを使用するだったら if ($F{'mode'} eq '') { &pass_mode} ←モード無しの場合、パス入力画面に移動 if ($F{'mode'} eq 'admin') { &admin} ←モードアドミニならsub adminへ } else{ if ($F{'mode'} eq '') { &main_form} ←メイン書き込みページへ else { &{$F{'mode'}} } } /////// となっています。 また、過去ページへの移動は「**.cgi?pg=10&sort=」という感じです。 この状態で、ページ移動時にパス入力ページに移動しないようにするにはどうしたらいいでしょうか?cookieを使う必要があったりしますか? 抜けてる情報・足りない情報があったら指摘してください。すぐ補足します。言語はperlで書いています。 よろしくお願いします。

    • ベストアンサー
    • CGI
  • ハッシュとif文

    CGIを改造しようと何とかがんばってます。 ハッシュから確答するものを表示したいのですが、うまく出来ません。 まずは、別ファイルにリストを保存しています。 %jlist = ( 11 => '項目1', 12 => '項目2', 13 => '項目3', 14 => '項目4', ~~ ); そして、ログファイルには数字が保存されています。 $genre←11から99までの数字が保存 これをwhileで繰り返し表示するリストにちゃんと項目名を表示させたいのですが、うまく出来ません。 foreach $key (keys(%jlist)){  if($key eq $genre){  print "[$value]\n";  } } とてつもなく変なことをしているかもしれませんが、どのようにしたら解決できるか教えてください。

    • ベストアンサー
    • Perl
  • if文を簡単に

    CGIを改造中です。 オプションメニューを設置しました。 ただ、検索などに利用したかったので、名前と値を別のものにしています。(犬=1,猫=2のように) データ入力画面の方はリストを入力したのですが、名前が50を超えるのでリスト表示画面や検索結果表示画面でif文を大量に書くのは面倒です。 (if($name eq1){print "犬\n";elsif~) どうにかしてこれを簡潔にすることは出来ないものでしょうか?

  • if文の使い方

    自分では解決できない為、質問させていただきます。 Webサイトの任意の場所に下のスクリプトを埋め込み、 ./testディレクトリに7日以内に更新ファイルがあり、かつファイル名にrrrという文字列がなければWEBサイトの埋め込んだ場所にABCDEFGHIJKと表示させることを考えています。 よって7日以内に更新があってもファイル名にrrrが含まれる場合や、 7日以内に更新がない場合はwebサイトにABCDEFGHIJKと表示させたくありません。 自分で書いてみた下記スクリプトではいつでもABCDEFGHIJKと表示されてしまいます。 ※下記9行目の$latestfilenameをechoするとちゃんと最終更新ファイル名を表示してくれます。(ここまでは上手くいっています) <? $dir = opendir("./test"); $latestfile=0; while (($fnm = readdir($dir)) !== false) { if($fnm == "." || $fnm == "..") continue; $ftime = filemtime("./test/$fnm"); if($latestfile < $ftime){ $latestfile = $ftime; $latestfilename = $fnm; } } if($fnm == "." || $fnm == "..") continue; if(preg_match("/rrr/",$latestfilename)){ printf(""); break; } else if($nowdate - $fftime < 604800) { printf("ABCDEFGHIJK"); } else if($nowdate - $fftime > 604800) { printf(""); } closedir($dir); ?> 何がおかしいのかご教授ください。

    • ベストアンサー
    • PHP

専門家に質問してみよう