• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:○個表示して終了)

ログの上位表示がうまくいかない法則がわからない

このQ&Aのポイント
  • $maxを指定してログの上位表示をしようとしているが、うまく表示されない問題が発生している。
  • 一部の場合には全く表示されず、他の場合には指定した数よりも少ない件数しか表示されない。
  • どのような原因でこの問題が発生しているのか、解決方法はあるのかを知りたい。

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

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

表示のところが  if ($pt eq $ARGV[0]){    print "~  } と条件付きになっているところをみると、何かを検索しているようですね。 検索結果を表示する場合、検索条件に合うデータが見つかった時だけカウントするようにします。 つまり、  if ($pt eq $ARGV[0]){    $i++;       # ここでカウントアップする    print "~  } ということです。 でないと、全データ(検索対象外も含む)の上位$max件からしか検索しないことになってしまいます。

master-3rd
質問者

お礼

素早い返答ありがとうございます。 なぜうまくいかなかったかの理由も添えていただいたおかげで間違いをちゃんと理解することも出来ました。 解答ありがとうございました。

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

関連するQ&A

  • リストに何も無ければXXを表示…

    あるCGIのログの一部をSSIで表示させようとしています。リストの「pt」と「name」があったものだけを「$max」個表示すると言う物です。 一部抜き出すと… ----- print "Content-Type: text/plain\n\n"; open (FILE,"../../cgi-bin/navi-a/navi.log"); $i=0; while (<FILE>) { local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($pt eq $ARGV[0] && $name eq $ARGV[1]){ $i++; print "~ } if ($i >= $max) { last; } } ----- これに、「合う物が無かったら"無いですよ"文を表示」と言うのを付けたいのですが、うまく出来ません。 if ($pt eq $ARGV[0] && $name eq "") とかを試してみましたがうまく出来ませんでした。 何か良い方法が無いでしょうか? お願いします。

    • ベストアンサー
    • CGI
  • 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
  • 最大値を出力するプログラム(@ARGV)

    引数として1個以上の数字を受け取り,それらの中で一番大きな数字を出力するプログラムを作成したいのですが、数字は配列@ARGVに入っています。どのようなプログラムになるでしょうか? 例: jperl max.pl 20 1000 31 → 1000 自分が考えたのは 最初の数字を取り出して $max=shift(@ARGV); それが次の数字より小さいなら$maxにその次の数字を 代入していき、それを繰り返すのだと思うのですが if ($max<$ARGV[0]){ $max=$ARGV[0]; } その繰り返し方はwhileを使うと思うのですが どう使ってよいのかがわかりません。どうすればよいのでしょうか?

    • ベストアンサー
    • Perl
  • SSIでの"?"の使い方

    ある検索エンジンCGIのログを流用してトップページにSSIで表示しようとしています。 検索エンジンはいくつかのジャンルに分かれています。トップページに表示する分もジャンルで分けたいと思います。また、保存されているデータの最新10件を表示したいと考えています。 そのため以下のようにやってみました。 ページには □ジャンル1 <!--#exec cmd="./list.cgi?pt=0" --> □ジャンル2 <!--#exec cmd="./list.cgi?pt=1" --> ~~ CGIは ---------------------- #!/usr/bin/perl $w_new = 10; require './jcode.pl'; print "□ジャンル1<BR>\n"; #この行はテスト用ダミーです。 open (FILE,"./cgi-bin/navi/A.bak"); $i=0; while (<FILE>) { $i++; local($no,$pt,$sub,$hp,$name,$email,$pw,$msg,$dt,$ts,$rec,$axs) = split(/<>/); if ($pt eq $in{'pt'}){ print "<A href=\"$hp\">□$sub</A><BR>\n"; if ($i >= $w_new) { last; } } } close(FILE); exit; ------------------------ $ptがジャンル、$subが表示名、$hpがアドレスです。 こうすると何も表示しません。 また、 <!--#exec cmd="./list.cgi" --> というかんじで"?"を抜くとダミー用文「"□ジャンル1」が表示されます。(SSIが表示できないわけではないと言う確認) SSIのときは"?"は使用できないのでしょうか? また、スクリプトはこれであっているのでしょうか?(合ってないから表示しないわけで…(T.T))

    • ベストアンサー
    • CGI
  • ログファイルと受信データを比べたい。

    フォームを使用して送られてきたデータをlogを比べて同じものがあったら、同じものがあるということを表示したいのです。 前にも同じようなことをしてできたはずなのですが、なぜかできなくて…。 もうずーっとやっていて頭がボーッとしてきてしまいました。。。。 #フォームで受信したデータ read(STDIN,$buffer,$ENV{'content_length'}); $buffer =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; #ログファイルオープン open FILE,"naisen.log"; @FILES =<FILE>; close FILE; $i=0; $n=0; $gyou = @FILES; #文末の改行を削除 $buffer =~ s/\n$//; $FILES[$i] =~ s/\n$//; foreach(@FILES){ @log = split(/&/,$FILES[$i]); ($keys,$values) = split(/=/,$log[$_]); $FORMS{$keys} = $values; } for ($i=0; $i<=$gyou-1;$i++){ if ($buffer eq $FILES[$i]){ print "$i行目<BR>\n"; } else{ print "$i行目。これはありません。<BR>\n"; print "$FILES[$i]<BR>\n"; print "$buffer<BR>\n"; } } ログの1行目と同じものとときだけ、きちんとした結果がでます。 上記のほかにもいろいろやりましたができませんでした。

    • ベストアンサー
    • CGI
  • データ削除処理後に指定のhtmlファイルに飛ばす

    下記サイトで頂戴したファイルアップローダーについてご教示お願いします。 http://cgi-garage.parallel.jp/utility.html ※ファイルアップローダーVer 1 アップロードした画像の削除処理をした後に指定したhtmlファイルに飛ばしたいのですが どのようにに書き足すと上手くいくか悩んでいます。 削除処理を抜粋して記載しますので宜しくお願い致します。 sub delete{ my $inpass = $cgi->param('inpass'); if($pass ne $inpass){ &errorprint('Input Error!','パスワードが違いますので、削除できません。'); } my @delchk = $cgi->param('delchk'); my $newstr; my @logs = &setread2('log.cgi'); for my $i( @logs ){ my @i = split(/\t/,$i); my $hit = "0"; for my $p( @delchk ){ if($i[0] eq $p){ $hit++; unlink $i[2]; last; } } if($hit eq "0"){ $newstr .= $i . "\n"; } } $chstr = &setchange3($newstr,"log.cgi"); }

  • 同一のメールアドレスの禁止設定を追加したい

    同一のメールアドレスを禁止するのを掲示板に適用させたいのですが、男性のログと女性のログがあり、どう設定していいか分かりません。男女のログファイルは階下のフォルダに入ってて、 男性 $mensfile 女性 $ladysfile とメインのCGIで設定されていす。 チャレンジしてみたら、過去のログファイルが全て消えてしまい散々な目に会いました。下のどちらかでできそうな・・宜しくお願い致します。 (1)# 二重登録のチェックをします if(-e $data){ open(FILE, "< $data"); # この時点でファイルは必ず存在します while(<FILE>){ @v = split(/\t/); if(@v[0] eq $name){ print "<center><b>すでに$nameさんは登録されています</b><br>\n"; print "「戻る」を押して入力しなおしてください</center>\n"; exit(0); } } close(FILE); } (2)#----------2重登録チェック---------- &lock; if(!open(IN,"$mail01")) {print 'ファイルOPENができませんでした。',"\n"; exit;} @dataline = <IN>; close(IN); unlink $lockfile; foreach $DATA (@dataline) { chomp $DATA; if($DATA eq $MAIL){ print 'このメールアドレスは既に登録されています。',"\n"; exit; } 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • ログファイル表示で全部表示されたりされなかったり…

    ログファイルをオープン、その中のユーザー名・パスワードと入力されたユーザー名・パスワードを比較して、どちらも一致した場合のみ表示するようなものを作成しました。 ただ単に表示を行うと一致するものすべて表示されるのですが、テーブルなどを使用して表示させると数が減って表示されるのです。 これはいったいなぜでしょうか? ---------- for ($i=0;$i<$gyou;$i++){ @atai = split(/&/,$log[$i]); foreach $atais(@atai){ ($keys, $values) = split(/=/, $atais); $FORMS{$keys}=$values; }#foreach if($FORM{'USER'} eq $FORMS{'USER'}){ if($FORM{'PASSWORD'} eq $FORMS{'PASSWORD'}){ print "$FORMS{'TITLE'}<BR>\n"; print "<BR>\n"; だと全件(19件入力中、一致は18件。18件すべて)表示 一番下を print "<TABLE>\n"; print "<TR><TD>$FORMS{'TITLE'}</TD></TR>\n"; print "</TABLE><BR>\n"; print "<BR>\n"; と変更すると13件しか表示されません。

    • ベストアンサー
    • CGI
  • わかりません・・・。

    100個以下の整数を読み込んで、読み込んだ整数の一覧,それらのうちの最大値と二番目に大きい値とを表示するプログラムをつくりたいのですが、わかりません。 教えてください!! 実行例 整数は何個ですか:5 1 個目:65 2 個目:30 3 個目:98 4 個目:10 5 個目:54 入力された整数は 5 個で, 65 30 98 10 54 です. 最大値は 98 です. 二番目に大きい値は 65 です. ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #include<stdio.h> #define number 100 int main (void) { int i; int seisu[number]; int max; puts("整数を入力してください。"); for(i=0, i<number, i++){ printf("%2d番",i+1); scanf("%d",&seisu[i]); } max=seisu[0] for(i=1, i<number, i++){ if (seisu[i]>max) max=seisu[i]; } printf("最高点:%d\n",max); return(0); } までしかわかりません。 2番目に大きい値と‘整数は何個ですか: ‘と‘入力された整数は 個で です。‘の部分はどうすればいいのでしょうか??

  • 別データファイルを流し込むタイプのcgiで教えてください。

    http://oshiete1.goo.ne.jp/kotaeru.php3?q=1225153 でフローチャート式のフリーcgiをご紹介頂きました。 データも流し込んでうまく動くようになりました。 このファイルはdataファイルが別にあり $datfile = './heart_sm.dat'; のように定義してから呼び出すタイプです。 別ウィンドウで小窓として表示したいので スクリプトを書き無事動作確認できました。 問題1 結果文が長いので流し込んだテキストの大きさを 変えたいのですが、枠や周りの大きさは 変わるのですが、中の流し込んだテキストは 大きさがかわりません。大きさを変えるには どうすれば良いでしょうか? 問題2 結果文にリンクを張って親ウィンドウに 戻したいのですが、単純にdatfilesに ハイパーリンクを書き込んだだけでは 認識してくれません。 良い方法はありませんか? 長いのでデータを読み込むときを 抜粋して書き込みます。 よろしくお願いします。 #--------------------------------------------------------------- sub read_data{ #データファイルの読み込み open(FILE,"$datfile") or error("データファイルが開けません。"); @data = <FILE>; close(FILE); for(@data){ chomp; next if(/^#/); @data_line = split/<>/; $data_no =$data_line[0]; if($data_no eq $Now_no){$find = 1; last} } if($find){ @data_type = split(/:/,$data_line[1]); if($data_type[0] eq "a"){ $mess1 = $data_line[3]; $Yes_no=@data_type[1]; $No_no=@data_type[2]; out_put1(); } elsif ($data_type[0] eq "b") { $mess1 = $data_line[3]; $Next_no=@data_type[1]; out_put2(); }else{ log_write(); result_print(); } } }

    • ベストアンサー
    • CGI
このQ&Aのポイント
  • EW-M873TでCDラベルを印刷するには、EPSONのCDラベル印刷ソフトを利用することができます。
  • EPSONのCDラベル印刷ソフトは、EW-M873Tとの互換性があり、簡単にCDラベルを作成することができます。
  • EW-M873Tを使用してCDラベルを印刷する際には、EPSONのCDラベル印刷ソフトをダウンロードして利用することをおすすめします。
回答を見る