アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のようにtestディレクトリ内のファイルを読み込み、
それぞれにあるデータを足して、
読み込んだファイルを他のディレクトリに書き出したいのですが、
どのようにしたらよいのでしょうか。

とりあえず、下記はファイルを読み込んで、
なにも足さずそのまま別のディレクトリに移すとこまで、
やりたいと思っていますが、
どうやっていいものか・・・

#!/usr/bin/perl

$dir = "test/";

opendir(DIR, $dir);
while($file = readdir(DIR)){
open(IN, ">>$dir$file");
@list = <IN>;
foreach $dataLine(@list) {
print IN $dataLine;
}
close(IN);
}
closedir(DIR);




ようはファイルに追記したいのですが、
上書きしないで、バックをとっておき、
別のところへ追記したバージョンを生成したいということです。

ご協力お願いします。

A 回答 (2件)

一応これで動くかな??


感じだけ掴み取ってください。動作テストしてないので。



$b_dir = "back_dir/";#バックアップを置いておくディレクトリ
$n_dir = "new_dir/";#通常使用のディレクトリ

$new_line = "追加したい項目";

opendir(DIR, $n_dir);
while($file = readdir(DIR)){

$nfile="$n_dir$file";# 一応わかりやすいように。。
$bfile="$b_dir$file";

####
## まずはファイルテスト
if (-T $nfile) {# テキストファイルかどうかチェック。 $n_dirにログファイルしか置かないのであれば、-Tじゃなくて-fでもいいかも。

#####
## 読込み
open(IN, $nfile);
@list = <IN>;
close(IN);

#####
## バックアップ出力
open(DB,">$bfile");
print DB @list;
close(DB);

#####
## NEWライン出力
push(@list, $new_line);#新しいライン挿入
open(IN,">$nfile");#いよいよ出力
print IN @list;
close(IN);
}
else{next;}#ファイルテストに失敗したら、次いってみよ~。
}
closedir(DIR);


通常使用のフォルダから読み取り、それはバックアップとして$bfileに書き出します。
そこに新しい項目を追加(push)して、通常使用のフォルダに書き出します。

あってる?
    • good
    • 0
この回答へのお礼

サンプルコードまでいただいてありがとうございます!

早速試してみます!

お礼日時:2008/03/07 13:27

失礼かとは思いますが、いろいろ書きます。

すみません。

> それぞれにあるデータを足して

この足すとは演算処理なのか、追記処理のどちらでしょうか?

> open(IN, ">>$dir$file");

これでは読み込みではなく追記書き込みしてしまいます。

open(IN, "<$dir$file");

としないと読み込みは出来ないです。

> どうやっていいものか・・・

一度やりたいことを箇条書きにしてみてはどうでしょうか?

> 上書きしないで、バックをとっておき、別のところへ追記した
> バージョンを生成したいということです。

やりたいことは、次のことでしょうか?

1. バックアップの作成(単純に別ディレクトリへコピー)
2. ディレクトリ内のファイルの列挙
3. 列挙したファイルへの処理と保存

それといきなりファイル操作部分のコーディングをしてしまうので
はなく「print "$dir$file\n";」等として、ファイルが列挙できて
いるか確認する、それから open して読み込みができているか内容を
print で出力して確認して……と、ステップを踏んだほうが良いかと
思いますが、いかがでしょう?

それと $file に対してはテスト演算子の「-T」等を使って確認を
しないと「.」や「..」というものまでファイルとして扱うことに
なります。

if(-T $dir.$file){
# ファイルに対する処理
}

※ -T はテキストファイルであるかどうか調べるもの

余計なことかも知れませんが、 linux 環境なら `cp -a $dir $backupdir`;
としてから、perl で $dir 内のファイルの処理を行うほうが perl で
バックアップするより早いかと思います。
    • good
    • 0
この回答へのお礼

細かくご指摘いただいてありがとうございます。
なんとなくわかりました!
open(IN, ">>$dir$file");というのは
既存ファイルの内容にプラスして追記だとおもっていたのですが、
ちがうのですね!
それだけわかっただけでもかなりの収穫です。

ありがとうございました!

お礼日時:2008/03/07 13:26

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