重要なお知らせ

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

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

初心者です。
ファイル(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;

A 回答 (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__


参考までに。
    • good
    • 0

答えを差し上げてもためにならないのでヒントを差し上げます:


もっとも質問ごと削除されちゃうかもしれませんが。

◇明らかに変なところ その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桁のうちは動くでしょう)
    • good
    • 0

こんにちは、


ざっと見ですけど、

>$a[l]=$_;

配列のインデックスが変数になってませんよ。

use strict;だったら実行前にエラーになると思います。
短いスクリプトでもやっぱり use strict; は必須だと思います。
    • good
    • 0

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