都道府県穴埋めゲーム

local($data) = @_;
$data =~ s/\n$//;
($name,$lv,$hp,$gp) = split(/,/,$data);
}
で、データを読み込んで、
<tr><td>$name</td><td>$lv</td><td>$hp</td><td>$gp</td></tr>\n";

という形で行ごとに出力しているんですが、これをきちんと並び替えて$lvの順に並ぶランキングリストを作りたいんです。

色々試してみたんですが、記録された順番のまま出力されてきたり、全然表示されなかったりでうまくいきません。

できるだけ初心者でも分かりやすい方法を教えてください。
よろしくお願いします。

A 回答 (1件)

 こういうのはどうでしょう?


 @data には、

  $data[0] = "www,2,www,www";
  $data[1] = "www,1,www,www";
  $data[2] = "www,4,www,www";
  $data[3] = "www,3,www,www";

 というデータが入っているものとし、

foreach ( @data ) {
  ($name,$lv,$hp,$gp) = split(/,/,$_);
  $_ = "$lv,$name,$hp,$gp";
}
@data = sort { $a <=> $b } @data;
foreach ( @data ) {
  ($lv,$name,$hp,$gp) = split(/,/,$_);
  $_ = "$name,$lv,$hp,$gp";
}

 あまりスマートなロジックじゃないですけど、これで $lv 順になります。
 昇順と降順を入れ替えるときは sort 関数の $a と $b を逆にします。
(見栄えのためにタブ文字を全角スペースにしてますので、コピーペーストするときはご注意を)
    • good
    • 0
この回答へのお礼

早速の御指導ありがとうございます。
教えて頂いたスクリプトを利用して、

  $data[0] = "www,2,www,www";
  $data[1] = "www,1,www,www";
  $data[2] = "www,4,www,www";
  $data[3] = "www,3,www,www";

の内容表示を、

local($data) = @_;
$data =~ s/\n$//;
foreach ( @data ) {
  ($name,$lv,$hp,$gp) = split(/,/,$_);
  $_ = "$lv,$name,$hp,$gp";
}
@data = sort { $a <=> $b } @data;
foreach ( @data ) {
  ($lv,$name,$hp,$gp) = split(/,/,$_);
  $_ = "$name,$lv,$hp,$gp";
}

としたんですが、何故か『$data[2]にはいってるデータ内容』だけが、$data[0]~$data[3] の分だけ出力されてしまいました・・・。
うまく説明できないんですが、
  $data[2] = "www,4,www,www";
  $data[3] = "www,3,www,www";
  $data[0] = "www,2,www,www";
  $data[1] = "www,1,www,www";
の順に出すはずが、出力されたのが
$data[2] = "www,4,www,www"
$data[2] = "www,4,www,www"
$data[2] = "www,4,www,www"
$data[2] = "www,4,www,www"
になってしまったんです。
どこを修正したらよいのか教えて頂けないでしょうか?
よろしくお願いします。

お礼日時:2002/03/23 21:22

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


おすすめ情報