- ベストアンサー
Perlのファイルオープン時のモードについて。
初歩の初歩、テキストカウンターを作成しようとして open (CNT,"+<cnt.dat"); $cnt = <CNT>; close(CNT); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); と上記のようなプログラムを書いたのですが、 ファイルに書き込みがなされません。 多少わかりにくい書き方になるかとは思いましたが、 open (CNT,"<cnt.dat"); $cnt = <CNT>; close(CNT); open(CNT,">$cntfile"); chomp $cnt; $cnt = $cnt + 1; print CNT $cnt; close (CNT); という風に書きかえてみました。 こちらですと、書き込みはされるのですが何故かカウントが 2つずつカウントされてしまうんです。 プログラムとしておかしな点というのが思い当たらずお手上げです。 ご教授下さい、お願いします。
- みんなの回答 (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"; のように改行も一緒に出力してやると少し安心かも。
その他の回答 (1)
- h_hikita
- ベストアンサー率40% (104/257)
最初のは、書き込みに使ってるファイルハンドルを先に閉じているので うまく行ってないきがします。 2つ目のは、 $cntfileが定義されてないのですが、cnt.datに変更して 走らせてみたら、そのまま1づつ増加しましたけど...(?_?;
お礼
早々の御回答ありがとうございました。 コピーアンドペーストを調整しようとして しくじっていました。 プログラムは正しいハズなんだと念じて 原因究明しました結果、成功致しました。 ありがとうございます。
お礼
カウントが2つずつアップされてしまうのはどうやら ブラウザの設定がおかしかったようです。 頂いた注意を元にプログラムを組みましたところ、成功致しました。 ありがとうございました。