
初心者です。
ファイル(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;
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__
参考までに。
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桁のうちは動くでしょう)
No.1
- 回答日時:
こんにちは、
ざっと見ですけど、
>$a[l]=$_;
配列のインデックスが変数になってませんよ。
use strict;だったら実行前にエラーになると思います。
短いスクリプトでもやっぱり use strict; は必須だと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- C言語・C++・C# C言語でif文が予想と違う動きをする件について7 4 2023/03/20 00:26
- C言語・C++・C# C言語初心者 ポインタについて、お助けください、、 2 2023/03/15 23:50
- C言語・C++・C# C++ と、 1 2022/11/07 23:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
close()で例外が投げられる理由
-
改行コードが勝手に
-
AutoCADのスクリプト
-
PICでFatFsでオープンした内容...
-
while(<ハンドラ>) {} で行数を...
-
perlで大容量CSVのsort方法につ...
-
where can I buy snowbord in t...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
awkスクリプトでダブルクォーテ...
-
C言語で特定の行を抽出する方法...
-
batファイルでrenameができませ...
-
.WFAファイルを変換する
-
window.open でのファイル指定方法
-
エクセルVBAでCSVファイ...
-
JavaでCSVファイルを高速に読む...
-
shellのコマンド deffの差分の...
-
Edge スクレイピング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
close()で例外が投げられる理由
-
perlのflock関数でロックをかけ...
-
改行コードが勝手に
-
where can I buy snowbord in t...
-
ファイルのロックについて
-
perlで複数のファイルの処理に...
-
perlを用いた特定文字列間の抽...
-
変数を使ってファイル名を自分...
-
open中のファイルをrename
-
文字列比較がどうしてもできま...
-
データの入れ替え処理が巧くで...
-
perlで大容量CSVのsort方法につ...
-
テキストファイルの本文中に行...
-
初歩的な質問で恐縮です。
-
パイプをopenして/usr/bin/grep...
-
perlでのスキンの利用方法
-
ログに記録又は読み出す際、最...
-
Perlのファイルオープン時...
-
Perlでハードウェア制御?
-
perlでファイル内の文字列を置...
おすすめ情報