• ベストアンサー

Perlのファイルオープン時のモードについて。

y_okuの回答

  • ベストアンサー
  • y_oku
  • ベストアンサー率62% (25/40)
回答No.2

カウンタを書き出す前にはcloseするのではなく、 seekでファイル操作の位置をリセットしてやります。 ------------------------------------------------------- open(CNT,"+<cnt.dat"); $cnt = <CNT>; chomp $cnt; $cnt++; seek(CNT, 0, 0); # 位置をCNTの先頭に戻す。 print CNT $cnt; close(CNT); ------------------------------------------------------- このカウンタの場合は文字列の長さが減らないので大丈夫ですが、 読みこんだものが「aaaaaa」の場合に「bbb」を書きこむと、 「bbbaaa」のように混ざったものが残るので注意。 print CNT "$cnt\n"; のように改行も一緒に出力してやると少し安心かも。

ikariya
質問者

お礼

カウントが2つずつアップされてしまうのはどうやら ブラウザの設定がおかしかったようです。 頂いた注意を元にプログラムを組みましたところ、成功致しました。 ありがとうございました。

関連するQ&A

  • perl CGIが開くと勝手に処理してしまうのを防ぎたい

    BBSを作成中で、そのBBSに記事ナンバーをつけようと奮闘中です。そこで質問があります。Flashを使って作製していますが、CGIの質問は非常に稚拙だと思いますので、お助けください。 記事のナンバーカウントの値がアップする仕組みをCGIファイルに 組み込んだのですが、書き込みボタンが押されていないのに、 最初にページを開いた瞬間に、カウントがアップしてしまう状態になってしまっています。それ以後は、ページを閉じない限りは、書き込みボタンが押されるたびにカウントの値は1ずつきちんと増えていきます。 要するに、ページを開いたときにカウントが1増えるのを防ぎたいのです。 ちょっとうまく伝えにくいのですが、 以下のような仕組みになります。 count.datファイルの中の数値が一つずつあがっていくようになっています。 #----- ファイルを読み込む $countfile = "./count.dat"; #-----カウントの値の読み込み open(COM,"$countfile"); $cnt=<COM>; close(COM); #-----カウントの値に1プラスする $cnt++; open(COM,">$countfile"); print COM $cnt; close(COM); と、以上のような単純な仕組みなのですが、 最後の「カウントの値に1プラスする」という処理が勝手に実行されてしまいます。 CGIファイルの一番下にカウントの値を1プラスする処理を実行するスクリプトを置いたのですが、 最初に実行されてしまうようです。 宜しくお願い致します。

    • ベストアンサー
    • CGI
  • 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
  • アクセスカウンタでリロード時のカウントされるのをやめたい!

    自分のPCでIIS5.0をインストールして CGIの作成練習をしています。 簡単なアクセスカウンタを作ったのですが、 どっかのをコピーしただけ。。。 sub counter{ #(読込み) open (IN,"<./count.dat"); $raikyaku = <IN>; close (IN); $raikyaku++; #(書き込み) open (OUT,">./count.dat"); print OUT $raikyaku; close (OUT); } これを、更新ボタンを押した時にカウントされない ようにしたいです。 また、BBSに埋め込もうと思っているので、 投稿ボタンで再表示された場合も カウントされてほしくありません。

  • 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
  • Perlでファイル出力時にデッドロック(?)してしまいます。

    Perl(5.005_03)で、約5000万バイトのテキストファイルを読み込んで、そのデータに変更を加えた後、別のテキストファイルに書き出すプログラムを作っています。 テキストファイルへの書き出しは、16回に分けて約300万バイトずつ行っています。 すると、ファイルへの書き出しが半分も終わらないうちに、デッドロック(?)してしまうみたいで、書き出し中のファイルは途中のまんま、プログラムが終わってしまいます。。。 いまは、出力ファイルを開く前に「print " ";」を入れることでとりあえず動いています。(それも、どうしてなのかわかりません・・・) 何か良い方法はないでしょうか? よろしくお願いします。 【環境】sun4-solaris, apache 以下は、ファイルへ書き出している部分のソースです ------------------------------------------------------------------- print " "; # これを入れないとプログラムが正常終了できません open OUT, ">>$file" || die "can't open : $!"; print OUT $data; # $data には約300万バイト入っています close OUT; -------------------------------------------------------------------

    • ベストアンサー
    • Perl
  • クリックカウンタで隠しページにジャンプさせたい

    クリックカウンタについて教えて下さい。 (1)ある特定のカウント(例えば10)になったら隠しページに飛ばしたい (2)その後は何度クリックしてもカウント数はかわらない(動作させない) (3)その後カウントをクリアして再度クリックカウント出来るようにしたい (1)はなんとか出来ました。ですが、その後の動作が上手く出来ません。どなた様かアドバイスをお願い申し上げます。 <<click.cgi>> #!C:\Perl\bin\perl #=================================================== # 各種設定 #=================================================== $lockfile = "./lock"; $jumpurl = "./blog.html"; #ジャンプさせたい隠しページのURL $hikaku = 9; #日時の取得------------------------------ @youbi = ('日', '月', '火', '水', '木', '金', '土'); ($sec,$min,$hour,$mday,$mon,$year,$week,$yday,$sammer) = localtime; $year += 1900; $mon += 1; $yday = ""; $sammer = ""; $now = "$year年$mon月$mday日($youbi[$week]) $hour:$min-$sec秒\n"; #=================================================== # カウントアップ #=================================================== $url = $ENV{'QUERY_STRING'}; &lock; #ログファイルからデータの読み込み---------- open (IN,"<cntdata.dat") || die "Open Error!\n"; $cnt = <IN>; close IN; if($cnt >= $hikaku){ open (FILE, ">text.dat") || die "Open Error!\n"; print FILE "$now<br />10クリックを超えました。ご利用ありがとうございました。"; close FILE; open (OUT,">cntdata.dat") || die "Open Error!\n"; $cnt = 1; print OUT $cnt; close OUT; print "Location: $jumpurl\n\n"; exit; } #記録の更新-------------------------------- $cnt++; #カウントアップ $count = sprintf("%04d", $cnt); open (OUT,">cntdata.dat") || die "Open Error!\n"; print OUT $count; close OUT; &unlock; print "Location: $url\n\n"; #元のページにジャンプさせる exit; #=================================================== # エラーと排他処理サブルーチン #=================================================== sub lock { $retry = 3; if (-e $lockfile) { $locktime = (stat($lockfile))[9]; if ($locktime < time - 60) {&unlock;} } while (!mkdir($lockfile, 0755)) { if (--$retry < 0) {&error;} sleep(1); } } sub unlock {rmdir($lockfile);} <<cntdata.dat>> クリック数 <<text.dat>> 日時とありがとうメッセージ <<index.shtml>> <html> <head> <title>サンプル</title> </head> <body> <a href="./click.cgi?./index.shtml">クリック</a> <p>現在のクリック数:<!--#include file="./cntdata.dat"--></p> <p><!--#include file="./text.dat"--></p> </body> </html> 10クリック超えて、カウンタの数字が1に戻るのですが、その後またクリックすると動きません。なので、(3)にしたい場合には何をすればよいのでしょか。また(3)が無理なら(2)のようにクリックしてもcgiを動作しないようにしたいです。

    • ベストアンサー
    • Perl
  • PerlでのCSV書き込みについて質問です。

    perl初心者です。 perlで投票のプログラミングを作ってるのですが、 どうもうまく動きません。 やりたいことは ・投票されたら  1)csvを読み込む  2)該当するNOのカウントをアップ  3)csvに書き込む という単純なことなのですが、 投票してもカウンタは0のままになってしまいます。 書き込み部分のプログラムが間違っているとは思うのですが 何が間違っているのかがどうしてもわかりません。 どなたかお知恵を貸してくださいm(__)m プログラムは下記のようになっています。 ================= foreach my $key (@key) { $val = $in{$key}; $in{$key} = &Jcode::convert(\$val, 'sjis'); } # データオープン open(DAT,"+< $datfile"); flock(DAT, 2); my @data; while (<DAT>) { push(@data,$_); if (eof) { last; } } # データ書き込み truncate(DAT, 0); seek(DAT, 0, 0); my $i=1 while (i<11){ my ($no,$name,$count) = split(/,/, $data[$i]); if($val eq $no){$count++;} if (eof) { last; } $i++; print DAT "$no,$name,$count,\n"; } close(DAT); ================= どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでテキストファイル読み込み

    基本的な質問ですみません。 サーバ上のテキストファイルを読み込んで ローカルのテキストファイルに書き込むというだけなのですが 何度やってもできません。 以下プログラムですが #!usr/bin/perl open(IN,"http://*****/***/***.txt"); $file = <IN>; close(IN); open(OUT,"> a.txt"); print(OUT "$file"); close(OUT); サーバのアドレスは、URLうってみて見れたのでhttp://***(以下略)であってると思います。 サーバのテキストにはchmodで777と権限を与えました。 プログラムに問題あるのでしょうか。 この場合考えられる原因を教えてください。

    • ベストアンサー
    • Perl
  • Perlのプログラミングについて

    Perlのプログラミングでつまづきました。 # ファイルから指定文字列を含む行を収集する # 入力ファイルのオープンと読み込み print( "入力ファイル名?" ); $n = <STDIN>; chomp( $n ); open( FIN, "<$n" ) or die "入力ファイルオープンエラー: $!\n"; $n = @a = <FIN>; close( FIN ); print( "$n 行読み込みました\n" ); # 行の収集 print( "検索文字列?" ); $x = <STDIN>; chomp( $x ); $ptn = $x; #指定の文字列 $x = @b = grep( /$ptn/, @a ); print( "$x 行見つかりました\n" ); # 出力ファイルのオープンと書き出し print( "出力ファイル名?" ); $y = <STDIN>; chomp( $y ); open( FOUT, ">$y" ) or die "出力ファイルオープンエラー: $!\n"; print FOUT ( $ptn, "\n" ); print FOUT ( $x, "\n" ); print FOUT ( @b ); close( FOUT ); というプログラムで実行すると C:\My Perl\pl>perl プログラムの実行.pl 入力ファイル名?sample1.txt 168 行読み込みました 検索文字列?k 45 行見つかりました 出力ファイル名?out3-24.txt 続行するには何かキーを押してください . . . となり出力ファイルの中身が表示されません。 どこを間違えているのかご指摘いただけないでしょうか?

  • ファイルopenについて

    1----------------------------------- open(IN,">$past_file")|| &error; @lines2=<IN>; close(IN); >は書き込みopenということですが、この使い方で一応読み込みはできます。しかしやはり使い方としては間違っているのでしょうか?OSによってはできないとか・・ というのも、ないファイルをOPENするとき、読み込みではファイルはopenできませんよね。書き込みでopenすれば、ないファイルを自動で作成してくれます。今作っている掲示板だとこれは都合がいいので、こういう風に記述したいのですがだめでしょうか。

    • ベストアンサー
    • Perl