sort関数について

数値で昇順にしたい場合、比較のためのコードの断片を書いたけど、それに関して。

このコードブロックは、引数なのか?

引数なら普通カンマで区切るよねー、ということで書いてみた。http://ideone.com/ndKeH

my @nums = (31, 41, 59, 26, 53, 58, 9, 93);
my @sorted = sort({ $a <=> $b }, @nums);
print join(', ', @sorted), "\n";

カンマで区切ったらダメらしい。引数じゃないのかな...?

なんで$aと$bじゃなきゃダメなの?

勝手に変えてみた。http://ideone.com/fhIFB

my @nums = (31, 41, 59, 26, 53, 58, 9, 93);
my @sorted = sort { $lhs <=> $rhs } @nums;
print join(', ', @sorted), "\n";

じゃあ、既に$aと$bという変数が存在したら、どうなるんだろ。http://ideone.com/7Cgwc

my $a = 'foo';
my $b = 'bar';
my @nums = (31, 41, 59, 26, 53, 58, 9, 93);
my @sorted = sort { $a <=> $b } @nums;
print "\@sorted = (", join(', ', @sorted), "), \$a = $a, \$b = $b\n";

おこられた (´・ω・`)

てか一体 { $a <=> $b } は何者なの?

最近は関数をファーストクラスのオブジェクトとして扱える言語がたくさんある。そういう言語では、ソートのための関数が比較のための関数を受け取る(つまり高階関数として)ように実装されている事が多い。これは無名関数的なオブジェクトなのかな?
確かめる術は今のところ持たない...。