チョコミントアイス

 たびたびの質問ですみません。
 初心者のため文法が理解できていないのか、今度はデータの読み込みでうまくいきません。

 記述中のcgiファイルと同じディレクトリにdata.datというファイルがあり、そのファイルには三行のデータが記述されています。

 内容は下記の内容です。

---以下から---
2006,03,18,,1800,グランド代,鈴木,公園,練習
2006,03,19,1500,,部費,加藤,#1鈴木,2006年度
2006,03,25,1500,,部費,加藤,#2太田,2006年度
---以上まで---

 このデータを各変数に割り当てたいのですが、うまくいきません。
 下記のように記述していますが、いかがなモノでしょうか?

---以下から---
$fileline = 0;
open FD, "<data.dat" || die $!;
while (<FD>) {
$fileline++;
}
close FD;

open(FILE, "<data.dat") or printErrorPage("データファイルが開けません。");
eval{ flock(FILE, 1); };
@data = <FILE>;
close FILE;

for($k=0; $k<$fileline; ++$k){
($year,$month,$date,$in,$out,$mono,$member,$etc1,$etc2) = split(/\,/, $data[$i]);

$totalin = $totalin + $in[$k];
$totalout = $totalout + $out[$k];
}
$totalinout = $totalin - $totalout;
---以上まで---

 最終的に$totalinには1500と1500が足されて3000と入って、$totaloutには1800と入って、$totalinoutには3000から1800が引かれて1200と計算されるようにしたいのです。

A 回答 (2件)

直接的な原因は、


>split(/\,/, $data[$i]);
で、未使用の変数 $i を使用しているためです。
---------------------------------------------------------------
open(FILE, "<:encoding(Shift_JIS)", "data.dat") or printErrorPage("データファイルが開けません。");
eval{ flock(FILE, 1); };

while(<FILE>){
($year,$month,$date,$in,$out,$mono,$member,$etc1,$etc2) = split/,/;
$totalin += $in;
$totalout += $out;
}
close FILE;

$totalinout = $totalin - $totalout;
    • good
    • 0
この回答へのお礼

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

記述までしていただき、大変参考になりました。

お礼日時:2006/05/02 08:16

がると申します。


んっと…あちこち突っ込みどころはあるのですが(苦笑

まず、最初の6行は不要に見えるのですが如何なものでしょう?
ファイルの行数を取るだけなら、その後に出てくる@data配列の個数を調べれば等価だと思います。

もし「for文のため」であるならば、foreachというものを調べてみてください。多分「ああこんな便利なものが…」になると思うので。

後は、デバッグプリントを入れてみるとよろしいかと。
print文をあちこちに埋め込んで、そのときの変数の状態を調べます。
例えばfor文の直後に
print $data[$i] . "\n";
とやれば、現在扱おうとしている文字列がはっきりしますし。

ちぃと大変かもしれませんが、頑張ってください。
    • good
    • 0
この回答へのお礼

参考書を片手に、そして、他の方が作成したスクリプトを参考にしていました。

いわゆるデバッグプリントはやっているのですが、埋め込む場所がまるで意味がないところでした。

foreach、これから調べてみます。

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

お礼日時:2006/05/02 08:19

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