- ベストアンサー
perlでのデータ処理について
- perlでのデータ処理について困っている方へのアドバイス
- ファイルの読み込みと書き込みで問題が発生しているかもしれません
- コードの一部を修正することで問題が解決する可能性があります
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
正規表現なんか使わなくても $work=""; でいいです。 これを 使い始める前か、使い終わった後に置きます。while(<IN>)ループの中ならどこでもいいです。 具体的には、【1】~【4】のどこかですね。 ついでですが、@logs=(); には意味がありません。それと、 for ($i=0; $i<@all_data; $i++){ $work.="$all_data[$i],"; } chop $work; push(@new,$work); }else{ push(@new,$log); } } のところは、 push(@new,join(',',@all_data)); の1行でいいじゃないですか。そうすると $work は不要ですね。 open(IN,"$files2") || &error("$files1を開けません。"); while (<IN>) { ($no,$id,$mail,$type,$data)=split(/,/); &get_date; @logs=(); @new=(); 【1】 open(LOG,"$files1") || &error("$files1を開けません"); @logs = <LOG>; close(LOG); 【2】 foreach $log (@logs){ @all_data = split(/,/,$log); if ($all_data[0] eq $id){ $shori_date="$year\/$w_mon\/$w_mday"; $all_data[33]="($shori_date)($hour:$min)"; 【3】 for ($i=0; $i<@all_data; $i++){ $work.="$all_data[$i],"; } chop $work; push(@new,$work); }else{ push(@new,$log); } } open(ALL,"+< $files1") || &error("$files1に書き込めません"); flock(ALL,2); truncate(ALL,0); seek(ALL,0,0); print ALL @new; close(ALL); 【4】 } close(IN);
その他の回答 (1)
- okmotokun
- ベストアンサー率59% (92/155)
上記の書き方だと、$files2 の 1行処理ごとに $work をカラにしないといけません。
補足
アドバイスありがとうございます。 $workをカラにする方法ですが、正規表現の置き換えでもいいのでしょうか? 例えば、$work=~ s/$work//g;で$workの中身をカラにしてもいいのでしょうか? $work=~ s/$work//g;このやり方でやってみたら、日付は入力されましたが、処理が一度しか行われず、 メールの配信が一行目を送って日付を入力したら、スクリプトが終了してしまいました。 どこの部分で、どのようにして$workをカラにすれば全ての送信ファイルを処理できますか? すみませんが教えて下さい。 よろしくお願いします。
お礼
ありがとうございました。おかげで改善できました。 また、わからない事があったら、質問しますので その時は、よろしくお願いします。