# 順位のサブルーチン
  
# 得点データ
   @ten = qw (85 65 85 55 60 35 65 60 100 35 60 100) ;
  
# 順位の表示
   &jun_ban ;
   for (@ten)
      {print "$_ → $jun{$_} \n"}
  
# 順位のサブルーチン
   sub jun_ban
  {
   @ban = (1..@ten) ;
   @ten = sort {$b <=> $a} @ten ;
   $jun{$ten[0]} = 1 ;
   for $i (1..@ten)
      {
       $ban[$i] = $ban[$i-1] if $ten[$i] == $ten[$i-1] ;
       $jun{$ten[$i]} = $ban[$i]
      }
  }
  
# kojin_hyo.pl
# 成績個人票の出力
  
# 成績データファイル
   @class = qw (1年1組 1年2組 1年3組) ;
  
# 合計点と平均点の参照
   for (@class)
  {
   open F, "$_−1中間.csv" ;
   for (<F>)
      {
       push @ten, (split /,/)[8] if /^[1-3]/ ;
       push @hei, [(split /,/)[3..9]] if/^平均/
      }
  }
  
# 学年順位の決定
   &jun_ban ;
  
# 個人票の出力
   for $kumi (@class)
  {
   open F, "$kumi−1中間.csv" ;
   open W, ">$kumi-個人票.txt" ;
   for (<F>)
      {
       chomp ;
       if (/^[1-3]/) {@d = split /,/ ; &kojin}
      }
   }
  
# 順位のサブルーチン
   sub jun_ban
  {
   @ban = (1..@ten) ;
   @ten = sort {$b <=> $a} @ten ;
   $jun{$ten[0]} = 1 ;
   for $i (1..@ten)
      {
       $ban[$i] = $ban[$i-1] if $ten[$i] == $ten[$i-1] ;
       $jun{$ten[$i]} = $ban[$i]
      }
  }
# 個人票のサブルーチン
   sub kojin
  {
print W <<EOF;
   <<1学期中間考査結果>>
                                       @d[0..1]    $d[2]
  
   英語:$d[3] / $hei[0][0]  数学:$d[4] / $hei[0][1]  国語:$d[5] / $hei[0][2]
  
   理科:$d[6] / $hei[0][3]  社会:$d[7] / $hei[0][4]  平均:$d[9]/ $hei[0][6]
  
   欠席:$d[10]  遅刻/早退:$d[11]    クラス順位:$d[12]  学年順位:$jun{$d[8]}
\n
EOF
  }
  
例:「文字列つきのソート」
  
@ten = qw (65,青山,社会 352,合計点 8,中間順位) ;
@ten = sort {$a <=> $b} @ten ;
for (@ten) {print "$_ \n"}
  
# juni_hyo.pl
# 順位表の出力
  
# 成績データファイル
   @class = qw (1年1組 1年2組 1年3組) ;
  
# 学年順位の決定
    for (@class)
   {
    open F, "$_−1中間.csv" ;
    for (<F>) {push @ten, (split /,/)[8] if /^[1-3]/}
   }
   &jun_ban ;
  
# 順位から始まるデータの作成
   for (@class)
  {
   open F, "$_−1中間.csv" ;
   for (<F>)
      {
       if (/^[1-3]/)
      {
       @row = split /,/ ;
       $k = sprintf "%3d", $jun{$row[8]} ;
       push @sei, "$k. @row[0..2] (平均 $row[9])"
      }}
  }
  
# 成績順に並び替えて出力
   open W, ">順位表.txt" ;
   @sei = sort {$a <=> $b} @sei ;
   for (0..9) {print W "$sei[$_] \n"}  
  
# 順位のサブルーチン
   sub jun_ban
  {
   @ban = (1..@ten) ;
   @ten = sort {$b <=> $a} @ten ;
   $jun{$ten[0]} = 1 ;
   for $i (1..@ten)
      {
       $ban[$i] = $ban[$i-1] if $ten[$i] == $ten[$i-1] ;
       $jun{$ten[$i]} = $ban[$i]
      }
  }
  
# kojin_data.pl
# 個人データの表示
  
# 成績データファイル
   @class = qw (1年1組 1年2組 1年3組) ;
  
# 学年順位の決定
   for (@class)
  {
   open F, "../Data/$_−1中間.csv" ;
   for (<F>) {push @ten, (split /,/)[8] if /^[1-3]/}
  }
   &jun_ban ;
  
   while(1)
  {
# 検索者入力
   print "\n 番号/キーワード(Enter:終了):" ;
   $key = <STDIN> ;
   last if $key eq "\n" ;
   chomp $key ;
   &keyword ;
  
# 個人データの取得
   for (@class)
  {
   open F, "../Data/$_−1中間.csv" ;
   for (<F>)
      {if (/^$num/) {chomp ; @d = split /,/ ; last}}
  }
  
# 結果の出力
   print <<EOF;
  
   ** @d[0..1]  $d[2] **
                                    
   英語($d[3])  数学($d[4])  国語($d[5])  理科($d[6])  社会($d[7])
  
   平均($d[9])  欠席($d[10])  遅刻/早退($d[11])
  
   クラス順位($d[12])  学年順位($jun{$d[8]})
EOF
}
  
# キーワード検索のサブルーチン
   sub keyword
  {
   open F, "../Data/名前99年度.csv" ;
   print "\n" ;
   undef $k, undef @match ;
   for (<F>)
      {
       if (/$key/i)
      {
       @hit = (split /,/)[0..2] ;
       push @match, [@hit] ;
       print " ", ++$k, ". @hit \n"
      }}
       if ($k > 0)
         {
          print "\n 何番(Enter:1番):" ;
          $nn = <STDIN> ;
          $nn = 1 if $nn eq "\n" ;
          $num = $match[$nn-1][0] ;
         }
       else {print " 該当者なし \n" ; redo}
  }
  
# 順位のサブルーチン
   sub jun_ban
  {
   @ban = (1..@ten) ;
   @ten = sort {$b <=> $a} @ten ;
   $jun{$ten[0]} = 1 ;
   for $i (1..@ten)
      {
       $ban[$i] = $ban[$i-1] if $ten[$i] == $ten[$i-1] ;
       $jun{$ten[$i]} = $ban[$i]
      }
  }