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の国へようこそ」などもってのほか。
これらは持っていません(よかったよかった)。
書いていただいたプログラムを試しているのですが
まだ、いまいち自分に理解力が無いため、試行錯誤しています。
こんな私に、いろいろと手ほどきをしていただき、本当にありがとうございます。
[上に]
[前に]
[次に]