• ベストアンサー

Perl - ファイルのオープン

Perl でカウンタを作っているんですが、 mkdir($year, 0755) などをした後に、 open(F, "+< ./$year/$mon/$day.log") $count = <F> $count ++; print F $count; のようにしているのですが、カウンタファイルが新規作成されませんし、存在しても更新されません。 どうすればいいでしょうか?

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
回答No.1

上記のソースは存在すれば値が更新されるはずです。 具体的にはお尻に"1"が延々とついていくはずです。 主に考えられる原因は以下の通りでしょう。 ・ディレクトリのパーミッションが間違っている (755だとオーナー以外書き込めない) ・ディレクトリが存在しない ($yearディレクトリ内に$monのディレクトリは事前にちゃんと作ってますか?) ・追記モード(+<)ではファイルの新規作成は出来ない (読み出し、追記を両方行い、さらに新規作成するためには"+>>"を使う。ただし適切にseekを行う必要がある) ファイルから数値を読み出す前と書き込む前に seek(F,0,0); を入れてファイルポインタのオフセットを先頭に戻してください。

sprintfalls
質問者

お礼

ありがとうございます。 おかけでできるようになりました。 (^ ^)

関連するQ&A

  • ログの記録方法について

    現在、以下のように記録する最大数を超えた場合、 古いデータは1行削除、新規データは追加するようにしてるのですが これを最大数を超えた場合にはfile.txtのすべてデータを 別に自動生成した過去ログファイルに記録し、 また過去ログファイルは最大5ファイルまで作成したいのです。 もしやり方が分かるようでしたらお手数ですがお教えいただけませんか? $maxlog = $logmax; #ログファイルの場所 $comment =~ s/\n//g; ($sec,$min,$hour,$day,$mon,$year,$wday,$dmy,$dmy) = localtime(time); $year = 1900 + $year; $mon++; if ($mon < 10) { $mon = "0$mon"; } if ($day < 10) { $day = "0$day"; } if ($hour < 10) { $hour = "0$hour"; } if ($min < 10) { $min = "0$min"; } $date = "$year\/$mon\/$day $hour\:$min"; # ログファイル読込 open LOG,$file; @log = <LOG>; close LOG; # 先頭に新規ログデータを追加 unshift (@log,"$date<>$mailto<>$comment<>$agent<>$host<>$toki<>\n"); # 保存行数を超える分末尾を削除 while(@log > $maxlog){ pop @log; } # 更新されたデータでログファイルに上書き open LOG,">$file"; print LOG @log; close LOG;

    • ベストアンサー
    • Perl
  • perl の printでのファイルへの指示にて

    独学でmacでパールを勉強しています。 始めてからまだ1週間くらい。 教科書みながら、print命令でファイルハンドルに指示を出してるのですが、 書き込めはできるのですが、 ファイルが無い場合、 新規に自動でファイルが作成されるはずとの記載があったのですが、 何故か、自動でファイルが生成されません。 調べても、設定が必要等言われてますが、 mac自体も初心者でほとんどわかりません。 どのような設定にすればいいのでしょうか? また、ソースに何か悪い所があるのでしょうか? お助けください。   ちなみに下記がソースです。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>あなたは${cnt}人目の訪問者です。</CENTER>\n"; if ( open(FH, ">count.txt" )){ print FH $cnt; close(FH); } else { print "ファイルの書き込みオープンに失敗しました。\n"; } } else { print "ファイルの書き込みオープンに失敗しました。\n"; } print "</BODY>\n"; print "</HTML>\n"; __END__ ーーーーーーーーーーーーーーーーーーーーーーーーーー

    • ベストアンサー
    • Perl
  • @niftyホームページでのアクセスカウンタ(perl)

    すごく簡単なアクセスカウンタなのですが実行できません。 ちなみに、perlスクリプトは、count.plというファイルに、 #!/usr/local/bin/perl $countfile="count.dat"; open IN,"$countfile"; $count=<IN>; close IN; $count=$count+1; open OUT,">$countfile"; print OUT $count; close OUT; print $count; html内の記述は、 あなたは、<!--#exec cmd="http://hpcgi3.nifty.com/******/count.pl"-->人目 plファイルを置くディレクトリは間違っていないようです。 perl、@niftyに詳しい方回答お願い致します。

    • ベストアンサー
    • Perl
  • 次のカウンターのCGIプログラムで間違っているところはどこでしょうか?

    参考書を手にしながら次のようにCGIを作成しましたが、上手く動きません。 個人別カウンター(アクセスしてきた個人ごとにカウンターが変わる)CGIです。 いろいろ調べたのですが、どこが間違っているのか分からなくなりました。 どうぞお願いいたします。 ======= #!/usr/local/bin/perl $cookie = $ENV{'HTTP_COOKIE'}; @array = split(/; /, $cookie); foreach $tmp (@array){ ($key, $value) = split(/=/, $tmp); if($key eq 'count'){ $count = $value; } } if( $key == ""){ $count = 0; } $count++; ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = gmtime(time + 60*60*24*30); @day = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "sat"); @month = ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Set", "Oct", "Nov", "Dec"); $expireDate = sprintf("%s\, %02d\-%s\-%04d %02d:%02d:%02d GMT", $day[$wday], $mday, $month[$mon], $year+1900, $hour, $min, $sec); print "Content-Type: text/html\n"; print "Set-cookie: count=$count; expires=$expireDate \n\n"; Print "<html>\n"; Print "<title>counter4</title>\n"; print "<body>\n"; print "<h1>個人別カウンター</h1>\n<hr />"; print "あなたは$count回目のご訪問です。\n"; print "</body>\n"; print "</html>"; exit;

    • ベストアンサー
    • CGI
  • ローカルだと改行されるのに、サーバーにアップすると半角・が…

    ローカルでテストすると、きちんとログファイルに改行と認識され、 NAME=***&……TIME=20040515 NAME=***&……TIME=20040516 のように書き込まれますが、サーバーにアップすると、 NAME=***&……TIME=20040515・NAME=***&……TIME=20040516・ のようになってしまいます。 書き込みは以下のようにしています。 open (FILE2,">>log.log"); @fw = "NAME=$FORM{'NAME'}&…&TIME=$year/$mon/$day $hour:$min:$sec&TIME2=$year$mon$day$hour$min$sec\n"; print FILE2 @fw; close(FILE2); なぜでしょうか? 解決策お願いします(><)

    • ベストアンサー
    • Perl
  • perl localhostでgifを表示するには

    超初心者からプログラムを初めて1週間、 プログラム言語にはperlを使用しています。 mac os x です。 perlの教科書読みながら、アクセスカウンタを作ろうとした所、 何故かgif画像が表示されません。 ネットの素材置き場からとってきましたが、パソコン自身、gif自体は認識してくれてます。 ただ、それをperlに組み込んで使おうとすると、表示されません。 ブラウザはfirefoxとsafariで試しましたが、両方認識してくれませんでした。 ちなみにソースは ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<HTML>\n"; print "<HEAD><TITLE>アクセスカウンタ2</TITLE></HEAD>\n"; print " <BODY>\n"; print "<H1>test</H1><HR>\n"; if ( open ( FH , "count.txt")){ $cnt = <FH>; close( FH ); $cnt++; print"<CENTER>\n"; foreach $fld (split (// , $cnt)){ print "<IMG SRC=\"${fld}.gif\">"; } print"</CENTER>\n"; if ( open(FH, ">count.txt" )){ print FH $cnt; close(FH); } else { print "ファイルの書き込みオープンに失敗しました。\n"; } } else { print "ファイルの書き込みオープンに失敗しました。\n"; } print "</BODY>\n"; print "</HTML>\n"; __END__ ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー です。 テキストファイルを確認しているので、 perl 自体の活動と、アクセスのログ?自体は正常に動いているみたいです。 お願いします。 助けてください!

    • ベストアンサー
    • Perl
  • カウンターで重複カウントの防止について

    勉強がてら以下のようなカウンターをつくりたいと思っています。 1 画像つきのカウンタである 2 重複カウンタを防止したい 3 昨日と今日のカウンターも表示させたい で、2でけつまずきました。 何がいけないのでしょうか? 以下のプログラムだと更新毎にカウンターが回ってしまいます。 ご指摘下さい。よろしくお願い申し上げます。 #!C:\Perl\bin\perl $flg = 0; #IPアドレスの取得と重複カウントの防止============ $ipadd = $ENV{'REMOTE_ADDR'}; #IPアドレスの取得 open (FILE, "<logcount.dat") || die "File Open Err!-logcount.dat\n"; #データをすべて配列logdataに読み込む @logdata = <FILE>; close(FILE); #取得したIPアドレスと履歴のIPアドレスを比較====== for($i=0; $i<=$#logdata; $i++){ if($ipadd eq $logdata[$i]){ #新規のIPデータと過去ログのIPデータが等しかったら $flg = 1; #合致するのは1つのアドレスのみ } } #==================================================================== # $flg = 0 だったら、数をカウント #==================================================================== open(FILE,"<count.dat") || die "File Open Error!-count.dat\n"; #カウントデータの読み込み $count = <FILE>; #変数countにデータを収納 close(FILE); if($flg == 1){ $data = $count; }else{ $data = ++$count; #プラス1をカウント # ログの更新================================== open(FILE, "+<count.dat") || die "File Open Error!\n"; flock(FILE,2); seek(FILE, 0, 0); #.datに上書き保存する為にデータの記位置を調整 print FILE $data; #カウントを記録 flock(FILE,8); close(FILE); # IPアドレスを更新============================= open (FILE, ">>logcount.dat") || die "File Open Err!-logcount.dat\n"; print FILE $ipadd,"\n"; close(FILE); } print $data; #==================================================================== # カウンタの数字に画像を付ける #==================================================================== @count = split(//, $data); foreach $cou(@count){ push(@view, "./img/$cou.gif"); } require "./gifcat.pl"; print "Content-type:image/gif\n\n"; binmode(STDOUT); print &gifcat::gifcat(@view);

    • ベストアンサー
    • Perl
  • perlのmkdirについて

    perlのmkdir関数の第2引数に[MODE]というものがあるのですが、ファイルロックに使うMODEは、何が一番いいのでしょうか?  それから、MODEには、どういう種類があるのでしょうか?  初心者で、今perlでカウンターを作っているのですが、このMODEで、つまづいています。どなたか、詳しく教えてもらえませんでしょうか?

    • ベストアンサー
    • CGI
  • ログの一部を消す Perl

    ログの一部を消すPerlを考えています。 ここではソースを短くするために、ログの一部を消し去って ログファイルに上書きするデータは $deta だけだとすると open F, '+<a.log'; flock F,2; $deta = <F>;//実際はここでもっと処理 truncate F,0; seek F,0,0; print F $deta; close F; と、 open IN, 'a.log'; flock IN,2; open OUT, '>a.log'; flock OUT,2; $deta = <IN>;//実際はここでもっと処理 print OUT $deta; close OUT; close IN; の2つを考えました。 上のように 読み込み と 書き込み を同時にやった方がいいのか 下のように分けてやった方がいいのか教えてください。 ロックは flock を使って、普通レベルのロックが できるぐらいでいいと思っているんだけど、 この flock の書き方でおかしいところがあれば 教えてください。

    • ベストアンサー
    • CGI
  • cgiのログの書き方

    ここで教えてもらってログファイルの書き方(挿入のようなカンジで)をやってみたんですが、どうしても思い通りの動きをしません。 希望としては、IDが一緒なら、その同じIDの下に書き込みを行う。同じIDが見つからなければ、一番上に書き込みを行う。 というようにしたいのです。 上記のことを行うために以下のコードを書きました。 --------------- for ($w=0;$w<$gyou+1;$w++){ @log3 = split(/&/,$log2[$w]); foreach(@log3){ ($keyw,$valuew) = split(/=/,$_); $FORMw{$keyw} = $valuew; }#foreach open(FH3,">>log.log"); if ($ID == $FORMw{'ID'}){ print FH3"ID=$ID&COUNT=$COUNT&TITLE=$TITLE&NAME=$NAME&PASSWORD=$PASSWORD&NAKAMI=$NAKAMI&COLOR=$COLOR&TIME=$year/$m on/$day $hour:$min:$sec&SEARCHKEY=$year$mon$day$hour$min$sec\n"; last; } else { if($w+1 == $gyou){ print FH3"ID=$ID&COUNT=$COUNT&TITLE=$TITLE&NAME=$NAME&PASSWORD=$PASSWORD&NAKAMI=$NAKAMI&COLOR=$COLOR&TIME=$year/$m on/$day $hour:$min:$sec&SEARCHKEY=$year$mon$day$hour$min$sec\n"; close(FH3); } } }#for --------------- どうしてもログファイルの最新情報としてしか書き込みがされません。 また、最新ログを1番上に書き込む、ということをしたいのですができますか? 日付順などで並べ替えをしてしまうと、ぐちゃぐちゃになってしまうので、並べ替えを行わずに、です。 またこのような書き込みの仕方をしなくても、 例えば並べ替えで、Excelみたいに、1番目と3番目を基準に並べ替え、とかでできますか? (私は1つの方法でしか知らないので、どうしても意図する順番になりません。)

専門家に質問してみよう