WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:Perl ログデータの通し番号について

0:[投稿] あやか [2005/06/27 04:08 ][環境:IE6 WIN-Me CGI Perl]

設置済のスクリプトを改造したら、ログデータの通し番号が正確に
取得できなくなってしまいました。

現象としては、本来ならば
    4    名前    性別    ・・・・・
    3    名前    性別    ・・・・・
    2    名前    性別    ・・・・・
    1    名前    性別    ・・・・・
となる筈のデータが、
    2    名前    性別    ・・・・・
    2    名前    性別    ・・・・・
    2    名前    性別    ・・・・・
    1    名前    性別    ・・・・・
というように、最初の投稿以外は、全てのログ番号が2番になって
しまう状態です。

改造前は正確な通し番号が取得できていました。

-------改造前----------------------------------------
    $no = (split /\t/,$datas[$#datas])[0]+1;
    $no=1 unless $no;
    my $value = "$no\t$FORM{'namae'}\t$FORM{'sex'}\t$username\t$^T\t$FORM{'q1'}\t$FORM{'q2'}\t$FORM{'q3'}\t$FORM{'q4'}\t$FORM{'q5'}\n";
    open (LINES,">>$datafile") || &error(1, "データファイルが開けないので、記録できません。");
    eval 'flock(LINES,2);';
    seek (LINES,0,0);
    print LINES ($value);
    eval 'flock(LINES,8);';
    close (LINES);
    push(@datas,$value);

-------改造後----------------------------------------
    $no = (split /\t/,$datas[$#datas])[0]+1;
    $no=1 unless $no;
    my $value = "$no\t$FORM{'namae'}\t$FORM{'sex'}\t$username\t$^T\t$FORM{'q1'}\t$FORM{'q2'}\t$FORM{'q3'}\t$FORM{'q4'}\t$FORM{'q5'}\n";
    open (LINES,"<$datafile") || die &error(1, "データファイルが開けないので、記録できません。");
    @datas = <LINES>;
    close (LINES);
    unshift (@datas, $value);
    open (LINES, ">$datafile") || die &error(1, "データファイルが開けないので、記録できません。");
    eval 'flock(LINES,2);';
    print LINES @datas;
    eval 'flock(LINES,8);';
    close (LINES);

-----------------------------------------------

どなたか、この状態を修正する方法を教えて下さいませ。
初心者的質問で申し訳ありませんが、宜しくお願い致します。


1:[回答] Iwa [URL] [2005/06/27 04:28 ]

ヒント
$#datasで配列@datasの大きさを指定しているつもりでしょうが、実際に@datasにファイルの中身を入れているのはその後になってますよね。
これじゃあ1、2、3、4、・・・となってくれるわけがありません。


2:[質問] あやか [2005/06/27 08:32 ]

>Iwa様
早速の回答ありがとうございました。
お恥ずかしながら、元々が余所から頂いて来たスクリプトなので、
記述の順番もよく分かっていません。
せっかく回答して頂いたのに申し訳ありませんが、もう少し詳しい
ヒントを頂けると嬉しいです。

Perlの本も購入しましたが、まだまだ勉強不足ですね。(泣)


3:[回答] Iwa [URL] [2005/06/27 22:17 ]

unless(-f $datafile){open(FH, "> $datafile"); close(FH);}

open(LINES, "+< $datafile") || &error(1, "データファイルが開けないので、記録できません。");
@datas = <LINES>;
$no = (split(/\t/,$datas[0]))[0];
$no = (!$no) ? 1 : $no+1;
$value = join("\t",($no,$FORM{'namae'},$FORM{'sex'},$username,$^T,$FORM{'q1'},$FORM{'q2'},$FORM{'q3'},$FORM{'q4'},$FORM{'q5'})) . "\n";
unshift(@datas,$value);
truncate(LINES,0);
seek(LINES,0,0);
print LINES @datas;
close(LINES);

先のは間違い。
$#datasすると、配列の最後の添え字が返ります。
配列の中身は、大きいものから小さいものにかけて並んでいますから、必ず$#datasは最後の配列要素つまり1とかかれたはじめの要素になります。
なので、1に1を足したら2で、かつ毎回この1の要素を指しているので、いつまでたっても2のままなわけです。


ひとつ忘れてましたが、die するとその場でスクリプトの処理が終了します。(よってerrorというサブルーチンは動かない)
なので、「データファイルが開けないので〜」というメッセージを出したいならdieしてはいけません。


4:[完了] あやか [2005/06/28 00:06 ]

>Iwa様

とても丁寧な回答、本当にありがとうございました。
教えて下さった方法で文法チェックをかけたらエラーが出てしまい
ましたので、↓のように記述したら解決しました。

    unless(-f $datafile){open(FH, "> $datafile"); close(FH);}
    open(LINES, "+< $datafile") || &error(1, "データファイルが開けないので、記録できません。");
    @datas = <LINES>;
    $no = (split(/\t/,$datas[0]))[0];
    $no = (!$no) ? 1 : $no+1;
    my $value = "$no\t$FORM{'namae'}\t$FORM{'sex'}\t$username\t$^T\t$FORM{'q1'}\t$FORM{'q2'}\t$FORM{'q3'}\t$FORM{'q4'}\t$FORM{'q5'}\n";
    unshift(@datas,$value);
    truncate(LINES,0);
    seek(LINES,0,0);
    print LINES @datas;
    close(LINES);

頭痛のタネが解消したのはIwa様のおかげです。
本当にありがとうございました。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World