CGIで順位の比較し、エラーを返すには?

[上に] [前に] [次に]
がんま [E-Mail] 1998/11/01(日) 14:17:23
また、私事の質問ですが、

未だ完成しないランキング表を作っているのですが
例えば1位から10位まで

1,59,999,NAME,

の形で、保存ファイルにデータを持たせていたとします。

これに新規で、「2,00,000,NAME」が入ってきた場合
当然、10位以内に入らない訳ですから、保存されないはずなのですが
10位にデータが入ってしまいます。

これを防ぐために、比較させるプログラムなどを自分なりに組んでみたものの
どれもうまくいきません。 場合によっては保存データが消える始末です。

エラーが返り、データが保存されないようにしたいわけです。

何か、良い方法がありましたら、教えて下さい。
よろしくお願いします。

B-Cus 1998/11/01(日) 14:36:05
そういう場合、自分で書いたプログラムから必要な部分を
抜き出して、「こう書いたのですがどこがおかしいでしょう」
とするのが一番いいと思いません?

> 1,59,999,NAME
> 2,00,000,NAME

あと、これじゃあどの項について順位付けをするのか
わかりません。1? 1,59? 1,59,999?

がんま [E-Mail] 1998/11/01(日) 20:21:50
相変わらず変な質問の仕方をしてしまい、すみません。
駄目ですね、こんなことでは・・・。

長くなりますが、書かせていただきます。

まず、フォームから入力された値を、それぞれの変数に入れチェックをし
以前、教えていただいたプログラムを使い「file.dat」へ、入力された値を比較し
昇順でデータを入れ替え、保存されています。


open(IN, './file.dat');
while (<IN>) {
chop;
push(@datas,$_);
splice(@datas,9);
}
close(IN);

push(@datas,"$min,$sec,$msec,$dname,$machin,");

open(OUT, '>./file.dat');
foreach ( sort @datas ) {
print OUT "$_\n";
}
close(OUT);


file.datに保存されるデータの形は

1,59,999,NAME,MACHIN,

と、このようになっています。


このプログラムで、上から5行目の

splice(@datas,9);

を入れて、10位までの形を取っています。

これで実行すると、file.datに、10位(10行分)までのデータが存在していた場合に
新しく書き込まれたデータが、その10位以内に収まらない時、10位(10行目)の
データと書き換わってしまうのです。

file.datのデータ内で1〜10行まであったとして

  9|1,59,999,NAME,MACHIN,
10|2,00,000,NAME,MACHIN,
     (左の「9|」と「10|」は行番号)

10行(10位)まであったとして、これにフォームから入力されたデータが

  3,00,000,NAME,MACHIN,

であれば、11行目に存在するデータとなるので
書き込まれないはずが、

  9|1,59,999,NAME,MACHIN,
10|3,00,000,NAME,MACHIN,

と、入れ替わってしまうのです。

これをどう解決すれば良いのか、いろいろ試しているのですが
一向に改善しません。

今残っている組み方を、はじめに書いたプログラムに当てはめると

close(IN);

push(@datas,"$min,$sec,$msec,$dname,$machin,");

if (@datas < @datas[0..2]) {
$text = "ランキングに登録出来ません";
&error_html;
}

open(OUT, '>./fzr.dat');
foreach ( sort @datas ) {

この「push」と「open(OUT」の間に、if文で()内は自分の解釈で
書いてはみたのですが、これを入れると、どうフォームからデータを
入れても、「if文」を実行してしまいます。

この「if」も、いい加減な書き方をしていると思うのですが
正直、未だに組み方を理解出来ないので、このような始末になっています。

長くなってしまいましたが、これでお解りいただけたでしょうか?

いろいろとご面倒おかけして、本当にすみません。

Aurai [E-Mail] 1998/11/01(日) 21:10:05
splice(@datas,9);
ではなく
splice(@datas,10);
だと思います

がんま [E-Mail] 1998/11/02(月) 00:54:19
Auraiさん、はじめまして!

splice(@datas,10);

これにしても、0から数えて、10から11に変えているだけなので
結果的に「最終行を入れ替えてしまう」ことには、変わらない訳です。

今もいろいろやっているんですが、どうもうまく行かず
表示させるCGIで何とかしようかと思っているのですが、これもまだうまく行かず・・・。

プログラムって難しい・・・しみじみそう感じる今日この頃です。

B-Cus 1998/11/02(月) 01:21:24
えっと、こう言っては失礼ですが、根本的にあまりよく
わかってらっしゃらないようです。

以下のプログラムが参考になりますでしょうか。

#!/usr/local/bin/perl

@data = ("01","02","03","04","05","06","07","08","09","10"); # 元データ
$add_data = "03"; # 追加したいデータ

push(@data,$add_data);
@sorted_data = sort @data;

print "last number = $sorted_data[$#sorted_data]\n";

if ( $add_data eq $sorted_data[$#sorted_data] ){
    print "you cannot add data($add_data).\n"; # 成功
} else {
    print "adding data successfully.\n"; # 失敗
}

pop(@sorted_data); # 最後の1つを削除

foreach ( @sorted_data ){ # 出力
    print "$_ ";
}
print "\n";

mo [E-Mail] 1998/11/02(月) 01:35:45
例えば、こんな風にするのかな?

open(IN, "file.dat");
@data = map { chomp; [split /,/] } <IN>;
close(IN);
@data = sort { $a->[0] <=> $b->[0] || # min
               $a->[1] <=> $b->[1] || # sec
               $a->[2] <=> $b->[2] }  # msec
@data, [$min, $sec, $msec, $dname, $machin];
pop(@data) if @data > 10;
open(OUT, ">file.dat");
for(@data)
{
    print OUT join(',', @$_), "\n";
}
close(OUT);

がんま [E-Mail] 1998/11/02(月) 02:12:08
B-Cusさん、moさん、ありがとうございます。
その書いていただいたものを使ってみて、後日ここに返答します。

ご指摘の通り、実際、プログラムの命令が「どう動いて」「どう作用」しているのか
殆ど理解していないのが、正直なところです。

とほほさんの提供されているマニュアルや書籍などを、読んではいるのですが
理解出来ないのが大半です。

今、この書かれたプログラムを見ても、何がどうなっているのか解りません。
また、このようなオリジナルの組み方が、どうして出来るのか不思議に感じでしまいます。

B-Cus 1998/11/02(月) 02:48:07

まず、よ〜く考えましょう。アルゴリズムとしては

1. これまでのデータ(10件のはず)を配列に読み込む
2. 配列に新データを追加
3. ソートして1〜10番目(=11番目以外)を出力

でいいはずです。ところが、がんまさんのプログラムは

1. これまでのデータを配列に読み込みつつ、9(10)個目以降を削除
2. 配列に新データを追加
3. ソートして出力

となってます。これではうまくいかないですよね。

あと、最初の数字がminute(ですよね?)ということで、
$minが二桁になったら うまくソートされないと思いますが、
そこらへんは大丈夫でしょうか。
# $minが一桁しかとらないならそれでいいんですが。

moさんのような読み込み方法を取るとか、
 01,59,999,NAME,MACHINE,
などと固定長で扱う、などの方法がありますけど。


> とほほさんの提供されているマニュアルや書籍などを、読んではいるのですが

ちなみにどんな本を持ってらっしゃいます?

僕としては「Perlプログラミング」(旧ラクダ本、赤いやつ)が
一番おすすめなんですが。

# 初心者に「プログラミングPerl」(新ラクダ本、青いやつ)は
# お勧めしません。「新perlの国へようこそ」などもってのほか。

がんま [E-Mail] 1998/11/02(月) 21:53:07
> ちなみにどんな本を持ってらっしゃいます?
> 僕としては「Perlプログラミング」(旧ラクダ本、赤いやつ)が
> 一番おすすめなんですが。

いろいろあります(苦笑)
「Perl で作るCGI入門-基礎編」 「初めてのPerl:Learning Perl」
「CGIプログラミング入門(SHOEISHA)」などです。

> # 初心者に「プログラミングPerl」(新ラクダ本、青いやつ)は
> # お勧めしません。「新perlの国へようこそ」などもってのほか。

これらは持っていません(よかったよかった)。

書いていただいたプログラムを試しているのですが
まだ、いまいち自分に理解力が無いため、試行錯誤しています。

こんな私に、いろいろと手ほどきをしていただき、本当にありがとうございます。

[上に] [前に] [次に]