• ベストアンサー

ファイルの上書き

初心者です。 ファイル(count.dat)にデータのカウント数を上書きしていきたいのですが、実行しますとファイルが壊れてしまいどこで失敗しているのか分かりません。。 以下のように記述したのですが、アドバイス頂けないでしょうか。 ちなみにcount.datの中身は以下の通りです。 0,0 1,0 2,0 3,0 4,0 5,0 6,0 $max_numの値が別に算出されており、$max_numが1だったら上記の1,0を1,1に、$max_numが2だったら上記の2,0を2,1に上書きしたいと思っています。$max_numでない部分(3,0や4,0や5,0)はそのまま変更なしで保存させたいです。 #ファイルの読み込み $num=0;#過去の人数 $qNo=0;#Qナンバー $l=0; open openDat,'<count.dat' or die "file not Exist!!"; while (<openDat>){ $a[l]=$_; $qNo=substr($a,0,1); if($max_num=$qNo){       $num[l]=substr($a[l],2); $num[l]+=1; $a[l]="$qNo".","."$num[l]"; print $a[l]; }else{ $num[l]=substr($a[l],2); } $l+=1; } close openDat; open openDat,'>count.dat' or die "file not Exist!!"; for( $j=0; $j<=6; $j++) { print openDat $l,"\n"; } close openDat;

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

  • ベストアンサー
  • g_p_
  • ベストアンサー率53% (28/52)
回答No.3

こんにちは、 >ファイルが壊れてしまいどこで失敗しているのか分かりません。。 >for( $j=0; $j<=6; $j++) { >print openDat $l,"\n"; >} これは、6回ループして、$lと改行 を出力しています。 #2氏の >perl の文法や表現の基礎について もう少し学んだほうが良いでしょう。 これは真摯に受け止めていただくとして、 一旦、配列にバッファしてから書き戻すのは ファイルが大きくなると問題がありますが、 質問文スクリプトと比べる為の参考として書いてみます。 #! /usr/bin/perl use strict; use warnings; my $file_name = 'count.dat'; my $max_num = 1; my @lines = (); open my $fh , '+<' , $file_name or die "open error :$!"; flock $fh , 2 or die "lock error :$!"; while ( my $line = <$fh> ) { if ( my( $count ) = $line =~ /^ $max_num \, (\d+) $/xms ){ $line = $max_num . ',' . ++$count . "\n"; } push @lines , $line; } seek $fh , 0 , 0; truncate $fh , 0; print {$fh} @lines; close $fh; __END__ 参考までに。

その他の回答 (2)

  • xiade
  • ベストアンサー率64% (88/137)
回答No.2

答えを差し上げてもためにならないのでヒントを差し上げます: もっとも質問ごと削除されちゃうかもしれませんが。 ◇明らかに変なところ その1 > $a[l]=$_; >      $num[l]=substr($a[l],2); > $num[l]+=1; > $a[l]="$qNo".","."$num[l]"; > print $a[l]; > $num[l]=substr($a[l],2); ・これじゃ みんな [0] 相当ですね ◇明らかに変なところ その2 > for( $j=0; $j<=6; $j++) { > print openDat $l,"\n"; ・$j がまったく絡んでないけど何のためのループ変数? ・そして、その1 を直したとしてもここから出てくるものは明らかに… ◇他と釣り合っていないところ > $qNo=substr($a,0,1); ・なぜここだけスカラ? 以上をもとにもう少し考えてみてください。 perl の文法や表現の基礎について もう少し学んだほうが良いでしょう。 ロジック面では カンマ区切りなのに 固定長文字列切り出しでやろうとしているあたりにもやや無理もあります(1桁のうちは動くでしょう)

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.1

こんにちは、 ざっと見ですけど、 >$a[l]=$_; 配列のインデックスが変数になってませんよ。 use strict;だったら実行前にエラーになると思います。 短いスクリプトでもやっぱり use strict; は必須だと思います。

関連するQ&A