- ベストアンサー
ログファイルの検索
たとえばログファイルに NO=1&TITLE=aa&MESSAGE=テスト1です<BR><BR><BR>ためし!!= NO=2&TITLE=aa&MESSAGE=テストの3です。<BR>TEST= というように入っていたとします。 HTMLファイルでもcgiファイルでもいいのですが、たとえば「1」と入力したら NO=1が検索されて表示されるようなものを作成するにはどのようにしたらいいのでしょうか? よろしくお願いします。 #perlです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
例えば NO=1& TITLE=aa&MESSAGE=テスト1です<BR><BR><BR>ためし!!= というようにデータ形式を1.件名、2.データのように一行毎に記録しておく。そうすると連想配列として拾っていったり、普通の配列型で拾っていっても基数行-偶数行でデータ処理ができます。検索にはindex関数を使います。 一行に一データにするならば、データに埋もれないように少し大きめの件名にしておき、index関数で検索します。 これだけですとコードのどの部分が分からないのか不明ですので、もう少し知りたいところを絞って書いた方が良いですね。
その他の回答 (1)
- ShaneOMac
- ベストアンサー率39% (356/898)
関数について説明したページはたくさんあるので検索してみてください。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k05.htm http://www.kent-web.com/perl/chap9.html http://www5a.biglobe.ne.jp/~n_rieko/perl/right.htm ログの検索方法についてはここにも説明があります。 http://www7.big.or.jp/~jawa/perl/search.html $position = index $kensakuchi, @log_data; これでは検索対象が配列変数になっています。スカラー変数じゃないとダメですよ。index関数の用途が全く違う方向に行っています。 @log_data[$i] 例えばfor文で$iを増やしながら、対象をこのように配列要素としてスカラー変数にして検索しましょう。見つからなかったら返値は-1ですから、同じループの中にif文を付けておいて、-1が返らなかった場合(頭に見つかれば0が返るのであるいはそれ)を条件として、見つかった位置でループを抜けます。その位置の$iが探しているデータの場所です。 連想配列を使わないにしても、件名行-データ行で交互に構成しておくと検索しやすいですし、データの中に件名が混ざるような場合も問題になりません。 --------------- indexは扱いやすい検索関数ですが、一つ問題があります。indexでは検索文字列が対象の中に含まれていればその位置を返すようになっています。検索文字列より長い文字列中からそれを見つけるためのものですから、対象と完全一致するか比べる関数ではありません。 abc123 を対象として、abcで検索すれば0が返りますし、123で検索すれば3が返ります。いずれにしても見つかったという報告になります。bで検索したり2で検索しても含まれている限り見つかったことになります。 1,2,3,10,12 という配列で1を検索したら1と10と12のところで見つかることになります。ですからこれを使ってデータ中から検索を行う場合にはデータ構成を注意してください。
お礼
回答ありがとうございます。 ひとつめの提案の方法がちょっとわからないので2つ目の方ので考えてみました。 >データに埋もれないように少し大きめの件名 というのは他の項目と絶対にかぶらないデータということでよろしいでしょうか? 実際には日付&タイトルというような形にしようと思っていますので大丈夫かと思います。 入力.html ↓ ↓ (1)データを入力 ↓ データ.log (2)へデータが入る。 検索.html ↓ ↓ (3)番号を入力 ↓ (4)データ.logオープン ↓ (5)番号と一致するものを探す ↓ 結果.html (6)へデータをはきだす。 というような流れにしようと思っています。 わからないのは(5)と(6)のところです。
補足
すいません、教えていただいたindexを使用してみようみまねでやってみたのですが…。 #ファイルオープン open FILE,"<log.log"; flock(FILE,2); @log_data=<FILE>; flock(FILE,8); close FILE; $kensakuchi = "1119"; $position = index $kensakuchi, @log_data; print "Content-type:text/html\n\n"; print "$position\n"; としてみましたが…ダメでした。 一部分のみでの検索はダメなのでしょうか? 最終的にはその検索して出てきたところの1行をはきだすまでをしたいのです。 よろしくお願いします。