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

CGIプログラムの件でご質問したいのですが、datファイルのレース結果をCGIプログラムを使ってHTMLに表示したいと思っています。
datファイルの内容は、レースの結果が1位から順に10位くらいまでA,B,Cクラス混合で並んでいます。

1,Aクラス,青チーム,12:50,山本太郎
2,Cクラス,赤チーム,11:23,山田花子
3,Bクラス,黄チーム,10:52,松本典子
4,Aクラス,桃チーム,10:32,加藤茶子

それをCGIプログラムによって、各クラスごとに表示します。
CGIのプログラムの内容は、

open (FILE, "<data.dat") || die "File 'data.dat' Open Error.";
@all = <FILE>;
close(FILE);
foreach (@all){
($data1, $data2, $data3, $data4,$data5) = split(/,/, $_);
next unless ($data2 eq "A");
&one_data;
}

sub one_data {
print << "END_OF_ONE";
<P>$data1位<BR>
$data2<BR>
$data3<BR>
$data4<BR>
$data5<BR>
</P>
END_OF_ONE
}
1;

だいたいこんな感じですが、この各クラスごとに表示したHTMLのファイルの順位のところが、もとのdatファイルの順位になってしますので、それを1位から順にクラス別の順位として表示したいのです。
それにはどのようにしたらよいでしょうか?
すみません、あまりperlの言語の知識がないもので。。

A 回答 (1件)

私の場合、sortを使います。


例えば、

a,100
b,300
c,200

というデータがあって、後ろの番号順にしたい場合は、

foreach (@all){
chop;←改行を消す
($data1, $data2) = split(/,/);←$_は無くてもOK
$data{$data2} = $_;
}

foreach (sort $a <=> $b keys(%data)){
print "$_\n";
}

とすれば、

a,100
c,200
b,300

となると思います。

b,300
c,200
a,100

にしたい場合は、

foreach (sort $b <=> $a keys(%data)){

にします。(もしかしたら、逆かも・・・)

ちなみに、文字をソートしたい場合は、<=>をcmpにすればできます。
    • good
    • 0
この回答へのお礼

ありがとうございました。
でも、結局、
# クラス毎順位カウンタ
$Rank = 1 ;

# すべてのデータについて繰り返す
foreach (@all){

# 1行の文字列をコロンを目印にして項目に分割する
($data1, $data2, $data3, $data4,$data5, $data6, $data7, $data8, $data9) = split(/,/, $_);

next unless ($data3 eq "A");

# 1件分のデータを表示するサブルーチン
&one_data;

# カウントダウン(順位を下げる)
$Rank++ ;
}
というふうにしました。
ご協力ありがとうございました。

お礼日時:2001/09/17 13:47

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