1. テスト用スクリプト
以下は実際に使ったテストスクリプト。testsort.pl
説明用と出力時のコメントを追加したので、参考に
#!/usr/bin/perl
# $Id: $
# testsort.pl
#==========================================================================#
use strict ;
my @hr ; # 配列
my $ub ; # 馬番
my $su ; # 数値
# ある馬番の数値を取り出すときは、$hr[$ub]
# つまり、$hr[$ub] = $su の形。etc. $hr[3] = 6 ;
# 例えば、12頭のデータとして以下があったとする。
# 一応最初の項は、お約束で $hr[0] 。
# @hr = ( '', 5, 10, 6, 8, 9, 7, 0, 10, 8, 3, 5, 4 ) ;
# あるいは
@hr[ 1..12 ] = ( 5, 10, 6, 8, 9, 7, 0, 10, 8, 3, 5, 4 ) ;
# この数値で順序付けしたいことがある。
# そのまま昇順でソートすると
my @new = sort { $a <=> $b } @hr ;
print join ',', @hr ; # 元の配列
print "\n" ;
print join ',', @new ; # ソートされた配列
print "\n" ;
# H:\Test>testsort.pl
# ,5,10,6,8,9,7,0,10,8,3,5,4
# ,0,3,4,5,5,6,7,8,8,9,10,10
# 順序付けに 0 は必要ないときは外す
# grep { $_ > 0 } と同じ結果
my @grepnew = grep { $_ } @hr ;
print join ',', @grepnew ;
print "\n" ;
# 5,10,6,8,9,7,10,8,3,5,4
# -------------------------------------------
# ということで、複合形で以下のように書ける
my @sorted = sort { $a <=> $b }
grep { $_ } @hr ;
print join ',', @sorted ;
print "\n" ;
# 3,4,5,5,6,7,8,8,9,10,10
# 一応、順序どおりに並んだ。# 折角ここまで分かったのなら、
# $jun[$ub] で馬番ごとに順位を出したい。
# ハッシュ( %kj )にその数値が何番目かをメモさせる。
# etc. $kj{ '5' } = 3
my $i ;
my @jun ;
my %kj ;
my $num = 1 ;
my $non = 0 ; # 存在しないはずの数値をセット
for $i ( @sorted ) {
if ( $i != $non ) {
$kj{$i} = $num ;
$non = $i ;
}
$num++ ;
}
# 最初の配列と比較しながら、@jun という配列を作る。
for $i ( 1..$#hr ) {
next if $hr[$i] == 0 ;
$jun[$i] = $kj{ $hr[$i] } ;
}
print join ',', @jun ;
print "\n" ;
# ,3,10,5,7,9,6,,10,7,1,3,2
# これで、例えば馬番 9 が何番目の数値を持っているかがワカル
print $jun[9], "番目だ\n" ;
# 7番目だ
__END__
数値は 0 から、というのがプログラム言語。配列は 0 が起点。
存在しないものは数えたくないのが人間。指折って数えるときも 1、2、3。
他は、応用問題。もっとうまい書き方がキットある。