重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

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のみ表示」するには、どのように条件付けすれば宜しいのでしょうか?
色々やってみましたが、出来ませんでした。どなたか教えて下さい。

A 回答 (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) {
  #処理
}
なんて書けば良いと思いますがどうでしょう?
    • good
    • 0

え?


$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 それ
}
くらい.
「通し番号で探す」必然性は全くないと思うのですが....
    • good
    • 0

えぇと, どのようにやって「できなかった」のかよくわかりませんが, 正規表現で書くのが普通かな. 例えば 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部分&次ページへのリンク等」組み込んでみましたがダメで、行き詰ってしまいました。

日記なので、プログラムに直接日付などを書かずに表示がしたいのですが、どのように勉強すればいいのかも分からなくなってしまいました。

補足日時:2009/08/10 15:07
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!