- 締切済み
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の使いかたがおかしかったり とかも指摘頂けると幸いです。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- amanojaku1
- ベストアンサー率54% (265/488)
$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;
- amanojaku1
- ベストアンサー率54% (265/488)
>>for($A=0;$A<=20;$A++;){ >↑これは何のためのforループですか? ああ、「$DATA[$A]」で使ってますね。
- amanojaku1
- ベストアンサー率54% (265/488)
>for($A=0;$A<=20;$A++;){ ↑これは何のためのforループですか?
- hok212
- ベストアンサー率66% (100/150)
こんばんわ。 3列目の合計を配列に入れてしまえば、次の回答で出来ると思いますがいかがでしょう。 https://okwave.jp/qa/q9382691.html 上記の回答で不明な点があればその旨を記載してください。