こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Perl 順位 複数のLoop

合計の順位を求めたいのですが、
詰まってしまいました。

どうかご教示お願い致しますm(_ _)m

まず下記のように
Class1
1.txt の 3列目の合計 65.2
2.txt の 3列目の合計 80.5
3.txt の 3列目の合計 70
4.txt の 3列目の合計 92.6
5.txt の 3列目の合計 76.1
6.txt の 3列目の合計 85.2

このように6つのファイルがあり

その3列目の合計は求めるとこまできました。

6つのファイルを元に順位をつけて
HTMLのテーブル化を試みているのです。

for($Class=1;$Class<=5;$Class++){

open(F, "<","Class$Class.txt");
flock(F, 1);
@CL = <F>;
close F;

for($KakuFile=1;$KakuFile<=$#CL;$KakuFile++;){

open(F, "<","KakuFile/$KakuFile.txt");
flock(F, 1);
@DATA = <F>;
close F;

for($A=0;$A<=20;$A++;){
my $Data = $DATA[$A];
chomp($Data);
my ($Name,$No,$Sum,...etc) = split(/,/, $Data);

$SumDex = "Sumの合計を求める式";
#1.txt の場合 65.2
#2.txt の場合 80.5
#3.txt の場合 70


$RANK = "ここにどのような記述が入りますか?";
#1.txt の場合 6
#2.txt の場合 3
#3.txt の場合 5
#4.txt の場合 1
#5.txt の場合 4
#6.txt の場合 2

$HTML[$A] ="

~略
<td>$Name</td>
<td>$SumDex</td>
<td>$RANK</td>

~略

";

@HTML , $HTML[$A];
open(F, ">:utf8","RankHtml.txt") or die("error :$!");
flock(F, 2);
print F "@HTML\n";
close F;
}

}

}
最終的な結果としては、
<td>1.txtのName</td>
<td>65.2</td>
<td>6</td>

<td>2.txtのName</td>
<td>80.5</td>
<td>3</td>

<td>3.txtのName</td>
<td>70</td>
<td>5</td>

<td>4.txtのName</td>
<td>92.6</td>
<td>1</td>

<td>5.txtのName</td>
<td>76.1</td>
<td>4</td>

<td>6.txtのName</td>
<td>85.2</td>
<td>2</td>

このような結果がほしいです。
実際やりたいことはこのようなことなのですが、
どうすればいいのかわからず説明も、おかしなとこがあるかもしれません;;

どうかお助け願いますm(_ _)m
また、初心者で、Loopの使いかたがおかしかったり
とかも指摘頂けると幸いです。

投稿日時 - 2017-10-11 12:56:09

QNo.9384530

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

$SumDexを「@SumDexList」と言う配列にゼロ番目の要素から順に入れたとします。

下記は とりあえず別ファイル「TEST001.cgi」とかを作ってコピペして実行してみて下さい。
同じ数字が存在する場合、同じ数字で順位が違う事になります。
下記で実際に同じ数字を設定してみて下さい。



#! C:\Perl\bin\perl
# /usr/bin/perl
print "Content-type: text/html\n\n";
print <<"HTML_HEAD";
<html>
<head>
<title>TEST</title>
</head>
<body>
HTML_HEAD

(@SumDexList) = (
65.2,
80.5,
70,
92.6,
76.1,
85.2
);

for($i=0; $i<=$#SumDexList; $i++){
$SumDexList2[$i] .= $SumDexList[$i] ."\n".$i;
# ↑通常 文字として使われない文字「\n」を区切り文字として使っている。
}

(@SumDexList3) = sort{$b<=>$a} @SumDexList2;
# ↑条件を{$b<=>$a}とした場合、降順ソートになる。

for($i=0; $i<=$#SumDexList3; $i++){
($SD, $index) = split(/\n/,$SumDexList3[$i]);
$Rank[$index] = $i+1;
}

for($i=0; $i<=$#SumDexList; $i++){
print '$Rank[$i] ='.$Rank[$i] ."<br>\n";
print '$SumDexList[$i]='.$SumDexList[$i]."<br>\n";
print "<br>\n";
}

print <<"HTML_END";
</body>
</html>
HTML_END

exit;

投稿日時 - 2017-10-25 20:52:41

ANo.3

>>for($A=0;$A<=20;$A++;){

>↑これは何のためのforループですか?

ああ、「$DATA[$A]」で使ってますね。

投稿日時 - 2017-10-25 18:30:55

ANo.2

>for($A=0;$A<=20;$A++;){

↑これは何のためのforループですか?

投稿日時 - 2017-10-25 18:23:01

ANo.1

こんばんわ。
3列目の合計を配列に入れてしまえば、次の回答で出来ると思いますがいかがでしょう。
https://okwave.jp/qa/q9382691.html

上記の回答で不明な点があればその旨を記載してください。

投稿日時 - 2017-10-12 22:34:46