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の言語の知識がないもので。。

このQ&Aに関連する最新のQ&A

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で質問しましょう!

このQ&Aと関連する良く見られている質問

Q「<」や「>」を「&lt;」や「&gt;」に変換させなかったらどうなるのでしょうか?

今CGIをカスタマイズしています。
書き込みフォームでタグを使いたいのですが、タグをそのまま書き込むとHTML出力時に、&lt;や&gt;に変換されて表示されてしまいます。
なのでその変換する処理を無くしたいと思っているのですが、その処理を無くすとどういう不具合があるのでしょうか?無くそうと思っているのは下記のような箇所です。
~ s/</&lt;/g;
~ s/>/&gt;/g;
(わざと全角で書いてます)
書き込みデータにはdatファイルを使っています。

Aベストアンサー

念のため・・・
No.4は表示するときではなく、
>formからのデータ取得時にタグを解析して<b>や<font color="~">以外のタグは変換する
方法のつもりで書きました
※<>→&lt;&gt;変換処理の直後に入れる。

いちいち<font color="~">と記述するのは大変なので、
<色=red>赤文字</色>などと覚えやすいタグにするのも親切でいいかも

#<色=red>~</色>を<font color=red>~</font>に
=~ s/&lt;(色)(.*?)&gt;(.*?)&lt;\/\1&gt;/<font color$2>$3<\/font>/gi;

Q@town = ("Aタウン","Bタウン","Cタウン");

@town = ("Aタウン","Bタウン","Cタウン");


上のような配列の値を、テキストファイルに保存して読み込みたいのですが、どうしたらよいのか分かりません。

誰か詳しい方、よろしくお願いします。

Aベストアンサー

use Storable qw(nstore retrieve);

my @towns = qw(TownA TownB TownC);
my $file = 'serialize.dat';
nstore( \@towns, $file ) || die "$file:$!";
@towns = ();

my $towns_ref = retrieve($file) || die "$file:$!";
print $_, $/ for @{$towns_ref};

Q$abc == 0;

フリ-CGIを使ってCGIの勉強中です、
今使っているフリ-CGI掲示板の中に下記のコ-ドがあります、
$abc == 0;

$abc = 0; の間違いだと思うのですが別の意味があるのですか。

Aベストアンサー

こんにちは。

cgiの勉強中ということですが。
質問される前に本などごらんになりましたか??
どういったことから間違いだと思うのでしょうか??

$abc == 0;
は間違いではありません。
==と=の違いをご存知ですか??

$abc == 0;
は「$abcが0である」
$abc = 0;
は「$abcに0を代入する」
ということです。

参考URL:http://tohoho.wakusei.ne.jp/www.htm

Q変数名を $_ にしたくない

&xxx("AA","BB");
sub xxx{print @_}

↑のソースで sub に @_ という名前の配列に
引数を渡すことができたけど、@z という名前の配列に
引数を渡したい場合はどういうソースになるんですか?

{print @_} は {print @_;} のようにセミコロンを
書いてあるのが普通だと思うけど、このような場合は
セミコロンを省略して問題があったりしますか?


下の foreach についても $_ というのを $z にするには
どういうソースにしたらいいか教えてください。

$xx{"A"}= "aaa";
$xx{"B"}= "bbb";
$xx{"C"}= "ccc";
foreach(keys %xx){print "添え字は$_で値は$xx{$_}<br>"}

Aベストアンサー

こんにちは。

> @z という名前の配列に
> 引数を渡したい場合はどういうソースになるんですか?

単に sub xxx の中で my (@z) を宣言し、それに @_ をコピーするのではダメですか?
つまり、次のようになります。
  sub xxx
  {
    my (@z) = @_;
    print @z;
  }

> セミコロンを省略して問題があったりしますか?

セミコロンが無くても動くし perl -cw でも文句は言われませんが、習慣として付けておくことを強くお勧めします。
たった1文字のタイプを節約することが余程重要な特殊事情でもなければ…
perl では、「文はセミコロンで終わる」のが基本文法だからであり、動くからといって変な省略をすると、あとでもっとコードが複雑になった時に必ず混乱を来します。

foreach の件は、単に foreach $z (keys %xx) { } として、{ } の中の $_ を $z にすれば動きます。

QCGIで<br>の表記の仕方

タイトルの通りです。
CGIを作ろうとしているのですが、<br>を表示したいと思っています。
どう表記したら良いのでしょう。
素人的に¥”<br¥”>としましたがうまく行かなかったです。
よろしくお願いします。

Aベストアンサー

もしかして、ブラウザで見たときに「<br>」と見えるようにしたい、ということでしょうか?

だとすると、CGI や perl の問題ではなく HTML の範囲ですね。

print "&lt;br&gt;";

でいけるのでは?


このカテゴリの人気Q&Aランキング

おすすめ情報