- 締切済み
日記の指定日のみ表示
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のみ表示」するには、どのように条件付けすれば宜しいのでしょうか? 色々やってみましたが、出来ませんでした。どなたか教えて下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- urakids
- ベストアンサー率77% (7/9)
#!/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)
え? $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)
えぇと, どのようにやって「できなかった」のかよくわかりませんが, 正規表現で書くのが普通かな. 例えば one-liner で perl -ne 'print if m!/08/01/!' とか. split + eq でもいいけど.
補足
ご回答有難うございます。 「できなかった」の内容なのですが ↓こうすれば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部分&次ページへのリンク等」組み込んでみましたがダメで、行き詰ってしまいました。 日記なので、プログラムに直接日付などを書かずに表示がしたいのですが、どのように勉強すればいいのかも分からなくなってしまいました。