• 締切済み

日記の指定日のみ表示

200908.txt 01,2009/08/01,2009,08,日記タイトル,日記本文,302 02,2009/08/02,2009,08,日記タイトル,日記本文,303 03,2009/08/03,2009,08,日記タイトル,日記本文,304 上記のようなログがあり 「日,日付,年,月,タイトル,本文,通しナンバー」の順に並んでいます。 たとえば、8/1なら「8/1のみ表示」するには、どのように条件付けすれば宜しいのでしょうか? 色々やってみましたが、出来ませんでした。どなたか教えて下さい。

みんなの回答

  • urakids
  • ベストアンサー率77% (7/9)
回答No.3

#!/usr/bin/perl use CGI; my $q = new CGI; &main(); sub main {   my ($mode, $action, $ymd, $w, $f, @file);   #パラメータ取得   $mode  = $q->param('mode');   $action = $q->param('action');   $ymd   = $q->param('YMD');   $w    = $q->param('w');   #ファイル名生成   $f = $ymd . "\.txt";   #ファイル生存確認   if (-e $f) {     #ファイル読み込み     open(FILE, $f) or die;     eval{flock(FILE,1);};     @file = <FILE>;     close(FILE);   }   #後は原本通り   foreach my $diary (reverse @file) {     my ($day,$date,$year,$month,$subject,$descrip,$mynum) = split(/\,/, $diary);     if($diary =~ /$mynum/){       print qq|$date $subject<br>$descrip<br><br>\n|;     }   } } とりあえず書いてみたのですが、書いて思ったのが、 いまいち主旨が見えないと言うか、どうしたいのだろうと思うのですよ。 まず、 私の環境では   if($diary =~/'302'/){     print qq|$date $subject<br>$descrip<br><br>\n|;   } でも正常に動きませんでしたが、これは環境の違いかもしれないので置いておいて、 > if($diary =~/'$mynum'/){ で引っかからない部分ですが、 これは検索部分を'で括っているので、 $diary内から"$mynum"という文字列を検索している事になります。 なので引っ掛からないのは当然かと。 それとは別に、これの直前で > my ($day,$date,$year,$month,$subject,$descrip,$mynum) = split(/,/, $diary); した上で if($diary =~/$mynum/){ をやれば全てが引っ掛かると思うのですが、ここらへんがイマイチ何をしたいのか見えない所。 引っ掛けるだけなら if ("$date$day" eq $ymd) {   #処理 } もしくはパラメータから通し番号を受け取って #改行コードの削除 $mynum =~ tr/\r\n//d; if ($mynum eq $nid) {   #処理 } なんて書けば良いと思いますがどうでしょう?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

え? $diary =~/'302'/ でマッチしますか? シングルクオートが余計なので, どの行にもマッチしないと思うのですが. でも, 「8月1日分のみ表示する」なら $month==8 && $day==1 という条件でいいはずなので, その query から YMD がわかれば後はなんとでもなるはずですよ. YMD が変数 $YMD にあると仮定すると my ($yyyy, $mm, $dd) = ($YMD =~ /(\d{4})(\d{2})(\d{2})/); で $mm に月が, $dd に日が入ります. で, if ($month == $mm && $day == $dd) { print それ } という形にすればいい. ど~しても正規表現でマッチさせたいなら if ($diary =~ m!/$mm/$dd/!) { print それ } くらい. 「通し番号で探す」必然性は全くないと思うのですが....

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

えぇと, どのようにやって「できなかった」のかよくわかりませんが, 正規表現で書くのが普通かな. 例えば one-liner で perl -ne 'print if m!/08/01/!' とか. split + eq でもいいけど.

edct1
質問者

補足

ご回答有難うございます。 「できなかった」の内容なのですが ↓こうすれば8/1のみを表示することが出来ます。 foreach my $diary (reverse@file) { my ($day,$date,$year,$month,$subject,$descrip,$mynum) = split(/,/, $diary);   if($diary =~/'302'/){     print qq|$date $subject<br>$descrip<br><br>\n|;   } } ↓でも、この表現ではできません。   if($diary =~/'$mynum'/){ (日記の通しナンバーはすべてに振られてあるので、全部の日記が表示されてしまいます。) ↓$mynumの値を○○の部分に代入する事ができないんです。   if($diary =~/'○○'/){ cgiの後ろに「diary.cgi?mode=main&action=view&YMD=20090801&w=1」等をつけて表示する方法は、検索しても本を調べてもやり方が書かれておらず、関係ありそうな部分を抜き出して「1ページにいくつ表示するか&html部分&次ページへのリンク等」組み込んでみましたがダメで、行き詰ってしまいました。 日記なので、プログラムに直接日付などを書かずに表示がしたいのですが、どのように勉強すればいいのかも分からなくなってしまいました。

関連するQ&A

専門家に質問してみよう